testbot/lib: Fix job cancellation so a rescheduling happens in short order.
Francois Gouget
fgouget at codeweavers.com
Thu Nov 1 18:11:58 CDT 2012
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;
}
--
1.7.10.4
More information about the wine-patches
mailing list