From b0c002ddb0ea929837544a82564195d52df014ea Mon Sep 17 00:00:00 2001 From: Jordan Date: Mon, 19 Jun 2023 01:00:43 -0400 Subject: [PATCH] Host.Watchdog forwards SIGUSR1 to child --- build/Version.props | 2 +- .../Tgstation.Server.Host.Watchdog.csproj | 2 + .../Watchdog.cs | 37 ++++++++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/build/Version.props b/build/Version.props index 308fb7a8c3..f3102f5c76 100644 --- a/build/Version.props +++ b/build/Version.props @@ -11,7 +11,7 @@ 12.0.0 6.5.0 5.6.1 - 1.2.2 + 1.3.0 1.2.1 1.0.1 diff --git a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj index 97c746f05c..0277b02fdd 100644 --- a/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj +++ b/src/Tgstation.Server.Host.Watchdog/Tgstation.Server.Host.Watchdog.csproj @@ -24,6 +24,8 @@ + + all diff --git a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs index 0092ea6140..c45a25b364 100644 --- a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs +++ b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs @@ -11,6 +11,9 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Mono.Unix; +using Mono.Unix.Native; + using Tgstation.Server.Host.Common; namespace Tgstation.Server.Host.Watchdog @@ -148,6 +151,7 @@ namespace Tgstation.Server.Host.Watchdog try { process.Start(); + var childPid = process.Id; using (var processCts = new CancellationTokenSource()) using (processCts.Token.Register(() => tcs.TrySetResult(null))) @@ -173,7 +177,38 @@ namespace Tgstation.Server.Host.Watchdog logger.LogWarning(ex, "Error triggering timeout!"); } })) - await tcs.Task.ConfigureAwait(false); + { + var processTask = tcs.Task; + while (!processTask.IsCompleted) + { + using var unixSignal = isWindows + ? null + : new UnixSignal(Signum.SIGUSR1); + + var signalTcs = new TaskCompletionSource(); + + if (!isWindows) + ThreadPool.RegisterWaitForSingleObject( + unixSignal, + (o, timeout) => signalTcs.SetResult(null), + null, + Timeout.Infinite, + true); + + var signalTask = signalTcs.Task; + + var completedTask = await Task.WhenAny(processTask, signalTask); + if (completedTask == signalTask) + { + logger.LogInformation("Received SIGUSR1, forwarding to main TGS process!"); + var result = Syscall.kill(childPid, Signum.SIGUSR1); + if (result != 0) + logger.LogWarning( + new UnixIOException(Stdlib.GetLastError()), + "Failed to forward SIGUSR1!"); + } + } + } } catch (InvalidOperationException ex) {