From 655eec07671468758ff6484391c8c8e8fb09701c Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Thu, 10 Jul 2025 12:28:28 +0200 Subject: [PATCH] fix: worker node destroy race condition at pool destroy MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/pools/abstract-pool.ts | 5 +++-- src/pools/utils.ts | 2 +- tests/test-utils.cjs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 1b7a9d758..22da4e00b 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -1061,6 +1061,9 @@ export abstract class AbstractPool< protected createAndSetupDynamicWorkerNode (): number { const workerNodeKey = this.createAndSetupWorkerNode() this.registerWorkerMessageListener(workerNodeKey, message => { + if (this.destroying) { + return + } this.checkMessageWorkerId(message) const localWorkerNodeKey = this.getWorkerNodeKeyByWorkerId( message.workerId @@ -1072,8 +1075,6 @@ export abstract class AbstractPool< this.isWorkerNodeIdle(localWorkerNodeKey) && !this.isWorkerNodeStealing(localWorkerNodeKey)) ) { - // Flag the worker node as not ready immediately - this.flagWorkerNodeAsNotReady(localWorkerNodeKey) this.destroyWorkerNode(localWorkerNodeKey).catch((error: unknown) => { this.emitter?.emit(PoolEvents.error, error) }) diff --git a/src/pools/utils.ts b/src/pools/utils.ts index fce4550fe..93cb42070 100644 --- a/src/pools/utils.ts +++ b/src/pools/utils.ts @@ -470,7 +470,7 @@ export const waitWorkerNodeEvents = async < } const listener = () => { ++events - if (events === numberOfEventsToWait) { + if (events >= numberOfEventsToWait) { if (timeoutHandle != null) clearTimeout(timeoutHandle) workerNode.off(workerNodeEvent, listener) resolve(events) diff --git a/tests/test-utils.cjs b/tests/test-utils.cjs index 62f080019..4b73d633b 100644 --- a/tests/test-utils.cjs +++ b/tests/test-utils.cjs @@ -25,7 +25,7 @@ const waitWorkerEvents = async ( }, timeoutMs) const listener = () => { events++ - if (events === numberOfEventsToWait) { + if (events >= numberOfEventsToWait) { clearTimeout(timeout) listeners.forEach(({ listener, workerNode }) => { workerNode.worker.off(workerEvent, listener) -- 2.43.0