diff --git a/Netdisco/bin/netdisco-daemon-fg b/Netdisco/bin/netdisco-daemon-fg index 41446ef4..d6dc1dd4 100755 --- a/Netdisco/bin/netdisco-daemon-fg +++ b/Netdisco/bin/netdisco-daemon-fg @@ -33,7 +33,7 @@ mkdir $tmp_dir if ! -d $tmp_dir; my $mce = MCE->new( spawn_delay => 0.15, - job_delay => 0.15, + job_delay => 1.15, tmp_dir => $tmp_dir, user_func => sub { $_[0]->worker_body }, on_post_exit => \&restart_worker, diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Scheduler.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Scheduler.pm index 5cc05923..0c341de7 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Scheduler.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Scheduler.pm @@ -12,6 +12,7 @@ use namespace::clean; my $jobactions = { map {$_ => undef} qw/ / +# saveconfigs # discoverall # refresh # macwalk @@ -31,11 +32,14 @@ sub worker_begin { my $config = setting('housekeeping')->{$a}; # accept either single crontab format, or individual time fields - my $cron = Algorithm::Cron->new(%{ - ref {} eq ref $config->{when} - ? $config->{when} - : {crontab => $config->{when}} - }); + my $cron = Algorithm::Cron->new( + base => 'local', + %{ + (ref {} eq ref $config->{when}) + ? $config->{when} + : {crontab => $config->{when}} + } + ); $jobactions->{$a} = $config; $jobactions->{$a}->{when} = $cron; @@ -49,10 +53,11 @@ sub worker_body { while (1) { # sleep until some point in the next minute my $naptime = 60 - (time % 60) + int(rand(45)); - debug "scheduler ($wid): sleeping for $naptime seconds"; + debug "sched ($wid): sleeping for $naptime seconds"; sleep $naptime; - my $win_start = time - (time % 60); + # NB next_time() returns the next *after* win_start + my $win_start = time - (time % 60) - 1; my $win_end = $win_start + 60; # if any job is due, add it to the queue @@ -61,19 +66,24 @@ sub worker_body { my $sched = $jobactions->{$a}; # next occurence of job must be in this minute's window - next unless $sched->{when}->next_time($win_start) < $win_end; + debug sprintf "sched ($wid): $a: win_start: %s, win_end: %s, next: %s", + $win_start, $win_end, $sched->{when}->next_time($win_start); + next unless $sched->{when}->next_time($win_start) <= $win_end; # queue it! # due to a table constraint, this will (intentionally) fail if a # similar job is already queued. try { - debug "scheduler ($wid): queueing $a job"; + debug "sched ($wid): queueing $a job"; schema('netdisco')->resultset('Admin')->create({ action => $a, device => ($sched->{device} || undef), subaction => ($sched->{param} || undef), status => 'queued', }); + } + catch { + debug "sched ($wid): action $a was not queued (dupe?)"; }; } }