fix: observe automation evidence without timeout delay
This commit is contained in:
@@ -237,9 +237,11 @@ internal static class PilotCli
|
|||||||
// terminal evidence is durable. Killing an active AutoCAD
|
// terminal evidence is durable. Killing an active AutoCAD
|
||||||
// command before that boundary would turn ForceAfterEvidence
|
// command before that boundary would turn ForceAfterEvidence
|
||||||
// into an unsafe general process killer.
|
// into an unsafe general process killer.
|
||||||
var evidenceTimeout = Task.Delay(TimeSpan.FromSeconds(Math.Clamp(config.GracefulExitTimeoutSeconds, 1, 120)));
|
// Evidence is written by the Plant process, not by a task owned
|
||||||
while (!exit.IsCompleted && !HasCompletedEvidence(evidencePath))
|
// by this host. Poll it with a bounded interval: waiting only on
|
||||||
if (await Task.WhenAny(exit, evidenceTimeout) == evidenceTimeout) break;
|
// the timeout task delays an already durable result by a full
|
||||||
|
// timeout and makes the preview/apply hand-off unnecessarily slow.
|
||||||
|
await WaitForEvidenceOrExitAsync(exit, evidencePath, TimeSpan.FromSeconds(Math.Clamp(config.GracefulExitTimeoutSeconds, 1, 120)));
|
||||||
if (exit.IsCompleted) gracefulExit = true;
|
if (exit.IsCompleted) gracefulExit = true;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -297,6 +299,12 @@ internal static class PilotCli
|
|||||||
private static bool HashesEqual(IReadOnlyDictionary<string,string> x, IReadOnlyDictionary<string,string> y) => x.Count == y.Count && x.All(p => y.TryGetValue(p.Key, out var value) && value == p.Value);
|
private static bool HashesEqual(IReadOnlyDictionary<string,string> x, IReadOnlyDictionary<string,string> y) => x.Count == y.Count && x.All(p => y.TryGetValue(p.Key, out var value) && value == p.Value);
|
||||||
private static PilotExecutionService CreateService(ResolvedLauncherPaths paths) => new(new PackageManifestValidator(), new PilotRootPolicy(paths.LocalLauncherRoot), new NextPilotSafetyGate(), new Sha256FileHasher(), new StartupScriptBuilder(), PermitService, new Probe(), new OperatingSystemProcessInvoker(), new PathResolver());
|
private static PilotExecutionService CreateService(ResolvedLauncherPaths paths) => new(new PackageManifestValidator(), new PilotRootPolicy(paths.LocalLauncherRoot), new NextPilotSafetyGate(), new Sha256FileHasher(), new StartupScriptBuilder(), PermitService, new Probe(), new OperatingSystemProcessInvoker(), new PathResolver());
|
||||||
private static async Task WaitForExitAsync(int processId) { using var process = Process.GetProcessById(processId); await process.WaitForExitAsync(); }
|
private static async Task WaitForExitAsync(int processId) { using var process = Process.GetProcessById(processId); await process.WaitForExitAsync(); }
|
||||||
|
private static async Task WaitForEvidenceOrExitAsync(Task exit, string evidencePath, TimeSpan timeout)
|
||||||
|
{
|
||||||
|
var deadline = DateTimeOffset.UtcNow + timeout;
|
||||||
|
while (!exit.IsCompleted && !HasCompletedEvidence(evidencePath) && DateTimeOffset.UtcNow < deadline)
|
||||||
|
await Task.WhenAny(exit, Task.Delay(TimeSpan.FromMilliseconds(250)));
|
||||||
|
}
|
||||||
private static bool HasCompletedEvidence(string path)
|
private static bool HasCompletedEvidence(string path)
|
||||||
{
|
{
|
||||||
try { using var json = JsonDocument.Parse(File.ReadAllText(path)); return json.RootElement.TryGetProperty("Completed", out var completed) && completed.ValueKind == JsonValueKind.True; }
|
try { using var json = JsonDocument.Parse(File.ReadAllText(path)); return json.RootElement.TryGetProperty("Completed", out var completed) && completed.ValueKind == JsonValueKind.True; }
|
||||||
|
|||||||
Reference in New Issue
Block a user