From f71aae75fd805e0e951ae589f3cacb8572357edf Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sat, 10 Feb 2018 16:33:46 +0000 Subject: [PATCH] web jobs are highest prio; make sql cleaner --- .../Netdisco/DB/Result/Virtual/TastyJobs.pm | 61 ++++++++----------- lib/App/Netdisco/JobQueue/PostgreSQL.pm | 9 +-- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/lib/App/Netdisco/DB/Result/Virtual/TastyJobs.pm b/lib/App/Netdisco/DB/Result/Virtual/TastyJobs.pm index 94894896..5e9d941d 100644 --- a/lib/App/Netdisco/DB/Result/Virtual/TastyJobs.pm +++ b/lib/App/Netdisco/DB/Result/Virtual/TastyJobs.pm @@ -10,38 +10,33 @@ __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); __PACKAGE__->table('tasty_jobs'); __PACKAGE__->result_source_instance->is_virtual(1); __PACKAGE__->result_source_instance->view_definition(<= ? AND ds.last_defer > ( LOCALTIMESTAMP - ?::interval )) ) - AND ds.backend = ? AND ds.device = me.device) - AND me.status = 'queued' - ORDER BY random() - LIMIT ?) - UNION - (SELECT me.*, 0 AS job_priority - FROM admin me - WHERE NOT (me.action = ANY (string_to_array(btrim(?, '{"}'), '","'))) - AND me.device NOT IN - (SELECT ds.device - FROM device_skip ds - WHERE ( me.action = ANY (ds.actionset) OR - (ds.deferrals >= ? AND ds.last_defer > ( LOCALTIMESTAMP - ?::interval )) ) - AND ds.backend = ? AND ds.device = me.device) - AND me.status = 'queued' - ORDER BY random() - LIMIT ?) - ) 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 + WITH my_jobs AS + (SELECT admin.* FROM admin + LEFT OUTER JOIN device_skip ds + ON (ds.backend = ? AND admin.device = ds.device + AND admin.action = ANY (ds.actionset)) + WHERE ds.device IS NULL + ORDER BY random()) + + SELECT my_jobs.*, + CASE WHEN (my_jobs.username IS NOT NULL OR + my_jobs.action = ANY (string_to_array(btrim(?, '{"}'), '","'))) + THEN 100 + ELSE 0 + END AS job_priority + FROM my_jobs + + LEFT OUTER JOIN device_skip ds + ON (ds.backend = ? AND ds.device = my_jobs.device) + + WHERE my_jobs.username IS NOT NULL + OR (ds.deferrals IS NULL AND ds.last_defer IS NULL) + OR ds.deferrals < ? + OR ds.last_defer <= ( LOCALTIMESTAMP - ?::interval ) + + ORDER BY job_priority DESC, + ds.deferrals ASC NULLS FIRST, + ds.last_defer ASC NULLS LAST LIMIT ? ENDSQL ); @@ -77,8 +72,6 @@ __PACKAGE__->add_columns( { data_type => "text", is_nullable => 1 }, "job_priority", { data_type => "integer", is_nullable => 1 }, - "num_deferrals", - { data_type => "integer", is_nullable => 1 }, ); __PACKAGE__->set_primary_key("job"); diff --git a/lib/App/Netdisco/JobQueue/PostgreSQL.pm b/lib/App/Netdisco/JobQueue/PostgreSQL.pm index 50b49875..31e5a75c 100644 --- a/lib/App/Netdisco/JobQueue/PostgreSQL.pm +++ b/lib/App/Netdisco/JobQueue/PostgreSQL.pm @@ -87,14 +87,11 @@ sub jq_getsome { my $jobs = schema('netdisco')->resultset('Admin'); 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') ->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) {