From f289c8298302f17ba0288788cce13bfb59d9b215 Mon Sep 17 00:00:00 2001 From: Dominion Date: Tue, 23 May 2023 01:27:10 -0400 Subject: [PATCH] Replace a bunch of Task.Delays with IAsyncDelayer --- .../Chat/Providers/DiscordProvider.cs | 9 ++++--- .../Components/Chat/Providers/IrcProvider.cs | 24 +++++++------------ .../Components/Chat/Providers/Provider.cs | 12 ++++++++-- .../Chat/Providers/ProviderFactory.cs | 5 ++-- .../Components/Deployment/DreamMaker.cs | 13 ++++++++-- .../Components/Instance.cs | 10 +++++++- .../Components/InstanceFactory.cs | 12 ++++++++++ .../Components/Session/SessionController.cs | 7 +++++- .../Session/SessionControllerFactory.cs | 13 +++++++++- 9 files changed, 77 insertions(+), 28 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Chat/Providers/DiscordProvider.cs b/src/Tgstation.Server.Host/Components/Chat/Providers/DiscordProvider.cs index b12b12a1ee..9e614fe941 100644 --- a/src/Tgstation.Server.Host/Components/Chat/Providers/DiscordProvider.cs +++ b/src/Tgstation.Server.Host/Components/Chat/Providers/DiscordProvider.cs @@ -27,6 +27,7 @@ using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.Jobs; using Tgstation.Server.Host.Models; using Tgstation.Server.Host.System; +using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.Components.Chat.Providers { @@ -179,15 +180,17 @@ namespace Tgstation.Server.Host.Components.Chat.Providers /// Initializes a new instance of the class. /// /// The for the . - /// The value of . + /// The for the . /// The for the . + /// The value of . /// The for the . public DiscordProvider( IJobManager jobManager, - IAssemblyInformationProvider assemblyInformationProvider, + IAsyncDelayer asyncDelayer, ILogger logger, + IAssemblyInformationProvider assemblyInformationProvider, ChatBot chatBot) - : base(jobManager, logger, chatBot) + : base(jobManager, asyncDelayer, logger, chatBot) { this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider)); diff --git a/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs b/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs index 6a871755b9..179105d248 100644 --- a/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs +++ b/src/Tgstation.Server.Host/Components/Chat/Providers/IrcProvider.cs @@ -42,11 +42,6 @@ namespace Tgstation.Server.Host.Components.Chat.Providers /// public override string BotMention => client.Nickname; - /// - /// The for the . - /// - readonly IAsyncDelayer asyncDelayer; - /// /// The client. /// @@ -105,24 +100,22 @@ namespace Tgstation.Server.Host.Components.Chat.Providers /// /// Initializes a new instance of the class. /// - /// The for the provider. - /// The to get the from. - /// The value of . + /// The for the . + /// The for the . /// The for the . + /// The to get the from. /// The for the . public IrcProvider( IJobManager jobManager, - IAssemblyInformationProvider assemblyInformationProvider, IAsyncDelayer asyncDelayer, ILogger logger, + IAssemblyInformationProvider assemblyInformationProvider, Models.ChatBot chatBot) - : base(jobManager, logger, chatBot) + : base(jobManager, asyncDelayer, logger, chatBot) { if (assemblyInformationProvider == null) throw new ArgumentNullException(nameof(assemblyInformationProvider)); - this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); - var builder = chatBot.CreateConnectionStringBuilder(); if (builder == null || !builder.Valid || builder is not IrcConnectionStringBuilder ircBuilder) throw new InvalidOperationException("Invalid ChatConnectionStringBuilder!"); @@ -641,14 +634,14 @@ namespace Tgstation.Server.Host.Components.Chat.Providers var listenTimeSpan = TimeSpan.FromMilliseconds(10); for (; !recievedAck; - await asyncDelayer.Delay(listenTimeSpan, timeoutToken)) + await AsyncDelayer.Delay(listenTimeSpan, timeoutToken)) await NonBlockingListen(cancellationToken); client.WriteLine("AUTHENTICATE PLAIN", Priority.Critical); timeoutToken.ThrowIfCancellationRequested(); for (; !recievedPlus; - await asyncDelayer.Delay(listenTimeSpan, timeoutToken)) + await AsyncDelayer.Delay(listenTimeSpan, timeoutToken)) await NonBlockingListen(cancellationToken); } finally @@ -714,8 +707,7 @@ namespace Tgstation.Server.Host.Components.Chat.Providers Task.WhenAll( disconnectTask, listenTask ?? Task.CompletedTask), - asyncDelayer.Delay(TimeSpan.FromSeconds(5), cancellationToken)) - ; + AsyncDelayer.Delay(TimeSpan.FromSeconds(5), cancellationToken)); } } } diff --git a/src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs b/src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs index 010c21e106..d613cc8872 100644 --- a/src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs +++ b/src/Tgstation.Server.Host/Components/Chat/Providers/Provider.cs @@ -10,6 +10,7 @@ using Tgstation.Server.Host.Components.Interop; using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.Jobs; using Tgstation.Server.Host.Models; +using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.Components.Chat.Providers { @@ -24,6 +25,11 @@ namespace Tgstation.Server.Host.Components.Chat.Providers /// protected ChatBot ChatBot { get; } + /// + /// The for the . + /// + protected IAsyncDelayer AsyncDelayer { get; } + /// /// The for the . /// @@ -68,11 +74,13 @@ namespace Tgstation.Server.Host.Components.Chat.Providers /// Initializes a new instance of the class. /// /// The value of . + /// The value of . /// The value of . /// The value of . - protected Provider(IJobManager jobManager, ILogger logger, ChatBot chatBot) + protected Provider(IJobManager jobManager, IAsyncDelayer asyncDelayer, ILogger logger, ChatBot chatBot) { this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager)); + AsyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); Logger = logger ?? throw new ArgumentNullException(nameof(logger)); ChatBot = chatBot ?? throw new ArgumentNullException(nameof(chatBot)); @@ -259,7 +267,7 @@ namespace Tgstation.Server.Host.Components.Chat.Providers try { if (!connectNow) - await Task.Delay(TimeSpan.FromMinutes(reconnectInterval), cancellationToken); + await AsyncDelayer.Delay(TimeSpan.FromMinutes(reconnectInterval), cancellationToken); else connectNow = false; if (!Connected) diff --git a/src/Tgstation.Server.Host/Components/Chat/Providers/ProviderFactory.cs b/src/Tgstation.Server.Host/Components/Chat/Providers/ProviderFactory.cs index 6a7e0abd32..775db6c2e5 100644 --- a/src/Tgstation.Server.Host/Components/Chat/Providers/ProviderFactory.cs +++ b/src/Tgstation.Server.Host/Components/Chat/Providers/ProviderFactory.cs @@ -61,14 +61,15 @@ namespace Tgstation.Server.Host.Components.Chat.Providers { ChatProvider.Irc => new IrcProvider( jobManager, - assemblyInformationProvider, asyncDelayer, loggerFactory.CreateLogger(), + assemblyInformationProvider, settings), ChatProvider.Discord => new DiscordProvider( jobManager, - assemblyInformationProvider, + asyncDelayer, loggerFactory.CreateLogger(), + assemblyInformationProvider, settings), _ => throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid ChatProvider: {0}", settings.Provider)), }; diff --git a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs index ab04afebb9..4d1a37fe96 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs @@ -23,6 +23,7 @@ using Tgstation.Server.Host.IO; using Tgstation.Server.Host.Jobs; using Tgstation.Server.Host.Models; using Tgstation.Server.Host.System; +using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.Components.Deployment { @@ -89,6 +90,11 @@ namespace Tgstation.Server.Host.Components.Deployment /// readonly IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory; + /// + /// The for . + /// + readonly IAsyncDelayer asyncDelayer; + /// /// The for . /// @@ -147,6 +153,7 @@ namespace Tgstation.Server.Host.Components.Deployment /// The value of . /// The value of . /// The value of . + /// The value of . /// The value of . /// The value of . /// The value of . @@ -161,6 +168,7 @@ namespace Tgstation.Server.Host.Components.Deployment ICompileJobSink compileJobConsumer, IRepositoryManager repositoryManager, IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory, + IAsyncDelayer asyncDelayer, ILogger logger, SessionConfiguration sessionConfiguration, Api.Models.Instance metadata) @@ -174,6 +182,7 @@ namespace Tgstation.Server.Host.Components.Deployment this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor)); this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer)); this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager)); + this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); this.sessionConfiguration = sessionConfiguration ?? throw new ArgumentNullException(nameof(sessionConfiguration)); @@ -741,13 +750,13 @@ namespace Tgstation.Server.Host.Components.Deployment var remainingSleepThisInterval = nextInterval - DateTimeOffset.UtcNow; var nextSleepSpan = remainingSleepThisInterval < minimumSleepInterval ? minimumSleepInterval : remainingSleepThisInterval; - await Task.Delay(nextSleepSpan, cancellationToken); + await asyncDelayer.Delay(nextSleepSpan, cancellationToken); progressReporter.ReportProgress(lastReport); } while (DateTimeOffset.UtcNow < nextInterval); } else - await Task.Delay(minimumSleepInterval, cancellationToken); + await asyncDelayer.Delay(minimumSleepInterval, cancellationToken); lastReport = estimatedDuration.HasValue ? sleepInterval * (iteration + 1) / estimatedDuration.Value : null; progressReporter.ReportProgress(lastReport); diff --git a/src/Tgstation.Server.Host/Components/Instance.cs b/src/Tgstation.Server.Host/Components/Instance.cs index 8d36d468b3..5c5ec4d692 100644 --- a/src/Tgstation.Server.Host/Components/Instance.cs +++ b/src/Tgstation.Server.Host/Components/Instance.cs @@ -70,6 +70,11 @@ namespace Tgstation.Server.Host.Components /// readonly IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory; + /// + /// The for the . + /// + readonly IAsyncDelayer asyncDelayer; + /// /// The for the . /// @@ -109,6 +114,7 @@ namespace Tgstation.Server.Host.Components /// The value of . /// The value of . /// The value of . + /// The value of . /// The value of . public Instance( Api.Models.Instance metadata, @@ -123,6 +129,7 @@ namespace Tgstation.Server.Host.Components IJobManager jobManager, IEventConsumer eventConsumer, IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory, + IAsyncDelayer asyncDelayer, ILogger logger) { this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata)); @@ -136,6 +143,7 @@ namespace Tgstation.Server.Host.Components this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager)); this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer)); this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory)); + this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); timerLock = new object(); @@ -488,7 +496,7 @@ namespace Tgstation.Server.Host.Components while (true) try { - await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : minutes), cancellationToken); + await asyncDelayer.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : minutes), cancellationToken); logger.LogInformation("Beginning auto update..."); await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, Enumerable.Empty(), cancellationToken); try diff --git a/src/Tgstation.Server.Host/Components/InstanceFactory.cs b/src/Tgstation.Server.Host/Components/InstanceFactory.cs index 6f68acec65..6d78a4edd0 100644 --- a/src/Tgstation.Server.Host/Components/InstanceFactory.cs +++ b/src/Tgstation.Server.Host/Components/InstanceFactory.cs @@ -23,6 +23,7 @@ using Tgstation.Server.Host.Jobs; using Tgstation.Server.Host.Security; using Tgstation.Server.Host.System; using Tgstation.Server.Host.Transfer; +using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.Components { @@ -139,6 +140,11 @@ namespace Tgstation.Server.Host.Components /// readonly IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory; + /// + /// The for the . + /// + readonly IAsyncDelayer asyncDelayer; + /// /// The for the . /// @@ -182,6 +188,7 @@ namespace Tgstation.Server.Host.Components /// The value of . /// The value of . /// The value of . + /// The value of . /// The containing the value of . /// The containing the value of . public InstanceFactory( @@ -207,6 +214,7 @@ namespace Tgstation.Server.Host.Components IFileTransferTicketProvider fileTransferService, IGitRemoteFeaturesFactory gitRemoteFeaturesFactory, IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory, + IAsyncDelayer asyncDelayer, IOptions generalConfigurationOptions, IOptions sessionConfigurationOptions) { @@ -232,6 +240,7 @@ namespace Tgstation.Server.Host.Components this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService)); this.gitRemoteFeaturesFactory = gitRemoteFeaturesFactory ?? throw new ArgumentNullException(nameof(gitRemoteFeaturesFactory)); this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory)); + this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions)); sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions)); } @@ -310,6 +319,7 @@ namespace Tgstation.Server.Host.Components bridgeRegistrar, serverPortProvider, eventConsumer, + asyncDelayer, loggerFactory, loggerFactory.CreateLogger(), sessionConfiguration, @@ -358,6 +368,7 @@ namespace Tgstation.Server.Host.Components dmbFactory, repoManager, remoteDeploymentManagerFactory, + asyncDelayer, loggerFactory.CreateLogger(), sessionConfiguration, metadata); @@ -374,6 +385,7 @@ namespace Tgstation.Server.Host.Components jobManager, eventConsumer, remoteDeploymentManagerFactory, + asyncDelayer, loggerFactory.CreateLogger()); return instance; diff --git a/src/Tgstation.Server.Host/Components/Session/SessionController.cs b/src/Tgstation.Server.Host/Components/Session/SessionController.cs index f5e1491594..a831a37679 100644 --- a/src/Tgstation.Server.Host/Components/Session/SessionController.cs +++ b/src/Tgstation.Server.Host/Components/Session/SessionController.cs @@ -180,6 +180,7 @@ namespace Tgstation.Server.Host.Components.Session /// The value of . /// The value of . /// The for the . + /// The for the . /// The value of . /// The returning a to be run after the ends. /// The optional time to wait before failing the . @@ -195,6 +196,7 @@ namespace Tgstation.Server.Host.Components.Session IBridgeRegistrar bridgeRegistrar, IChatManager chat, IAssemblyInformationProvider assemblyInformationProvider, + IAsyncDelayer asyncDelayer, ILogger logger, Func postLifetimeCallback, uint? startupTimeout, @@ -250,6 +252,7 @@ namespace Tgstation.Server.Host.Components.Session LaunchResult = GetLaunchResult( assemblyInformationProvider, + asyncDelayer, startupTimeout, reattached, apiValidate); @@ -512,12 +515,14 @@ namespace Tgstation.Server.Host.Components.Session /// The for . /// /// The . + /// The . /// The, optional, startup timeout in seconds. /// If DreamDaemon was reattached. /// If this is a DMAPI validation session. /// A resulting in the for the operation. async Task GetLaunchResult( IAssemblyInformationProvider assemblyInformationProvider, + IAsyncDelayer asyncDelayer, uint? startupTimeout, bool reattached, bool apiValidate) @@ -530,7 +535,7 @@ namespace Tgstation.Server.Host.Components.Session var toAwait = Task.WhenAny(startupTask, process.Lifetime); if (startupTimeout.HasValue) - toAwait = Task.WhenAny(toAwait, Task.Delay(TimeSpan.FromSeconds(startupTimeout.Value))); + toAwait = Task.WhenAny(toAwait, asyncDelayer.Delay(TimeSpan.FromSeconds(startupTimeout.Value), default)); // DCT: None available, task will clean up after delay Logger.LogTrace( "Waiting for LaunchResult based on {launchResultCompletionCause}{possibleTimeout}...", diff --git a/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs index f785629871..0662b381d2 100644 --- a/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs +++ b/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs @@ -26,6 +26,7 @@ using Tgstation.Server.Host.IO; using Tgstation.Server.Host.Jobs; using Tgstation.Server.Host.Security; using Tgstation.Server.Host.System; +using Tgstation.Server.Host.Utils; namespace Tgstation.Server.Host.Components.Session { @@ -102,6 +103,11 @@ namespace Tgstation.Server.Host.Components.Session /// readonly IEventConsumer eventConsumer; + /// + /// The for the . + /// + readonly IAsyncDelayer asyncDelayer; + /// /// The for the . /// @@ -187,10 +193,11 @@ namespace Tgstation.Server.Host.Components.Session /// The value of . /// The value of . /// The value of . + /// The value of . + /// The value of . /// The value of . /// The value of . /// The value of . - /// The value of . public SessionControllerFactory( IProcessExecutor processExecutor, IByondManager byond, @@ -205,6 +212,7 @@ namespace Tgstation.Server.Host.Components.Session IBridgeRegistrar bridgeRegistrar, IServerPortProvider serverPortProvider, IEventConsumer eventConsumer, + IAsyncDelayer asyncDelayer, ILoggerFactory loggerFactory, ILogger logger, SessionConfiguration sessionConfiguration, @@ -223,6 +231,7 @@ namespace Tgstation.Server.Host.Components.Session this.bridgeRegistrar = bridgeRegistrar ?? throw new ArgumentNullException(nameof(bridgeRegistrar)); this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider)); this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer)); + this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer)); this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); this.sessionConfiguration = sessionConfiguration ?? throw new ArgumentNullException(nameof(sessionConfiguration)); @@ -341,6 +350,7 @@ namespace Tgstation.Server.Host.Components.Session bridgeRegistrar, chat, assemblyInformationProvider, + asyncDelayer, loggerFactory.CreateLogger(), () => !launchParameters.LogOutput.Value ? LogDDOutput(process, outputFilePath, byondLock.SupportsCli, default) // DCT: None available @@ -425,6 +435,7 @@ namespace Tgstation.Server.Host.Components.Session bridgeRegistrar, chat, assemblyInformationProvider, + asyncDelayer, loggerFactory.CreateLogger(), () => Task.CompletedTask, null,