web jobs are highest prio; make sql cleaner

This commit is contained in:
Oliver Gorwits
2018-02-10 16:33:46 +00:00
parent 3f7e3b0531
commit f71aae75fd
2 changed files with 30 additions and 40 deletions

View File

@@ -10,38 +10,33 @@ __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
__PACKAGE__->table('tasty_jobs'); __PACKAGE__->table('tasty_jobs');
__PACKAGE__->result_source_instance->is_virtual(1); __PACKAGE__->result_source_instance->is_virtual(1);
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL __PACKAGE__->result_source_instance->view_definition(<<ENDSQL
SELECT jobs.*, ds2.deferrals AS num_deferrals WITH my_jobs AS
FROM ( (SELECT admin.* FROM admin
(SELECT me.*, 100 AS job_priority LEFT OUTER JOIN device_skip ds
FROM admin me ON (ds.backend = ? AND admin.device = ds.device
WHERE ( me.username IS NOT NULL OR me.action = ANY (string_to_array(btrim(?, '{"}'), '","')) ) AND admin.action = ANY (ds.actionset))
AND me.device NOT IN WHERE ds.device IS NULL
(SELECT ds.device ORDER BY random())
FROM device_skip ds
WHERE ( me.action = ANY (ds.actionset) OR SELECT my_jobs.*,
(ds.deferrals >= ? AND ds.last_defer > ( LOCALTIMESTAMP - ?::interval )) ) CASE WHEN (my_jobs.username IS NOT NULL OR
AND ds.backend = ? AND ds.device = me.device) my_jobs.action = ANY (string_to_array(btrim(?, '{"}'), '","')))
AND me.status = 'queued' THEN 100
ORDER BY random() ELSE 0
LIMIT ?) END AS job_priority
UNION FROM my_jobs
(SELECT me.*, 0 AS job_priority
FROM admin me LEFT OUTER JOIN device_skip ds
WHERE NOT (me.action = ANY (string_to_array(btrim(?, '{"}'), '","'))) ON (ds.backend = ? AND ds.device = my_jobs.device)
AND me.device NOT IN
(SELECT ds.device WHERE my_jobs.username IS NOT NULL
FROM device_skip ds OR (ds.deferrals IS NULL AND ds.last_defer IS NULL)
WHERE ( me.action = ANY (ds.actionset) OR OR ds.deferrals < ?
(ds.deferrals >= ? AND ds.last_defer > ( LOCALTIMESTAMP - ?::interval )) ) OR ds.last_defer <= ( LOCALTIMESTAMP - ?::interval )
AND ds.backend = ? AND ds.device = me.device)
AND me.status = 'queued' ORDER BY job_priority DESC,
ORDER BY random() ds.deferrals ASC NULLS FIRST,
LIMIT ?) ds.last_defer ASC NULLS LAST
) jobs
LEFT OUTER JOIN device_skip ds2
ON ds2.backend = ? AND ds2.device = jobs.device
ORDER BY jobs.job_priority DESC,
ds2.deferrals ASC NULLS FIRST
LIMIT ? LIMIT ?
ENDSQL ENDSQL
); );
@@ -77,8 +72,6 @@ __PACKAGE__->add_columns(
{ data_type => "text", is_nullable => 1 }, { data_type => "text", is_nullable => 1 },
"job_priority", "job_priority",
{ data_type => "integer", is_nullable => 1 }, { data_type => "integer", is_nullable => 1 },
"num_deferrals",
{ data_type => "integer", is_nullable => 1 },
); );
__PACKAGE__->set_primary_key("job"); __PACKAGE__->set_primary_key("job");

View File

@@ -87,14 +87,11 @@ sub jq_getsome {
my $jobs = schema('netdisco')->resultset('Admin'); my $jobs = schema('netdisco')->resultset('Admin');
my @returned = (); my @returned = ();
my @filter = (
setting('job_prio')->{'high'}, setting('workers')->{'max_deferrals'},
setting('workers')->{'retry_after'}, setting('workers')->{'BACKEND'},
$num_slots,
);
my $tasty = schema('netdisco')->resultset('Virtual::TastyJobs') my $tasty = schema('netdisco')->resultset('Virtual::TastyJobs')
->search(undef,{ bind => [ ->search(undef,{ bind => [
@filter, @filter, setting('workers')->{'BACKEND'}, $num_slots setting('workers')->{'BACKEND'}, setting('job_prio')->{'high'},
setting('workers')->{'BACKEND'}, setting('workers')->{'max_deferrals'},
setting('workers')->{'retry_after'}, $num_slots,
]}); ]});
while (my $job = $tasty->next) { while (my $job = $tasty->next) {