diff --git a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm index bb1a1887..82515088 100644 --- a/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm +++ b/Netdisco/lib/App/Netdisco/Daemon/Worker/Poller/Device.pm @@ -18,14 +18,27 @@ sub refresh { my ($self, $job) = @_; my $devices = schema('netdisco')->resultset('Device')->get_column('ip'); + my $jobqueue = schema('netdisco')->resultset('Admin'); - schema('netdisco')->resultset('Admin')->populate([ - map {{ - device => $_, + schema('netdisco')->txn_do(sub { + # clean up user submitted jobs older than 1min, + # assuming skew between schedulers' clocks is not greater than 1min + $jobqueue->search({ action => 'discover', status => 'queued', - }} ($devices->all) - ]); + entered => { '<' => \"(now() - interval '1 minute')" }, + })->delete; + + # is scuppered by any user job submitted in last 1min (bad), or + # any similar job from another scheduler (good) + $jobqueue->populate([ + map {{ + device => $_, + action => 'discover', + status => 'queued', + }} ($devices->all) + ]); + }); return job_done("Queued discover job for all devices"); } @@ -62,14 +75,27 @@ sub discovernew { my ($self, $job) = @_; my $devices = schema('netdisco')->resultset('Device')->get_column('ip'); + my $jobqueue = schema('netdisco')->resultset('Admin'); - schema('netdisco')->resultset('Admin')->populate([ - map {{ - device => $_, + schema('netdisco')->txn_do(sub { + # clean up user submitted jobs older than 1min, + # assuming skew between schedulers' clocks is not greater than 1min + $jobqueue->search({ action => 'discover_neighbors', status => 'queued', - }} ($devices->all) - ]); + entered => { '<' => \"(now() - interval '1 minute')" }, + })->delete; + + # is scuppered by any user job submitted in last 1min (bad), or + # any similar job from another scheduler (good) + $jobqueue->populate([ + map {{ + device => $_, + action => 'discover_neighbors', + status => 'queued', + }} ($devices->all) + ]); + }); return job_done("Queued discover_neighbors job for all devices"); }