fix: ensure no tasks are queued when trying to soft kill a dynamic worker
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 16 Jun 2023 10:37:28 +0000 (12:37 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 16 Jun 2023 10:37:28 +0000 (12:37 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
CHANGELOG.md
README.md
src/pools/abstract-pool.ts
src/worker/worker-options.ts

index 581de285b619f035458add3d1f2cb256ab0368f0..8466e2baab4542741f54fae07909f2205c52c385 100644 (file)
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+### Fixed
+
+- Ensure no tasks are queued when trying to soft kill a dynamic worker.
+
 ## [2.6.2] - 2023-06-12
 
 ### Fixed
index 140663c502d04d82d58578845595ba219f693b29..94b71d758aa1f1a8c8b4079f360591e3d1213cbd 100644 (file)
--- a/README.md
+++ b/README.md
@@ -242,8 +242,8 @@ This method will call the terminate method on each worker.
   Default: `60000`
 
 - `killBehavior` (optional) - Dictates if your async unit (worker/process) will be deleted in case that a task is active on it.  
-  **KillBehaviors.SOFT**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing, then the worker **won't** be deleted.  
-  **KillBehaviors.HARD**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing, then the worker will be deleted.  
+  **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.  
   This option only apply to the newly created workers.  
   Default: `KillBehaviors.SOFT`
 
index 6f5f3aeb1f581ea3306169cdb35d2bf9b71e0c01..21cfb395785cdc14a82987498b85236b4295c8dd 100644 (file)
@@ -720,13 +720,17 @@ export abstract class AbstractPool<
       const currentWorkerNodeKey = this.getWorkerNodeKey(worker)
       if (
         isKillBehavior(KillBehaviors.HARD, message.kill) ||
-        (message.kill != null &&
+        (this.opts.enableTasksQueue === false &&
+          message.kill != null &&
           this.workerNodes[currentWorkerNodeKey].workerUsage.tasks.executing ===
-            0)
+            0) ||
+        (this.opts.enableTasksQueue === true &&
+          message.kill != null &&
+          this.workerNodes[currentWorkerNodeKey].workerUsage.tasks.executing ===
+            0 &&
+          this.tasksQueueSize(currentWorkerNodeKey) === 0)
       ) {
         // Kill message received from the worker: no new tasks are submitted to that worker for a while ( > maxInactiveTime)
-        this.flushTasksQueue(currentWorkerNodeKey)
-        // FIXME: wait for tasks to be finished
         void (this.destroyWorker(worker) as Promise<void>)
       }
     })
index b71a90e5817b6304c2b19a745127c47bbaff7ac2..90aea1efc04e9c2d5015b910909831bc4b71f4af 100644 (file)
@@ -3,11 +3,11 @@
  */
 export const KillBehaviors = Object.freeze({
   /**
-   * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing, then the worker **wont** be deleted.
+   * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker **wont** be deleted.
    */
   SOFT: 'SOFT',
   /**
-   * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing, then the worker will be deleted.
+   * If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing or queued, then the worker will be deleted.
    */
   HARD: 'HARD'
 } as const)
@@ -59,8 +59,8 @@ export interface WorkerOptions {
   /**
    * `killBehavior` dictates if your async unit (worker/process) will be deleted in case that a task is active on it.
    *
-   * - SOFT: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing, then the worker **won't** be deleted.
-   * - HARD: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still executing, then the worker will be deleted.
+   * - 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.
    *
    * This option only apply to the newly created workers.
    *