try to avoid duplicate execution of scheduled jobs

This commit is contained in:
Oliver Gorwits
2013-05-05 15:34:20 +01:00
parent c6bcaf66c5
commit acb988b6af

View File

@@ -18,14 +18,27 @@ sub refresh {
my ($self, $job) = @_; my ($self, $job) = @_;
my $devices = schema('netdisco')->resultset('Device')->get_column('ip'); my $devices = schema('netdisco')->resultset('Device')->get_column('ip');
my $jobqueue = schema('netdisco')->resultset('Admin');
schema('netdisco')->resultset('Admin')->populate([ 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',
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 {{ map {{
device => $_, device => $_,
action => 'discover', action => 'discover',
status => 'queued', status => 'queued',
}} ($devices->all) }} ($devices->all)
]); ]);
});
return job_done("Queued discover job for all devices"); return job_done("Queued discover job for all devices");
} }
@@ -62,14 +75,27 @@ sub discovernew {
my ($self, $job) = @_; my ($self, $job) = @_;
my $devices = schema('netdisco')->resultset('Device')->get_column('ip'); my $devices = schema('netdisco')->resultset('Device')->get_column('ip');
my $jobqueue = schema('netdisco')->resultset('Admin');
schema('netdisco')->resultset('Admin')->populate([ 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',
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 {{ map {{
device => $_, device => $_,
action => 'discover_neighbors', action => 'discover_neighbors',
status => 'queued', status => 'queued',
}} ($devices->all) }} ($devices->all)
]); ]);
});
return job_done("Queued discover_neighbors job for all devices"); return job_done("Queued discover_neighbors job for all devices");
} }