Recursion may happen through the ScheduleJobs() -> VM::Run() -> VMStatusChange() -> ScheduleJobs() chain. It can cause multiple revert processes to run on the same VM, or even a revert process to run at the same time as a task.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- This issue is caused by the patch to process notifications originating from the Engine (9b0894ed386f). What's strange is I'm not seeing this issue in my test environment. --- testbot/lib/WineTestBot/Engine/Scheduler.pm | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/testbot/lib/WineTestBot/Engine/Scheduler.pm b/testbot/lib/WineTestBot/Engine/Scheduler.pm index b9304c1c8f..bba7e6a2cc 100644 --- a/testbot/lib/WineTestBot/Engine/Scheduler.pm +++ b/testbot/lib/WineTestBot/Engine/Scheduler.pm @@ -946,6 +946,7 @@ sub _PowerOffDirtyVMs($) } }
+my $_InScheduleJobs; my $_LastTaskCounts = "";
=pod @@ -1004,6 +1005,11 @@ kept on standby so they are ready when their turn comes.
sub ScheduleJobs() { + # Don't let Engine notifications (specifically VMStatusChange) cause + # recursion into ScheduleJobs(). + return if ($_InScheduleJobs); + $_InScheduleJobs = 1; + my $Sched = _CheckAndClassifyVMs(); my $NeededVMs = _ScheduleTasks($Sched); _RevertVMs($Sched, $NeededVMs); @@ -1053,6 +1059,8 @@ sub ScheduleJobs() $Timeout = 600; } AddEvent("ScheduleJobs", $Timeout, 0, &ScheduleJobs); + + $_InScheduleJobs = undef; }