-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.
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)
public update (workerNodeKey: number): boolean {
this.pool.workerNodes[workerNodeKey].strategyData = {
virtualTaskEndTimestamp:
- this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey)
+ this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey),
}
return true
}
if (workerNode.strategyData?.virtualTaskEndTimestamp == null) {
workerNode.strategyData = {
virtualTaskEndTimestamp:
- this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey)
+ this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey),
}
}
return this.isWorkerNodeReady(workerNodeKey) &&
- (workerNode.strategyData.virtualTaskEndTimestamp as number) <
- ((workerNodes[minWorkerNodeKey].strategyData as StrategyData)
- .virtualTaskEndTimestamp as number)
+ // 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
},
/**
* Computes the worker node key virtual task end timestamp.
- *
* @param workerNodeKey - The worker node key.
* @returns The worker node key virtual task end timestamp.
*/
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 (
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
}
}