From 28508bc64312a5e0acab86e83eef490b30f4ab48 Mon Sep 17 00:00:00 2001 From: paisley <8197966+su8su@users.noreply.github.com> Date: Thu, 2 Apr 2026 16:45:23 +0800 Subject: [PATCH] fix(gateway): refine process termination and wait logic on retry (#750) --- electron/gateway/manager.ts | 4 +++- electron/gateway/startup-orchestrator.ts | 13 ++++++++++--- electron/gateway/supervisor.ts | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/electron/gateway/manager.ts b/electron/gateway/manager.ts index 415274a6a..e61172087 100644 --- a/electron/gateway/manager.ts +++ b/electron/gateway/manager.ts @@ -297,11 +297,13 @@ export class GatewayManager extends EventEmitter { process.kill(pid, 0); // Still alive — keep this.process so later cleanup can reach it } catch { - // Process is gone — safe to clear the handle + // Process is gone — safe to clear the handle and ownership flag this.process = null; + this.ownsProcess = false; } } else { this.process = null; + this.ownsProcess = false; } } }, diff --git a/electron/gateway/startup-orchestrator.ts b/electron/gateway/startup-orchestrator.ts index 102618554..4036a6efe 100644 --- a/electron/gateway/startup-orchestrator.ts +++ b/electron/gateway/startup-orchestrator.ts @@ -98,14 +98,15 @@ export async function runGatewayStartupSequence(hooks: StartupHooks): Promise { logger.warn('Failed to terminate owned process before retry:', err); }); } + await hooks.delay(1000); hooks.assertLifecycle('start/retry-pre-port-wait'); // Wait for port to become free before retrying (handles lingering processes). // Use a short-polling AbortController so that a superseding stop()/restart() @@ -122,6 +123,12 @@ export async function runGatewayStartupSequence(hooks: StartupHooks): Promise((resolve) => {