build(ci): refine autofix GH action
[poolifier.git] / src / pools / selection-strategies / fair-share-worker-choice-strategy.ts
index a337278ba9ce75a074c1b32d751d8f928ec86496..88e12b94fa8ef50b50ede22026e95f0242000d45 100644 (file)
@@ -1,21 +1,16 @@
-import {
-  DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS,
-  DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS
-} from '../../utils'
-import type { IPool } from '../pool'
-import type { IWorker, StrategyData } from '../worker'
-import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy'
+import type { IPool } from '../pool.js'
+import type { IWorker } from '../worker.js'
+import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy.js'
 import {
   type IWorkerChoiceStrategy,
   Measurements,
   type TaskStatisticsRequirements,
-  type WorkerChoiceStrategyOptions
-} from './selection-strategies-types'
+  type WorkerChoiceStrategyOptions,
+} from './selection-strategies-types.js'
 
 /**
  * Selects the next worker with a fair share scheduling algorithm.
  * Loosely modeled after the fair queueing algorithm: https://en.wikipedia.org/wiki/Fair_queuing.
- *
  * @typeParam Worker - Type of worker which manages the strategy.
  * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
  * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
@@ -32,20 +27,24 @@ export class FairShareWorkerChoiceStrategy<
     runTime: {
       aggregate: true,
       average: true,
-      median: false
+      median: false,
+    },
+    waitTime: {
+      aggregate: true,
+      average: true,
+      median: false,
     },
-    waitTime: DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS,
     elu: {
       aggregate: true,
       average: true,
-      median: false
-    }
+      median: false,
+    },
   }
 
   /** @inheritDoc */
   public constructor (
     pool: IPool<Worker, Data, Response>,
-    opts: WorkerChoiceStrategyOptions = DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS
+    opts?: WorkerChoiceStrategyOptions
   ) {
     super(pool, opts)
     this.setTaskStatisticsRequirements(this.opts)
@@ -63,7 +62,7 @@ export class FairShareWorkerChoiceStrategy<
   public update (workerNodeKey: number): boolean {
     this.pool.workerNodes[workerNodeKey].strategyData = {
       virtualTaskEndTimestamp:
-        this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey)
+        this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey),
     }
     return true
   }
@@ -86,12 +85,14 @@ export class FairShareWorkerChoiceStrategy<
         if (workerNode.strategyData?.virtualTaskEndTimestamp == null) {
           workerNode.strategyData = {
             virtualTaskEndTimestamp:
-              this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey)
+              this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey),
           }
         }
-        return (workerNode.strategyData.virtualTaskEndTimestamp as number) <
-          ((workerNodes[minWorkerNodeKey].strategyData as StrategyData)
-            .virtualTaskEndTimestamp as number)
+        return this.isWorkerNodeReady(workerNodeKey) &&
+          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+          workerNode.strategyData.virtualTaskEndTimestamp! <
+            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+            workerNodes[minWorkerNodeKey].strategyData!.virtualTaskEndTimestamp!
           ? workerNodeKey
           : minWorkerNodeKey
       },
@@ -101,7 +102,6 @@ export class FairShareWorkerChoiceStrategy<
 
   /**
    * Computes the worker node key virtual task end timestamp.
-   *
    * @param workerNodeKey - The worker node key.
    * @returns The worker node key virtual task end timestamp.
    */
@@ -118,11 +118,13 @@ export class FairShareWorkerChoiceStrategy<
     workerNodeKey: number,
     workerNodeVirtualTaskStartTimestamp: number
   ): number {
-    const workerNodeTaskRunTime =
-      this.opts.measurement === Measurements.elu
+    const workerNodeTaskExecutionTime =
+      this.getWorkerNodeTaskWaitTime(workerNodeKey) +
+      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+      (this.opts!.measurement === Measurements.elu
         ? this.getWorkerNodeTaskElu(workerNodeKey)
-        : this.getWorkerNodeTaskRunTime(workerNodeKey)
-    return workerNodeVirtualTaskStartTimestamp + workerNodeTaskRunTime
+        : this.getWorkerNodeTaskRunTime(workerNodeKey))
+    return workerNodeVirtualTaskStartTimestamp + workerNodeTaskExecutionTime
   }
 
   private getWorkerNodeVirtualTaskStartTimestamp (
@@ -132,8 +134,9 @@ export class FairShareWorkerChoiceStrategy<
       this.pool.workerNodes[workerNodeKey]?.strategyData
         ?.virtualTaskEndTimestamp
     const now = performance.now()
-    return now < (virtualTaskEndTimestamp ?? -Infinity)
-      ? (virtualTaskEndTimestamp as number)
+    return now < (virtualTaskEndTimestamp ?? Number.NEGATIVE_INFINITY)
+      ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+      virtualTaskEndTimestamp!
       : now
   }
 }