X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fselection-strategies%2Ffair-share-worker-choice-strategy.ts;h=88e12b94fa8ef50b50ede22026e95f0242000d45;hb=884743b122a66be45c94d83d9230e28a9ab43836;hp=ee617d36253cac9c6e8b0970725b139c1ad5b1a5;hpb=e9ed6eeed0f1c96d89c1506ee342b3000a95b4ba;p=poolifier.git diff --git a/src/pools/selection-strategies/fair-share-worker-choice-strategy.ts b/src/pools/selection-strategies/fair-share-worker-choice-strategy.ts index ee617d36..88e12b94 100644 --- a/src/pools/selection-strategies/fair-share-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/fair-share-worker-choice-strategy.ts @@ -1,18 +1,16 @@ import type { IPool } from '../pool.js' -import { DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS } from '../utils.js' import type { IWorker } from '../worker.js' import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy.js' import { type IWorkerChoiceStrategy, Measurements, type TaskStatisticsRequirements, - type WorkerChoiceStrategyOptions + 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. @@ -29,14 +27,18 @@ 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 */ @@ -60,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 } @@ -78,15 +80,12 @@ export class FairShareWorkerChoiceStrategy< } private fairShareNextWorkerNodeKey (): number | undefined { - if (this.pool.workerNodes.length === 0) { - return undefined - } return this.pool.workerNodes.reduce( (minWorkerNodeKey, workerNode, workerNodeKey, workerNodes) => { if (workerNode.strategyData?.virtualTaskEndTimestamp == null) { workerNode.strategyData = { virtualTaskEndTimestamp: - this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey) + this.computeWorkerNodeVirtualTaskEndTimestamp(workerNodeKey), } } return this.isWorkerNodeReady(workerNodeKey) && @@ -103,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. */ @@ -120,12 +118,13 @@ export class FairShareWorkerChoiceStrategy< workerNodeKey: number, workerNodeVirtualTaskStartTimestamp: number ): number { - const workerNodeTaskRunTime = + const workerNodeTaskExecutionTime = + this.getWorkerNodeTaskWaitTime(workerNodeKey) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.opts!.measurement === Measurements.elu + (this.opts!.measurement === Measurements.elu ? this.getWorkerNodeTaskElu(workerNodeKey) - : this.getWorkerNodeTaskRunTime(workerNodeKey) - return workerNodeVirtualTaskStartTimestamp + workerNodeTaskRunTime + : this.getWorkerNodeTaskRunTime(workerNodeKey)) + return workerNodeVirtualTaskStartTimestamp + workerNodeTaskExecutionTime } private getWorkerNodeVirtualTaskStartTimestamp ( @@ -135,7 +134,7 @@ export class FairShareWorkerChoiceStrategy< this.pool.workerNodes[workerNodeKey]?.strategyData ?.virtualTaskEndTimestamp const now = performance.now() - return now < (virtualTaskEndTimestamp ?? -Infinity) + return now < (virtualTaskEndTimestamp ?? Number.NEGATIVE_INFINITY) ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion virtualTaskEndTimestamp! : now