Abstract AdvancedWatchdog

Move Windows specific functionality out to `WindowsWatchdog`.
This commit is contained in:
Jordan Dominion
2023-10-21 18:26:53 -04:00
parent f6a843e651
commit 4b02e43c38
3 changed files with 97 additions and 11 deletions
@@ -22,7 +22,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// <summary>
/// A <see cref="IWatchdog"/> that, instead of killing servers for updates, uses the wonders of filesystem links to swap out changes without killing the server process.
/// </summary>
class AdvancedWatchdog : BasicWatchdog
abstract class AdvancedWatchdog : BasicWatchdog
{
/// <summary>
/// The <see cref="SwappableDmbProvider"/> for <see cref="WatchdogBase.LastLaunchParameters"/>.
@@ -125,7 +125,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
}
/// <inheritdoc />
protected override async Task DisposeAndNullControllersImpl()
protected sealed override async Task DisposeAndNullControllersImpl()
{
await base.DisposeAndNullControllersImpl();
@@ -138,7 +138,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
}
/// <inheritdoc />
protected override async Task<MonitorAction> HandleNormalReboot(CancellationToken cancellationToken)
protected sealed override async Task<MonitorAction> HandleNormalReboot(CancellationToken cancellationToken)
{
if (pendingSwappable != null)
{
@@ -231,7 +231,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
}
/// <inheritdoc />
protected override async Task HandleNewDmbAvailable(CancellationToken cancellationToken)
protected sealed override async Task HandleNewDmbAvailable(CancellationToken cancellationToken)
{
IDmbProvider compileJobProvider = DmbFactory.LockNextDmb(1);
bool canSeamlesslySwap = true;
@@ -317,18 +317,14 @@ namespace Tgstation.Server.Host.Components.Watchdog
/// </summary>
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
/// <returns>A <see cref="Task"/> representing the running operation.</returns>
protected virtual async Task ApplyInitialDmb(CancellationToken cancellationToken)
{
Server.ReattachInformation.InitialDmb = await DmbFactory.FromCompileJob(Server.CompileJob, cancellationToken);
}
protected abstract Task ApplyInitialDmb(CancellationToken cancellationToken);
/// <summary>
/// Create a <see cref="SwappableDmbProvider"/> for a given <paramref name="dmbProvider"/>.
/// </summary>
/// <param name="dmbProvider">The <see cref="IDmbProvider"/> to create a <see cref="SwappableDmbProvider"/> for.</param>
/// <returns>A new <see cref="SwappableDmbProvider"/>.</returns>
protected virtual SwappableDmbProvider CreateSwappableDmbProvider(IDmbProvider dmbProvider)
=> new SwappableDmbProvider(dmbProvider, GameIOManager, SymlinkFactory);
protected abstract SwappableDmbProvider CreateSwappableDmbProvider(IDmbProvider dmbProvider);
/// <inheritdoc />
protected override async Task SessionStartupPersist(CancellationToken cancellationToken)
@@ -0,0 +1,90 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Tgstation.Server.Api.Models.Internal;
using Tgstation.Server.Host.Components.Chat;
using Tgstation.Server.Host.Components.Deployment;
using Tgstation.Server.Host.Components.Deployment.Remote;
using Tgstation.Server.Host.Components.Events;
using Tgstation.Server.Host.Components.Session;
using Tgstation.Server.Host.Core;
using Tgstation.Server.Host.IO;
using Tgstation.Server.Host.Jobs;
using Tgstation.Server.Host.Utils;
namespace Tgstation.Server.Host.Components.Watchdog
{
/// <summary>
/// A variant of the <see cref="AdvancedWatchdog"/> that works on Windows systems.
/// </summary>
sealed class WindowsWatchdog : AdvancedWatchdog
{
/// <summary>
/// Initializes a new instance of the <see cref="WindowsWatchdog"/> class.
/// </summary>
/// <param name="chat">The <see cref="IChatManager"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="sessionControllerFactory">The <see cref="ISessionControllerFactory"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="dmbFactory">The <see cref="IDmbFactory"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="sessionPersistor">The <see cref="ISessionPersistor"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="jobManager">The <see cref="IJobManager"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="serverControl">The <see cref="IServerControl"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="asyncDelayer">The <see cref="IAsyncDelayer"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="diagnosticsIOManager">The <see cref="IIOManager"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="eventConsumer">The <see cref="IEventConsumer"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="remoteDeploymentManagerFactory">The <see cref="IRemoteDeploymentManagerFactory"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="gameIOManager">The <see cref="IIOManager"/> pointing to the game directory for the <see cref="AdvancedWatchdog"/>..</param>
/// <param name="symlinkFactory">The <see cref="ISymlinkFactory"/> for the <see cref="AdvancedWatchdog"/>.</param>
/// <param name="logger">The <see cref="ILogger"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="initialLaunchParameters">The <see cref="DreamDaemonLaunchParameters"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="instance">The <see cref="Api.Models.Instance"/> for the <see cref="WatchdogBase"/>.</param>
/// <param name="autoStart">The autostart value for the <see cref="WatchdogBase"/>.</param>
public WindowsWatchdog(
IChatManager chat,
ISessionControllerFactory sessionControllerFactory,
IDmbFactory dmbFactory,
ISessionPersistor sessionPersistor,
IJobManager jobManager,
IServerControl serverControl,
IAsyncDelayer asyncDelayer,
IIOManager diagnosticsIOManager,
IEventConsumer eventConsumer,
IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory,
IIOManager gameIOManager,
ISymlinkFactory symlinkFactory,
ILogger<WindowsWatchdog> logger,
DreamDaemonLaunchParameters initialLaunchParameters,
Api.Models.Instance instance,
bool autoStart)
: base(
chat,
sessionControllerFactory,
dmbFactory,
sessionPersistor,
jobManager,
serverControl,
asyncDelayer,
diagnosticsIOManager,
eventConsumer,
remoteDeploymentManagerFactory,
gameIOManager,
symlinkFactory,
logger,
initialLaunchParameters,
instance,
autoStart)
{
}
/// <inheritdoc />
protected override async Task ApplyInitialDmb(CancellationToken cancellationToken)
{
Server.ReattachInformation.InitialDmb = await DmbFactory.FromCompileJob(Server.CompileJob, cancellationToken);
}
/// <inheritdoc />
protected override SwappableDmbProvider CreateSwappableDmbProvider(IDmbProvider dmbProvider)
=> new SwappableDmbProvider(dmbProvider, GameIOManager, SymlinkFactory);
}
}
@@ -78,7 +78,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
remoteDeploymentManagerFactory,
gameIOManager,
SymlinkFactory,
LoggerFactory.CreateLogger<AdvancedWatchdog>(),
LoggerFactory.CreateLogger<WindowsWatchdog>(),
settings,
instance,
settings.AutoStart ?? throw new ArgumentNullException(nameof(settings)));