App-Netdisco
view release on metacpan or search on metacpan
lib/App/Netdisco/JobQueue/PostgreSQL.pm view on Meta::CPAN
package App::Netdisco::JobQueue::PostgreSQL;
use Dancer qw/:moose :syntax :script/;
use Dancer::Plugin::DBIC 'schema';
use App::Netdisco::Util::Device 'get_denied_actions';
use App::Netdisco::Backend::Job;
use App::Netdisco::DB::ExplicitLocking ':modes';
use JSON::PP ();
use Try::Tiny;
use base 'Exporter';
our @EXPORT = ();
our @EXPORT_OK = qw/
jq_warm_thrusters
jq_getsome
jq_locked
jq_queued
jq_lock
jq_defer
jq_complete
jq_log
jq_userlog
jq_insert
jq_delete
/;
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
sub jq_warm_thrusters {
my $rs = schema(vars->{'tenant'})->resultset('DeviceSkip');
schema(vars->{'tenant'})->txn_do(sub {
$rs->search({
backend => setting('workers')->{'BACKEND'},
}, { for => 'update' }, )->update({ actionset => [] });
#Â on backend restart, allow one retry of all devices which have
#Â reached max retry (max_deferrals)
my $deferrals = setting('workers')->{'max_deferrals'} - 1;
$rs->search({
backend => setting('workers')->{'BACKEND'},
device => { '!=' => '255.255.255.255' },
deferrals => { '>' => $deferrals },
}, { for => 'update' }, )->update({ deferrals => $deferrals });
$rs->search({
backend => setting('workers')->{'BACKEND'},
actionset => { -value => [] }, #Â special syntax for matching empty ARRAY
deferrals => 0,
})->delete;
#Â also clean out any previous backend hint
#Â primeskiplist action will then run to recreate it
$rs->search({
backend => setting('workers')->{'BACKEND'},
device => '255.255.255.255',
actionset => { -value => [] }, #Â special syntax for matching empty ARRAY
})->delete;
});
}
sub jq_getsome {
my $num_slots = shift;
return () unless $num_slots and $num_slots > 0;
my $jobs = schema(vars->{'tenant'})->resultset('Admin');
my @returned = ();
my $tasty = schema(vars->{'tenant'})->resultset('Virtual::TastyJobs')
->search(undef,{ bind => [
( run in 0.631 second using v1.01-cache-2.11-cpan-39bf76dae61 )