refactor: cleanup worker node back pressure API
[poolifier.git] / src / pools / selection-strategies / abstract-worker-choice-strategy.ts
index 6bd4fe741ce403b282034ba4d3559a3faf93bbfa..d4fcd8d0a95bae029d23ef386fd7cbd2d17a7dde 100644 (file)
@@ -7,6 +7,7 @@ import type { IPool } from '../pool'
 import type { IWorker } from '../worker'
 import type {
   IWorkerChoiceStrategy,
+  MeasurementStatisticsRequirements,
   StrategyPolicy,
   TaskStatisticsRequirements,
   WorkerChoiceStrategyOptions
@@ -57,51 +58,31 @@ export abstract class AbstractWorkerChoiceStrategy<
   protected setTaskStatisticsRequirements (
     opts: WorkerChoiceStrategyOptions
   ): void {
-    if (
-      this.taskStatisticsRequirements.runTime.average &&
-      opts.runTime?.median === true
-    ) {
-      this.taskStatisticsRequirements.runTime.average = false
-      this.taskStatisticsRequirements.runTime.median = opts.runTime
-        .median as boolean
-    }
-    if (
-      this.taskStatisticsRequirements.runTime.median &&
-      opts.runTime?.median === false
-    ) {
-      this.taskStatisticsRequirements.runTime.average = true
-      this.taskStatisticsRequirements.runTime.median = opts.runTime
-        .median as boolean
-    }
-    if (
-      this.taskStatisticsRequirements.waitTime.average &&
-      opts.waitTime?.median === true
-    ) {
-      this.taskStatisticsRequirements.waitTime.average = false
-      this.taskStatisticsRequirements.waitTime.median = opts.waitTime
-        .median as boolean
-    }
-    if (
-      this.taskStatisticsRequirements.waitTime.median &&
-      opts.waitTime?.median === false
-    ) {
-      this.taskStatisticsRequirements.waitTime.average = true
-      this.taskStatisticsRequirements.waitTime.median = opts.waitTime
-        .median as boolean
-    }
-    if (
-      this.taskStatisticsRequirements.elu.average &&
-      opts.elu?.median === true
-    ) {
-      this.taskStatisticsRequirements.elu.average = false
-      this.taskStatisticsRequirements.elu.median = opts.elu.median as boolean
+    this.toggleMedianMeasurementStatisticsRequirements(
+      this.taskStatisticsRequirements.runTime,
+      opts.runTime?.median as boolean
+    )
+    this.toggleMedianMeasurementStatisticsRequirements(
+      this.taskStatisticsRequirements.waitTime,
+      opts.waitTime?.median as boolean
+    )
+    this.toggleMedianMeasurementStatisticsRequirements(
+      this.taskStatisticsRequirements.elu,
+      opts.elu?.median as boolean
+    )
+  }
+
+  private toggleMedianMeasurementStatisticsRequirements (
+    measurementStatisticsRequirements: MeasurementStatisticsRequirements,
+    toggleMedian: boolean
+  ): void {
+    if (measurementStatisticsRequirements.average && toggleMedian) {
+      measurementStatisticsRequirements.average = false
+      measurementStatisticsRequirements.median = toggleMedian
     }
-    if (
-      this.taskStatisticsRequirements.elu.median &&
-      opts.elu?.median === false
-    ) {
-      this.taskStatisticsRequirements.elu.average = true
-      this.taskStatisticsRequirements.elu.median = opts.elu.median as boolean
+    if (measurementStatisticsRequirements.median && !toggleMedian) {
+      measurementStatisticsRequirements.average = true
+      measurementStatisticsRequirements.median = toggleMedian
     }
   }
 
@@ -133,6 +114,16 @@ export abstract class AbstractWorkerChoiceStrategy<
     return this.pool.workerNodes[workerNodeKey].info.ready
   }
 
+  /**
+   * Whether the worker node has back pressure or not (i.e. its tasks queue is full).
+   *
+   * @param workerNodeKey - The worker node key.
+   * @returns `true` if the worker node has back pressure, `false` otherwise.
+   */
+  protected hasWorkerNodeBackPressure (workerNodeKey: number): boolean {
+    return this.pool.hasWorkerNodeBackPressure(workerNodeKey)
+  }
+
   /**
    * Gets the worker task runtime.
    * If the task statistics require the average runtime, the average runtime is returned.