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,