backend field in jobqueue (#1114)

implements #969
This commit is contained in:
Oliver Gorwits
2023-10-24 21:49:37 +01:00
committed by GitHub
parent d6e36dcad0
commit 21bc8cf63e
13 changed files with 49 additions and 31 deletions

View File

@@ -11,7 +11,7 @@ __PACKAGE__->load_namespaces(
);
our # try to hide from kwalitee
$VERSION = 81; # schema version used for upgrades, keep as integer
$VERSION = 83; # schema version used for upgrades, keep as integer
use Path::Class;
use File::ShareDir 'dist_dir';

View File

@@ -46,6 +46,8 @@ __PACKAGE__->add_columns(
{ data_type => "boolean", is_nullable => 1 },
"device_key",
{ data_type => "text", is_nullable => 1 },
"backend",
{ data_type => "text", is_nullable => 1 },
);

View File

@@ -371,7 +371,6 @@ sub renumber {
$schema->resultset('Admin')->search({
device => $old_ip,
status => { '-not_like' => 'queued-%' },
})->delete;
$device->update({

View File

@@ -24,7 +24,7 @@ __PACKAGE__->result_source_instance->view_definition(<<ENDSQL
WHERE action IN ( 'discover', 'macsuck', 'arpnip', 'nbtstat' )
GROUP BY action, entered
HAVING count( device ) > 1
AND SUM( CASE WHEN status LIKE 'queued%' THEN 1 ELSE 0 END ) = 0
AND SUM( CASE WHEN status = 'queued' THEN 1 ELSE 0 END ) = 0
ORDER BY entered DESC, elapsed DESC
LIMIT 30
ENDSQL

View File

@@ -16,6 +16,7 @@ __PACKAGE__->result_source_instance->view_definition(<<ENDSQL
ON (ds.backend = ? AND admin.device = ds.device
AND admin.action = ANY (ds.actionset))
WHERE admin.status = 'queued'
AND admin.backend IS NULL
AND ds.device IS NULL)
SELECT my_jobs.*,

View File

@@ -15,6 +15,7 @@ __PACKAGE__->result_source_instance->view_definition(<<ENDSQL
LEFT OUTER JOIN admin ON (device.ip = admin.device
AND admin.status = 'queued'
AND admin.backend IS NULL
AND admin.action = ?)
FULL OUTER JOIN device_skip ON (device_skip.device = device.ip

View File

@@ -730,7 +730,6 @@ sub delete {
$schema->resultset('Admin')->search({
device => { '-in' => $devices->as_query },
status => { '-not_like' => 'queued-%' },
})->delete;
$schema->resultset('DeviceSkip')->search(

View File

@@ -112,7 +112,8 @@ sub jq_getsome {
job => $job->id,
-exists => $jobs->search({
job => { '>' => $job->id },
status => { -like => 'queued-%' },
status => 'queued',
backend => { '!=' => undef },
started => \[q/> (LOCALTIMESTAMP - ?::interval)/, setting('jobs_stale_after')],
%job_properties,
})->as_query,
@@ -131,7 +132,8 @@ sub jq_getsome {
sub jq_locked {
my @returned = ();
my $rs = schema(vars->{'tenant'})->resultset('Admin')->search({
status => ('queued-'. setting('workers')->{'BACKEND'}),
status => 'queued',
backend => setting('workers')->{'BACKEND'},
started => \[q/> (LOCALTIMESTAMP - ?::interval)/, setting('jobs_stale_after')],
});
@@ -147,7 +149,7 @@ sub jq_queued {
return schema(vars->{'tenant'})->resultset('Admin')->search({
device => { '!=' => undef},
action => $job_type,
status => { -like => 'queued%' },
status => 'queued',
})->get_column('device')->all;
}
@@ -161,7 +163,8 @@ sub jq_lock {
my $updated = schema(vars->{'tenant'})->resultset('Admin')
->search({ job => $job->id, status => 'queued' }, { for => 'update' })
->update({
status => ('queued-'. setting('workers')->{'BACKEND'}),
status => 'queued',
backend => setting('workers')->{'BACKEND'},
started => \"LOCALTIMESTAMP",
});
@@ -205,7 +208,7 @@ sub jq_defer {
# lock db row and update to show job is available
schema(vars->{'tenant'})->resultset('Admin')
->search({ job => $job->id }, { for => 'update' })
->update({ status => 'queued', started => undef, log => $job->log });
->update({ status => 'queued', backend => undef, started => undef, log => $job->log });
});
$happy = true;
}
@@ -257,12 +260,7 @@ sub jq_complete {
sub jq_log {
return schema(vars->{'tenant'})->resultset('Admin')->search({
(param('backend') ? (
'me.status' => { '=' => [
# FIXME 'done-'. param('backend'),
'queued-'. param('backend'),
] },
) : ()),
(param('backend') ? ('me.backend' => param('backend')) : ()),
(param('action') ? ('me.action' => param('action')) : ()),
(param('device') ? (
-or => [
@@ -271,7 +269,16 @@ sub jq_log {
],
) : ()),
(param('username') ? ('me.username' => param('username')) : ()),
(param('status') ? ('me.status' => lc(param('status'))) : ()),
(param('status') ? (
(param('status') eq 'Running') ? (
-and => [
{ 'me.backend' => { '!=' => undef } },
{ 'me.status' => 'queued' },
],
) : (
'me.status' => lc(param('status'))
)
) : ()),
(param('duration') ? (
-bool => [
-or => [

View File

@@ -32,10 +32,14 @@ ajax '/ajax/content/admin/jobqueue' => require_role admin => sub {
content_type('text/html');
my $jq_total = schema(vars->{'tenant'})->resultset('Admin')->count();
my $jq_queued = schema(vars->{'tenant'})->resultset('Admin')->search({status => 'queued'})->count();
my $jq_running = schema(vars->{'tenant'})->resultset('Admin')->search({status => { -like => 'queued-%'}})->count();
my $jq_done = schema(vars->{'tenant'})->resultset('Admin')->search({status => 'done'})->count();
my $jq_errored = schema(vars->{'tenant'})->resultset('Admin')->search({status => 'error'})->count();
my $jq_queued = schema(vars->{'tenant'})->resultset('Admin')
->search({status => 'queued', backend => undef })->count();
my $jq_running = schema(vars->{'tenant'})->resultset('Admin')
->search({status => 'queued', backend => { '!=' => undef }})->count();
my $jq_done = schema(vars->{'tenant'})->resultset('Admin')
->search({status => 'done'})->count();
my $jq_errored = schema(vars->{'tenant'})->resultset('Admin')
->search({status => 'error'})->count();
template 'ajax/admintask/jobqueue.tt', {
jq_total => commify($jq_total || 0),

View File

@@ -87,10 +87,7 @@ ajax '/ajax/data/queue/typeahead/status' => require_role admin => sub {
my $q = quotemeta( param('query') || param('term') || param('status') );
my @actions =
grep { $q ? m/^$q/ : true }
List::MoreUtils::uniq
sort
grep { defined }
qw(Queued Done Info Deferred Error);
qw(Queued Running Done Info Deferred Error);
content_type 'application/json';
to_json \@actions;

View File

@@ -0,0 +1,5 @@
BEGIN;
ALTER TABLE admin ADD COLUMN "backend" text;
COMMIT;

View File

@@ -0,0 +1,7 @@
BEGIN;
UPDATE admin SET backend = regexp_replace(status, '^queued-', '', '') WHERE status ~ '^queued-';
UPDATE admin SET status = 'queued' WHERE status ~ '^queued-';
COMMIT;

View File

@@ -26,14 +26,10 @@
<tr
[% ' class="nd_jobqueueitem success"' IF row.status == 'done' %]
[% ' class="nd_jobqueueitem error"' IF row.status == 'error' %]
[% ' class="nd_jobqueueitem info"' IF row.status.search('^queued-') %]
[% ' class="nd_jobqueueitem info"' IF (row.status == 'queued' AND row.backend != '') %]
data-content="[% row.log | html_entity %]"
>
[% IF row.status.search('^queued-') %]
<td class="nd_center-cell">[% row.status.remove('^queued-') | html_entity %]</td>
[% ELSE %]
<td class="nd_center-cell"></td>
[% END %]
<td class="nd_center-cell">[% row.backend | html_entity %]</td>
<td class="nd_center-cell">
[% FOREACH word IN row.action.split('_') %]
@@ -51,7 +47,7 @@
<td class="nd_center-cell">[% row.username | html_entity %]</td>
[% IF row.status.search('^queued-') %]
[% IF (row.status == 'queued' AND row.backend != '') %]
<td class="nd_center-cell">Running</td>
[% ELSE %]
<td class="nd_center-cell">[% row.status.ucfirst | html_entity %]</td>