refactor: untangle worker selection code from pool code
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 18 Apr 2023 18:22:00 +0000 (20:22 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 18 Apr 2023 18:22:00 +0000 (20:22 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/pools/abstract-pool.ts
src/pools/pool.ts
src/pools/selection-strategies/abstract-worker-choice-strategy.ts

index 67a22ffe04898f590ab70669a9d49934d6f90ad6..b299bc0172e839fdc57e165bd8e1391200a17885 100644 (file)
@@ -296,28 +296,11 @@ export abstract class AbstractPool<
   protected abstract get busy (): boolean
 
   protected internalBusy (): boolean {
-    return this.findFreeWorkerNodeKey() === -1
-  }
-
-  /** @inheritDoc */
-  public findFreeWorkerNodeKey (): number {
-    return this.workerNodes.findIndex(workerNode => {
-      return workerNode.tasksUsage?.running === 0
-    })
-  }
-
-  /** @inheritDoc */
-  public findLastFreeWorkerNodeKey (): number {
-    // It requires node >= 18.0.0
-    // return this.workerNodes.findLastIndex(workerNode => {
-    //   return workerNode.tasksUsage?.running === 0
-    // })
-    for (let i = this.workerNodes.length - 1; i >= 0; i--) {
-      if (this.workerNodes[i].tasksUsage?.running === 0) {
-        return i
-      }
-    }
-    return -1
+    return (
+      this.workerNodes.findIndex(workerNode => {
+        return workerNode.tasksUsage?.running === 0
+      }) === -1
+    )
   }
 
   /** @inheritDoc */
index bf2ac2c251d3052169727dfd6c1bab1d031e7066..f6188d8e7420cda156815baebe4821029c3b34c6 100644 (file)
@@ -140,26 +140,6 @@ export interface IPool<
    * - `'busy'`: Emitted when the pool is busy.
    */
   readonly emitter?: PoolEmitter
-  /**
-   * Finds the first free worker node key based on the number of tasks the worker has applied.
-   *
-   * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned.
-   *
-   * If no free worker is found, `-1` is returned.
-   *
-   * @returns A worker node key if there is one, `-1` otherwise.
-   */
-  findFreeWorkerNodeKey: () => number
-  /**
-   * Finds the last free worker node key based on the number of tasks the worker has applied.
-   *
-   * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned.
-   *
-   * If no free worker is found, `-1` is returned.
-   *
-   * @returns A worker node key if there is one, `-1` otherwise.
-   */
-  findLastFreeWorkerNodeKey: () => number
   /**
    * Executes the function specified in the worker constructor with the task data input parameter.
    *
index bddb8b76566fd62545e1552618712dc39d98e7b9..7eced8d5985cf5f40c7b02b385b47628ed8c7154 100644 (file)
@@ -81,9 +81,46 @@ export abstract class AbstractWorkerChoiceStrategy<
   protected findFreeWorkerNodeKey (): number {
     if (this.toggleFindLastFreeWorkerNodeKey) {
       this.toggleFindLastFreeWorkerNodeKey = false
-      return this.pool.findLastFreeWorkerNodeKey()
+      return this.findLastFreeWorkerNodeKey()
     }
     this.toggleFindLastFreeWorkerNodeKey = true
-    return this.pool.findFreeWorkerNodeKey()
+    return this.findFirstFreeWorkerNodeKey()
+  }
+
+  /**
+   * Finds the first free worker node key based on the number of tasks the worker has applied.
+   *
+   * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned.
+   *
+   * If no free worker is found, `-1` is returned.
+   *
+   * @returns A worker node key if there is one, `-1` otherwise.
+   */
+  private findFirstFreeWorkerNodeKey (): number {
+    return this.pool.workerNodes.findIndex(workerNode => {
+      return workerNode.tasksUsage?.running === 0
+    })
+  }
+
+  /**
+   * Finds the last free worker node key based on the number of tasks the worker has applied.
+   *
+   * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned.
+   *
+   * If no free worker is found, `-1` is returned.
+   *
+   * @returns A worker node key if there is one, `-1` otherwise.
+   */
+  private findLastFreeWorkerNodeKey (): number {
+    // It requires node >= 18.0.0
+    // return this.workerNodes.findLastIndex(workerNode => {
+    //   return workerNode.tasksUsage?.running === 0
+    // })
+    for (let i = this.pool.workerNodes.length - 1; i >= 0; i--) {
+      if (this.pool.workerNodes[i].tasksUsage?.running === 0) {
+        return i
+      }
+    }
+    return -1
   }
 }