feat: complete TASK-WP0-07 supervisor

This commit is contained in:
suyx
2026-07-27 23:28:36 +08:00
parent 2dd6f5c2c2
commit 096a1f1279
22 changed files with 1717 additions and 6 deletions
@@ -0,0 +1,54 @@
namespace Dada.Supervisor;
internal enum SupervisorState
{
Starting,
Ready,
StartupFailed,
PortInUse,
ApiDegraded,
WorkerDegraded,
StorageFull,
StorageUnavailable,
DiagnosticsRunning,
DiagnosticsReady,
}
internal enum SupervisorAction
{
OpenProduct,
OpenChrome,
OpenEdge,
OpenDiagnostics,
CheckExistingInstance,
Retry,
RestartServices,
Exit,
}
internal static class SupervisorActions
{
internal static IReadOnlyList<SupervisorAction> For(SupervisorState state) => state switch
{
SupervisorState.Starting => [SupervisorAction.OpenDiagnostics, SupervisorAction.Exit],
SupervisorState.Ready => [SupervisorAction.OpenProduct, SupervisorAction.OpenChrome, SupervisorAction.OpenEdge, SupervisorAction.OpenDiagnostics, SupervisorAction.RestartServices, SupervisorAction.Exit],
SupervisorState.StartupFailed => [SupervisorAction.Retry, SupervisorAction.OpenDiagnostics, SupervisorAction.Exit],
SupervisorState.PortInUse => [SupervisorAction.CheckExistingInstance, SupervisorAction.Retry, SupervisorAction.OpenDiagnostics, SupervisorAction.Exit],
SupervisorState.ApiDegraded => [SupervisorAction.OpenDiagnostics, SupervisorAction.RestartServices, SupervisorAction.Exit],
SupervisorState.WorkerDegraded => [SupervisorAction.OpenProduct, SupervisorAction.OpenChrome, SupervisorAction.OpenEdge, SupervisorAction.OpenDiagnostics, SupervisorAction.RestartServices, SupervisorAction.Exit],
SupervisorState.StorageFull => [SupervisorAction.OpenProduct, SupervisorAction.OpenChrome, SupervisorAction.OpenEdge, SupervisorAction.OpenDiagnostics, SupervisorAction.Exit],
SupervisorState.StorageUnavailable => [SupervisorAction.Retry, SupervisorAction.OpenDiagnostics, SupervisorAction.Exit],
SupervisorState.DiagnosticsRunning => [SupervisorAction.Exit],
SupervisorState.DiagnosticsReady => [SupervisorAction.OpenDiagnostics, SupervisorAction.Exit],
_ => throw new ArgumentOutOfRangeException(nameof(state)),
};
}
internal static class RestartPolicy
{
internal const int MaximumRestarts = 3;
internal static readonly IReadOnlyList<TimeSpan> Delays = [TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(15)];
internal static bool CanRestart(int completedRestarts, TimeSpan failureWindow) =>
completedRestarts < MaximumRestarts && failureWindow <= TimeSpan.FromMinutes(5);
}