From b061ed3d1ecf5ef6201d3e7ca8cd173eeb7563ef Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 18 Dec 2020 01:26:00 -0500 Subject: [PATCH] Force SessionController.ProcessBridgeRequest async --- .../Components/Session/SessionController.cs | 90 +++++++++---------- 1 file changed, 43 insertions(+), 47 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Session/SessionController.cs b/src/Tgstation.Server.Host/Components/Session/SessionController.cs index ec9b1301cc..390d8e3612 100644 --- a/src/Tgstation.Server.Host/Components/Session/SessionController.cs +++ b/src/Tgstation.Server.Host/Components/Session/SessionController.cs @@ -349,11 +349,16 @@ namespace Tgstation.Server.Host.Components.Session } /// - public Task ProcessBridgeRequest(BridgeParameters parameters, CancellationToken cancellationToken) + public async Task ProcessBridgeRequest(BridgeParameters parameters, CancellationToken cancellationToken) { if (parameters == null) throw new ArgumentNullException(nameof(parameters)); + // I don't fully understand why, but it seems to be REALLY important that this function remains async + // I'm sure if i think about it hard enough I'll realize there's some race condition between this processing + // and the deployment process, but this has been blocking me all week and I'm tired of giving it energy + await Task.Yield(); + using (LogContext.PushProperty("Instance", metadata.Id)) { logger.LogTrace("Handling bridge request..."); @@ -364,32 +369,28 @@ namespace Tgstation.Server.Host.Components.Session { case BridgeCommandType.ChatSend: if (parameters.ChatMessage == null) - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Missing chatMessage field!" - }); + return new BridgeResponse + { + ErrorMessage = "Missing chatMessage field!" + }; if (parameters.ChatMessage.ChannelIds == null) - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Missing channelIds field in chatMessage!" - }); + return new BridgeResponse + { + ErrorMessage = "Missing channelIds field in chatMessage!" + }; if (parameters.ChatMessage.ChannelIds.Any(channelIdString => !UInt64.TryParse(channelIdString, out var _))) - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Invalid channelIds in chatMessage!" - }); + return new BridgeResponse + { + ErrorMessage = "Invalid channelIds in chatMessage!" + }; if (parameters.ChatMessage.Text == null) - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Missing message field in chatMessage!" - }); + return new BridgeResponse + { + ErrorMessage = "Missing message field in chatMessage!" + }; chat.QueueMessage( parameters.ChatMessage.Text, @@ -412,11 +413,10 @@ namespace Tgstation.Server.Host.Components.Session { /////UHHHH logger.LogWarning("DreamDaemon sent new port command without providing it's own!"); - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Missing stringified port as data parameter!" - }); + return new BridgeResponse + { + ErrorMessage = "Missing stringified port as data parameter!" + }; } var currentPort = parameters.CurrentPort.Value; @@ -443,21 +443,19 @@ namespace Tgstation.Server.Host.Components.Session case BridgeCommandType.Startup: apiValidationStatus = ApiValidationStatus.BadValidationRequest; if (parameters.Version == null) - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Missing dmApiVersion field!" - }); + return new BridgeResponse + { + ErrorMessage = "Missing dmApiVersion field!" + }; DMApiVersion = parameters.Version; if (DMApiVersion.Major != DMApiConstants.Version.Major) { apiValidationStatus = ApiValidationStatus.Incompatible; - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Incompatible dmApiVersion!" - }); + return new BridgeResponse + { + ErrorMessage = "Incompatible dmApiVersion!" + }; } switch (parameters.MinimumSecurityLevel) @@ -472,17 +470,15 @@ namespace Tgstation.Server.Host.Components.Session apiValidationStatus = ApiValidationStatus.RequiresTrusted; break; case null: - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Missing minimumSecurityLevel field!" - }); + return new BridgeResponse + { + ErrorMessage = "Missing minimumSecurityLevel field!" + }; default: - return Task.FromResult( - new BridgeResponse - { - ErrorMessage = "Invalid minimumSecurityLevel!" - }); + return new BridgeResponse + { + ErrorMessage = "Invalid minimumSecurityLevel!" + }; } logger.LogTrace("ApiValidationStatus set to {0}", apiValidationStatus); @@ -519,7 +515,7 @@ namespace Tgstation.Server.Host.Components.Session break; } - return Task.FromResult(response); + return response; } }