Module: tools Branch: master Commit: 138a6920df88a81f505449309f9ac7aa32ba44a0 URL: http://source.winehq.org/git/tools.git/?a=commit;h=138a6920df88a81f505449309...
Author: Francois Gouget fgouget@codeweavers.com Date: Fri Nov 2 00:11:58 2012 +0100
testbot/lib: Fix job cancellation so a rescheduling happens in short order.
Previously testbot would only be noticing cancelled jobs through the SafetyNet() function which is called every 10 minutes by default. Now we wait a couple of seconds for the SIGTERM to be served to the child process and then rechedule so other tasks can start.
---
testbot/bin/Engine.pl | 11 +++++++++++ testbot/lib/WineTestBot/Jobs.pm | 39 ++++++++++++++------------------------- 2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/testbot/bin/Engine.pl b/testbot/bin/Engine.pl index 1cc8a9b..f9be03a 100755 --- a/testbot/bin/Engine.pl +++ b/testbot/bin/Engine.pl @@ -153,6 +153,17 @@ sub HandleJobCancel return "0$ErrMessage"; }
+ # Wait a couple of seconds before rescheduling so the child processes have + # the time to die. + AddEvent("JobCancel$JobKey", 2, 0, sub { + $Job->UpdateStatus(); + $ErrMessage = ScheduleJobs(); + if (defined($ErrMessage)) + { + LogMsg "Scheduling problem in HandleJobCancel: $ErrMessage\n"; + } + }); + return "1OK"; }
diff --git a/testbot/lib/WineTestBot/Jobs.pm b/testbot/lib/WineTestBot/Jobs.pm index 74547d2..c15c7af 100644 --- a/testbot/lib/WineTestBot/Jobs.pm +++ b/testbot/lib/WineTestBot/Jobs.pm @@ -179,39 +179,28 @@ sub Cancel { my $self = shift;
- foreach my $Step (@{$self->Steps->GetItems()}) + my $Steps = $self->Steps; + $Steps->AddFilter("Status", ["queued", "running"]); + foreach my $Step (@{$Steps->GetItems()}) { - my $Status = $Step->Status; - if ($Status eq "queued" || $Status eq "running") + my $Tasks = $Step->Tasks; + $Tasks->AddFilter("Status", ["queued", "running"]); + foreach my $Task (@{$Tasks->GetItems()}) { - foreach my $Task (@{$Step->Tasks->GetItems()}) + if ($Task->Status eq "queued") { - if ($Task->Status eq "queued") - { - $Task->Status("skipped"); - $Task->Save(); - } + $Task->Status("skipped"); + $Task->Save(); } - } - } - - foreach my $Step (@{$self->Steps->GetItems()}) - { - my $Status = $Step->Status; - if ($Status eq "queued" || $Status eq "running") - { - foreach my $Task (@{$Step->Tasks->GetItems()}) + elsif (defined $Task->ChildPid) { - if ($Task->Status eq "running") - { - if (defined($Task->ChildPid)) - { - kill "TERM", $Task->ChildPid; - } - } + # We don't unset ChildPid so Task::UpdateStatus() + # will add a trace in the log + kill("TERM", $Task->ChildPid); } } } + # Let the higher layers handle updating the overall job status
return undef; }