From ae25fef63730a24c669cefbe70c833387e0e1cb2 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Thu, 1 May 2025 19:29:20 +1000 Subject: [PATCH 1/3] fix: ensure mutagen daemon log is closed --- App/Services/MutagenController.cs | 60 ++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/App/Services/MutagenController.cs b/App/Services/MutagenController.cs index f1fd674..53a3f97 100644 --- a/App/Services/MutagenController.cs +++ b/App/Services/MutagenController.cs @@ -556,25 +556,59 @@ private void StartDaemonProcess() var logPath = Path.Combine(_mutagenDataDirectory, "daemon.log"); var logStream = new StreamWriter(logPath, true); - _daemonProcess = new Process(); - _daemonProcess.StartInfo.FileName = _mutagenExecutablePath; - _daemonProcess.StartInfo.Arguments = "daemon run"; - _daemonProcess.StartInfo.Environment.Add("MUTAGEN_DATA_DIRECTORY", _mutagenDataDirectory); - _daemonProcess.StartInfo.Environment.Add("MUTAGEN_SSH_CONFIG_PATH", "none"); // do not use ~/.ssh/config + _logger.LogInformation("starting mutagen daemon process with executable path '{path}'", _mutagenExecutablePath); + _logger.LogInformation("mutagen data directory '{path}'", _mutagenDataDirectory); + _logger.LogInformation("mutagen daemon log path '{path}'", logPath); + + var daemonProcess = new Process(); + daemonProcess.StartInfo.FileName = _mutagenExecutablePath; + daemonProcess.StartInfo.Arguments = "daemon run"; + daemonProcess.StartInfo.Environment.Add("MUTAGEN_DATA_DIRECTORY", _mutagenDataDirectory); + daemonProcess.StartInfo.Environment.Add("MUTAGEN_SSH_CONFIG_PATH", "none"); // do not use ~/.ssh/config // hide the console window - _daemonProcess.StartInfo.CreateNoWindow = true; + daemonProcess.StartInfo.CreateNoWindow = true; // shell needs to be disabled since we set the environment // https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.environment?view=net-8.0 - _daemonProcess.StartInfo.UseShellExecute = false; - _daemonProcess.StartInfo.RedirectStandardError = true; - _daemonProcess.EnableRaisingEvents = true; - _daemonProcess.Exited += (object? sender, EventArgs e) => + daemonProcess.StartInfo.UseShellExecute = false; + daemonProcess.StartInfo.RedirectStandardError = true; + daemonProcess.EnableRaisingEvents = true; + daemonProcess.Exited += (_, _) => { - _logger.LogInformation("mutagen daemon exited with code {exitCode}", _daemonProcess?.ExitCode); + var exitCode = -1; + try + { + // ReSharper disable once AccessToDisposedClosure + exitCode = daemonProcess.ExitCode; + } + catch + { + // ignored + } + _logger.LogInformation("mutagen daemon exited with code {exitCode}", exitCode); }; - if (!_daemonProcess.Start()) - throw new InvalidOperationException("Failed to start mutagen daemon process, Start returned false"); + try + { + if (!daemonProcess.Start()) + throw new InvalidOperationException("Failed to start mutagen daemon process, Start returned false"); + } + catch (Exception e) + { + _logger.LogWarning(e, "mutagen daemon failed to start"); + + logStream.Dispose(); + try + { + daemonProcess.Kill(); + } + catch + { + // ignored, the process likely doesn't exist + } + daemonProcess.Dispose(); + } + + _daemonProcess = daemonProcess; var writer = new LogWriter(_daemonProcess.StandardError, logStream); Task.Run(() => { _ = writer.Run(); }); _logWriter = writer; From c92b747590e329bdc77049931bc2d12a32626bcd Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Thu, 1 May 2025 19:31:22 +1000 Subject: [PATCH 2/3] fmt --- App/Services/MutagenController.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/App/Services/MutagenController.cs b/App/Services/MutagenController.cs index 53a3f97..5a5641d 100644 --- a/App/Services/MutagenController.cs +++ b/App/Services/MutagenController.cs @@ -16,13 +16,13 @@ using Coder.Desktop.MutagenSdk.Proto.Url; using Coder.Desktop.Vpn.Utilities; using Grpc.Core; -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Serilog; using DaemonTerminateRequest = Coder.Desktop.MutagenSdk.Proto.Service.Daemon.TerminateRequest; using MutagenProtocol = Coder.Desktop.MutagenSdk.Proto.Url.Protocol; using SynchronizationTerminateRequest = Coder.Desktop.MutagenSdk.Proto.Service.Synchronization.TerminateRequest; -using Microsoft.Extensions.Hosting; namespace Coder.Desktop.App.Services; @@ -584,6 +584,7 @@ private void StartDaemonProcess() { // ignored } + _logger.LogInformation("mutagen daemon exited with code {exitCode}", exitCode); }; @@ -605,6 +606,7 @@ private void StartDaemonProcess() { // ignored, the process likely doesn't exist } + daemonProcess.Dispose(); } From d07dbc6600c5317a99f8b5f2453fb3b067b5ee13 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Thu, 1 May 2025 20:58:59 +1000 Subject: [PATCH 3/3] rethrow --- App/Services/MutagenController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/App/Services/MutagenController.cs b/App/Services/MutagenController.cs index 5a5641d..3931b66 100644 --- a/App/Services/MutagenController.cs +++ b/App/Services/MutagenController.cs @@ -608,6 +608,7 @@ private void StartDaemonProcess() } daemonProcess.Dispose(); + throw; } _daemonProcess = daemonProcess;