Skip to content

Commit 2495779

Browse files
authored
fix: ensure mutagen daemon log is closed (#84)
1 parent b84a4ed commit 2495779

File tree

1 file changed

+52
-15
lines changed

1 file changed

+52
-15
lines changed

App/Services/MutagenController.cs

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
using Coder.Desktop.MutagenSdk.Proto.Url;
1717
using Coder.Desktop.Vpn.Utilities;
1818
using Grpc.Core;
19-
using Microsoft.Extensions.Options;
19+
using Microsoft.Extensions.Hosting;
2020
using Microsoft.Extensions.Logging;
21+
using Microsoft.Extensions.Options;
2122
using Serilog;
2223
using DaemonTerminateRequest = Coder.Desktop.MutagenSdk.Proto.Service.Daemon.TerminateRequest;
2324
using MutagenProtocol = Coder.Desktop.MutagenSdk.Proto.Url.Protocol;
2425
using SynchronizationTerminateRequest = Coder.Desktop.MutagenSdk.Proto.Service.Synchronization.TerminateRequest;
25-
using Microsoft.Extensions.Hosting;
2626

2727
namespace Coder.Desktop.App.Services;
2828

@@ -556,25 +556,62 @@ private void StartDaemonProcess()
556556
var logPath = Path.Combine(_mutagenDataDirectory, "daemon.log");
557557
var logStream = new StreamWriter(logPath, true);
558558

559-
_daemonProcess = new Process();
560-
_daemonProcess.StartInfo.FileName = _mutagenExecutablePath;
561-
_daemonProcess.StartInfo.Arguments = "daemon run";
562-
_daemonProcess.StartInfo.Environment.Add("MUTAGEN_DATA_DIRECTORY", _mutagenDataDirectory);
563-
_daemonProcess.StartInfo.Environment.Add("MUTAGEN_SSH_CONFIG_PATH", "none"); // do not use ~/.ssh/config
559+
_logger.LogInformation("starting mutagen daemon process with executable path '{path}'", _mutagenExecutablePath);
560+
_logger.LogInformation("mutagen data directory '{path}'", _mutagenDataDirectory);
561+
_logger.LogInformation("mutagen daemon log path '{path}'", logPath);
562+
563+
var daemonProcess = new Process();
564+
daemonProcess.StartInfo.FileName = _mutagenExecutablePath;
565+
daemonProcess.StartInfo.Arguments = "daemon run";
566+
daemonProcess.StartInfo.Environment.Add("MUTAGEN_DATA_DIRECTORY", _mutagenDataDirectory);
567+
daemonProcess.StartInfo.Environment.Add("MUTAGEN_SSH_CONFIG_PATH", "none"); // do not use ~/.ssh/config
564568
// hide the console window
565-
_daemonProcess.StartInfo.CreateNoWindow = true;
569+
daemonProcess.StartInfo.CreateNoWindow = true;
566570
// shell needs to be disabled since we set the environment
567571
// https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.environment?view=net-8.0
568-
_daemonProcess.StartInfo.UseShellExecute = false;
569-
_daemonProcess.StartInfo.RedirectStandardError = true;
570-
_daemonProcess.EnableRaisingEvents = true;
571-
_daemonProcess.Exited += (object? sender, EventArgs e) =>
572+
daemonProcess.StartInfo.UseShellExecute = false;
573+
daemonProcess.StartInfo.RedirectStandardError = true;
574+
daemonProcess.EnableRaisingEvents = true;
575+
daemonProcess.Exited += (_, _) =>
572576
{
573-
_logger.LogInformation("mutagen daemon exited with code {exitCode}", _daemonProcess?.ExitCode);
577+
var exitCode = -1;
578+
try
579+
{
580+
// ReSharper disable once AccessToDisposedClosure
581+
exitCode = daemonProcess.ExitCode;
582+
}
583+
catch
584+
{
585+
// ignored
586+
}
587+
588+
_logger.LogInformation("mutagen daemon exited with code {exitCode}", exitCode);
574589
};
575-
if (!_daemonProcess.Start())
576-
throw new InvalidOperationException("Failed to start mutagen daemon process, Start returned false");
577590

591+
try
592+
{
593+
if (!daemonProcess.Start())
594+
throw new InvalidOperationException("Failed to start mutagen daemon process, Start returned false");
595+
}
596+
catch (Exception e)
597+
{
598+
_logger.LogWarning(e, "mutagen daemon failed to start");
599+
600+
logStream.Dispose();
601+
try
602+
{
603+
daemonProcess.Kill();
604+
}
605+
catch
606+
{
607+
// ignored, the process likely doesn't exist
608+
}
609+
610+
daemonProcess.Dispose();
611+
throw;
612+
}
613+
614+
_daemonProcess = daemonProcess;
578615
var writer = new LogWriter(_daemonProcess.StandardError, logStream);
579616
Task.Run(() => { _ = writer.Run(); });
580617
_logWriter = writer;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy