]> Piment Noir Git Repositories - poolifier.git/commitdiff
fix: worker node destroy race condition at pool destroy
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 10 Jul 2025 10:28:28 +0000 (12:28 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 10 Jul 2025 10:28:28 +0000 (12:28 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/pools/abstract-pool.ts
src/pools/utils.ts
tests/test-utils.cjs

index 1b7a9d7587256a9f1d9cb34db6ebad2e4ad47154..22da4e00b0fce07966a73d43c40ba41af4ce2700 100644 (file)
@@ -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)
         })
index fce4550fede365a836af546c7d16677d9e5eb18b..93cb4207053aea154c7f67e4f3138bb698e82c3b 100644 (file)
@@ -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)
index 62f08001959e2a7be03b73ded5d80370f2d098ee..4b73d633b5e43a73e27030bf82f2f8eb5e28c282 100644 (file)
@@ -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)