fix: fix tasks stealing dynamic worker node handling
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 20 May 2024 16:06:20 +0000 (18:06 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Mon, 20 May 2024 16:06:20 +0000 (18:06 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
CHANGELOG.md
docs/api.md
src/pools/abstract-pool.ts
src/worker/worker-options.ts

index 2348d103e066bd223fe2c8f8f344007be6f74246..257f095b39d55b90caff617af3c5ae23a8d7d484 100644 (file)
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+### Fixed
+
+- Ensure tasks stealing dynamic worker node is not destroyed on inactivity.
+
 ## [4.0.9] - 2024-05-19
 
 ### Changed
index 458017a18d79ff284a479e16de94580befd44709..28e6aad2c3b56bf529890aad889c9029e4b69777 100644 (file)
@@ -153,8 +153,8 @@ An object with these properties:
 `opts` (optional) An object with these properties:
 
 - `killBehavior` (optional) - Dictates if your worker will be deleted in case a task is active on it.  
-  **KillBehaviors.SOFT**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker **won't** be deleted.  
-  **KillBehaviors.HARD**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker will be deleted.  
+  **KillBehaviors.SOFT**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but the worker is stealing tasks or a task is executing or queued, then the worker **won't** be deleted.  
+  **KillBehaviors.HARD**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but the worker is stealing tasks or a task is executing or queued, then the worker will be deleted.  
   This option only apply to the newly created workers.  
   Default: `KillBehaviors.SOFT`
 
index 649d5f0d0d5e268b26f3285f3dd27aaae52a1c2d..95d3970fdbd859f71ce67e5dd4b779bc6afeddcc 100644 (file)
@@ -1597,6 +1597,7 @@ export abstract class AbstractPool<
       const localWorkerNodeKey = this.getWorkerNodeKeyByWorkerId(
         message.workerId
       )
+      const workerInfo = this.getWorkerInfo(localWorkerNodeKey)
       const workerUsage = this.workerNodes[localWorkerNodeKey]?.usage
       // Kill message received from worker
       if (
@@ -1605,6 +1606,8 @@ export abstract class AbstractPool<
           ((this.opts.enableTasksQueue === false &&
             workerUsage.tasks.executing === 0) ||
             (this.opts.enableTasksQueue === true &&
+              workerInfo != null &&
+              !workerInfo.stealing &&
               workerUsage.tasks.executing === 0 &&
               this.tasksQueueSize(localWorkerNodeKey) === 0)))
       ) {
index 7f9c650694b83c5c1675aa0291f2b312711be522..50cf85bb03910a03fdd25f9e479e2b03dea45270 100644 (file)
@@ -4,11 +4,11 @@
 export const KillBehaviors: Readonly<{ SOFT: 'SOFT', HARD: 'HARD' }> =
   Object.freeze({
     /**
-     * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker **wont** be deleted.
+     * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but the worker is stealing tasks or a task is executing or queued, then the worker **wont** be deleted.
      */
     SOFT: 'SOFT',
     /**
-     * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker will be deleted.
+     * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but the worker is stealing tasks or a task is executing or queued, then the worker will be deleted.
      */
     HARD: 'HARD'
   } as const)
@@ -30,8 +30,8 @@ export interface WorkerOptions {
   /**
    * `killBehavior` dictates if your worker will be deleted in case a task is active on it.
    *
-   * - SOFT: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker **won't** be deleted.
-   * - HARD: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker will be deleted.
+   * - SOFT: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but the worker is stealing tasks or a task is executing or queued, then the worker **won't** be deleted.
+   * - HARD: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but the worker is stealing tasks or a task is executing or queued, then the worker will be deleted.
    *
    * This option only apply to the newly created workers.
    *