From 8f4ba0bcf3651521e01ee915f598b08d017488d2 Mon Sep 17 00:00:00 2001 From: Dominion Date: Fri, 24 Mar 2023 14:26:14 -0400 Subject: [PATCH] Improve responsiveness of current DreamMaker stage --- .../Components/Deployment/DreamMaker.cs | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs index e8464b0d89..1838dceeb7 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs @@ -719,18 +719,40 @@ namespace Tgstation.Server.Host.Components.Deployment { var noEstimate = !estimatedDuration.HasValue; progressReporter.StageName = currentStage; - progressReporter.ReportProgress(noEstimate ? null : 0); + double? lastReport = noEstimate ? null : 0; + progressReporter.ReportProgress(lastReport); - var sleepInterval = estimatedDuration.HasValue ? estimatedDuration.Value / 100 : TimeSpan.FromMilliseconds(250); + var minimumSleepInterval = TimeSpan.FromMilliseconds(250); + var sleepInterval = estimatedDuration.HasValue ? estimatedDuration.Value / 100 : minimumSleepInterval; + + if (estimatedDuration.HasValue) + { + logger.LogDebug("Compile is expected to take: {0}", estimatedDuration); + } + else + { + logger.LogTrace("No metric to estimate compile time."); + } - logger.LogDebug("Compile is expected to take: {0}", estimatedDuration); try { for (var iteration = 0; iteration < (estimatedDuration.HasValue ? 99 : Int32.MaxValue); ++iteration) { - await Task.Delay(sleepInterval, cancellationToken); + var nextInterval = DateTimeOffset.Now + sleepInterval; + do + { + var remainingSleepThisInterval = nextInterval - DateTimeOffset.Now; + var nextSleepSpan = remainingSleepThisInterval < minimumSleepInterval ? remainingSleepThisInterval : minimumSleepInterval; + + await Task.Delay(nextSleepSpan, cancellationToken); + progressReporter.StageName = currentStage; + progressReporter.ReportProgress(lastReport); + } + while (DateTimeOffset.Now < nextInterval); + progressReporter.StageName = currentStage; - progressReporter.ReportProgress(noEstimate ? null : sleepInterval * (iteration + 1) / estimatedDuration.Value); + lastReport = noEstimate ? null : sleepInterval * (iteration + 1) / estimatedDuration.Value; + progressReporter.ReportProgress(lastReport); } } catch (OperationCanceledException)