diff --git a/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs b/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs index d6377963eb..2bbff38173 100644 --- a/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs +++ b/src/Tgstation.Server.Host/Components/Watchdog/WatchdogBase.cs @@ -770,6 +770,28 @@ namespace Tgstation.Server.Host.Components.Watchdog } } + /// + /// Check for a new . + /// + /// The session's current . + /// A that completes if and when a newer is available. + Task InitialCheckDmbUpdated(CompileJob currentCompileJob) + { + var factoryTask = DmbFactory.OnNewerDmb; + + var latestCompileJob = DmbFactory.LatestCompileJob(); + if (latestCompileJob == null) + return factoryTask; + + if (latestCompileJob.Id != currentCompileJob.Id) + { + Logger.LogDebug("Found new CompileJob without waiting"); + return Task.CompletedTask; + } + + return factoryTask; + } + /// /// The main loop of the watchdog. Ayschronously waits for events to occur and then responds to them. /// @@ -792,6 +814,7 @@ namespace Tgstation.Server.Host.Components.Watchdog activeLaunchParametersChanged = null, newDmbAvailable = null; ISessionController lastController = null; + var ranInitialDmbCheck = false; for (ulong iteration = 1; nextAction != MonitorAction.Exit; ++iteration) using (LogContext.PushProperty("Monitor", iteration)) try @@ -803,19 +826,19 @@ namespace Tgstation.Server.Host.Components.Watchdog void UpdateMonitoredTasks() { - static void TryUpdateTask(ref Task oldTask, Task newTask) + static void TryUpdateTask(ref Task oldTask, Func newTaskFactory) { if (oldTask?.IsCompleted == true) return; - oldTask = newTask; + oldTask = newTaskFactory(); } if (lastController == controller) { - TryUpdateTask(ref activeServerLifetime, controller.Lifetime); - TryUpdateTask(ref activeServerReboot, controller.OnReboot); - TryUpdateTask(ref serverPrimed, controller.OnPrime); + TryUpdateTask(ref activeServerLifetime, () => controller.Lifetime); + TryUpdateTask(ref activeServerReboot, () => controller.OnReboot); + TryUpdateTask(ref serverPrimed, () => controller.OnPrime); } else { @@ -825,8 +848,17 @@ namespace Tgstation.Server.Host.Components.Watchdog lastController = controller; } - TryUpdateTask(ref activeLaunchParametersChanged, ActiveParametersUpdated.Task); - TryUpdateTask(ref newDmbAvailable, DmbFactory.OnNewerDmb); + TryUpdateTask(ref activeLaunchParametersChanged, () => ActiveParametersUpdated.Task); + TryUpdateTask( + ref newDmbAvailable, + () => + { + var result = ranInitialDmbCheck + ? DmbFactory.OnNewerDmb + : InitialCheckDmbUpdated(controller.CompileJob); + ranInitialDmbCheck = true; + return result; + }); } UpdateMonitoredTasks();