fix(POSTV1-02): 修复便携包首次启动链路
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run
This commit is contained in:
@@ -5,6 +5,19 @@ namespace Dada.Supervisor;
|
||||
|
||||
internal sealed class SupervisorRuntime : IAsyncDisposable
|
||||
{
|
||||
private static readonly string[] RequiredDataDirectories =
|
||||
[
|
||||
"db",
|
||||
Path.Combine("content", "references"),
|
||||
Path.Combine("content", "generated"),
|
||||
Path.Combine("content", "exports"),
|
||||
"managed-assets",
|
||||
"derived-assets",
|
||||
"staging",
|
||||
Path.Combine("logs", "api"),
|
||||
Path.Combine("logs", "worker"),
|
||||
Path.Combine("logs", "supervisor"),
|
||||
];
|
||||
private readonly ICredentialStore credentials;
|
||||
private ManagedComponentSupervisor? api;
|
||||
private ManagedComponentSupervisor? worker;
|
||||
@@ -26,6 +39,7 @@ internal sealed class SupervisorRuntime : IAsyncDisposable
|
||||
{
|
||||
return SupervisorState.StartupFailed;
|
||||
}
|
||||
EnsureRuntimeDirectories(configuration.LocalDataRoot);
|
||||
try
|
||||
{
|
||||
logger = new StructuredJsonlLogger(Path.Combine(configuration.LocalDataRoot, "logs", "supervisor"), "supervisor");
|
||||
@@ -42,12 +56,30 @@ internal sealed class SupervisorRuntime : IAsyncDisposable
|
||||
var workerEntry = Path.Combine(AppContext.BaseDirectory, "server", "worker.mjs");
|
||||
if (!File.Exists(node) || !File.Exists(apiEntry) || !File.Exists(workerEntry)) return SupervisorState.StartupFailed;
|
||||
|
||||
api = CreateComponent(node, apiEntry, ChildRole.Api, SupervisorState.ApiDegraded);
|
||||
await api.StartAsync(cancellationToken);
|
||||
try
|
||||
{
|
||||
api = CreateComponent(node, apiEntry, ChildRole.Api, SupervisorState.ApiDegraded);
|
||||
await api.StartAsync(cancellationToken);
|
||||
|
||||
worker = CreateComponent(node, workerEntry, ChildRole.Worker, SupervisorState.WorkerDegraded);
|
||||
await worker.StartAsync(cancellationToken);
|
||||
return TryLog(new StructuredLogEvent("ready", ErrorCategory: "none")) ? SupervisorState.Ready : SupervisorState.StorageUnavailable;
|
||||
worker = CreateComponent(node, workerEntry, ChildRole.Worker, SupervisorState.WorkerDegraded);
|
||||
await worker.StartAsync(cancellationToken);
|
||||
return TryLog(new StructuredLogEvent("ready", ErrorCategory: "none")) ? SupervisorState.Ready : SupervisorState.StorageUnavailable;
|
||||
}
|
||||
catch
|
||||
{
|
||||
await StopComponentsAsync();
|
||||
return TryLog(new StructuredLogEvent("failed", ErrorCategory: "service_unavailable"))
|
||||
? SupervisorState.StartupFailed
|
||||
: SupervisorState.StorageUnavailable;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void EnsureRuntimeDirectories(string dataRoot)
|
||||
{
|
||||
foreach (var directory in RequiredDataDirectories)
|
||||
{
|
||||
Directory.CreateDirectory(Path.Combine(dataRoot, directory));
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureAdminPepper()
|
||||
@@ -102,10 +134,26 @@ internal sealed class SupervisorRuntime : IAsyncDisposable
|
||||
}
|
||||
|
||||
public async ValueTask DisposeAsync()
|
||||
{
|
||||
await StopComponentsAsync();
|
||||
}
|
||||
|
||||
private async Task StopComponentsAsync()
|
||||
{
|
||||
var stops = new List<Task>();
|
||||
if (worker is not null) stops.Add(worker.DisposeAsync().AsTask());
|
||||
if (api is not null) stops.Add(api.DisposeAsync().AsTask());
|
||||
await Task.WhenAll(stops);
|
||||
try
|
||||
{
|
||||
await Task.WhenAll(stops);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
finally
|
||||
{
|
||||
worker = null;
|
||||
api = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user