From: Jérôme Benoit Date: Thu, 10 Jul 2025 10:28:28 +0000 (+0200) Subject: fix: worker node destroy race condition at pool destroy X-Git-Tag: v5.0.7~4 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=655eec07671468758ff6484391c8c8e8fb09701c;p=poolifier.git fix: worker node destroy race condition at pool destroy Signed-off-by: Jérôme Benoit --- 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)