X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpools%2Fselection-strategies%2Fabstract-worker-choice-strategy.ts;h=a060cea3a5ba4486059fec1f6b45dac515f155e3;hb=dc32abbbbd36504ce933a0403cc245899c25a828;hp=f064c2e0838e0a68b1a809648c457308cf107eb4;hpb=a4e07f7216246b772e13783937a97c87105b8fc3;p=poolifier.git diff --git a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts index f064c2e0..a060cea3 100644 --- a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts @@ -4,7 +4,8 @@ import type { IPool } from '../pool' import type { IWorker } from '../worker' import type { IWorkerChoiceStrategy, - TaskStatistics, + StrategyPolicy, + TaskStatisticsRequirements, WorkerChoiceStrategyOptions } from './selection-strategies-types' @@ -24,15 +25,29 @@ export abstract class AbstractWorkerChoiceStrategy< * Toggles finding the last free worker node key. */ private toggleFindLastFreeWorkerNodeKey: boolean = false + /** @inheritDoc */ - public readonly taskStatistics: TaskStatistics = { - runTime: false, - avgRunTime: false, - medRunTime: false, - waitTime: false, - avgWaitTime: false, - medWaitTime: false, - elu: false + public readonly strategyPolicy: StrategyPolicy = { + useDynamicWorker: false + } + + /** @inheritDoc */ + public readonly taskStatisticsRequirements: TaskStatisticsRequirements = { + runTime: { + aggregate: false, + average: false, + median: false + }, + waitTime: { + aggregate: false, + average: false, + median: false + }, + elu: { + aggregate: false, + average: false, + median: false + } } /** @@ -48,22 +63,54 @@ export abstract class AbstractWorkerChoiceStrategy< this.choose = this.choose.bind(this) } - protected setTaskStatistics (opts: WorkerChoiceStrategyOptions): void { - if (this.taskStatistics.avgRunTime && opts.medRunTime === true) { - this.taskStatistics.avgRunTime = false - this.taskStatistics.medRunTime = opts.medRunTime as boolean + 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.taskStatistics.medRunTime && opts.medRunTime === false) { - this.taskStatistics.avgRunTime = true - this.taskStatistics.medRunTime = opts.medRunTime 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.taskStatistics.avgWaitTime && opts.medWaitTime === true) { - this.taskStatistics.avgWaitTime = false - this.taskStatistics.medWaitTime = opts.medWaitTime 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.taskStatistics.medWaitTime && opts.medWaitTime === false) { - this.taskStatistics.avgWaitTime = true - this.taskStatistics.medWaitTime = opts.medWaitTime 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 + } + if ( + this.taskStatisticsRequirements.elu.median && + opts.elu?.median === false + ) { + this.taskStatisticsRequirements.elu.average = true + this.taskStatisticsRequirements.elu.median = opts.elu.median as boolean } } @@ -82,7 +129,7 @@ export abstract class AbstractWorkerChoiceStrategy< /** @inheritDoc */ public setOptions (opts: WorkerChoiceStrategyOptions): void { opts = opts ?? DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS - this.setTaskStatistics(opts) + this.setTaskStatisticsRequirements(opts) this.opts = opts } @@ -102,32 +149,46 @@ export abstract class AbstractWorkerChoiceStrategy< /** * Gets the worker task runtime. - * If the task statistics wants `avgRunTime`, the average runtime is returned. - * If the task statistics wants `medRunTime`, the median runtime is returned. + * If the task statistics require the average runtime, the average runtime is returned. + * If the task statistics require the median runtime , the median runtime is returned. * * @param workerNodeKey - The worker node key. * @returns The worker task runtime. */ protected getWorkerTaskRunTime (workerNodeKey: number): number { - return this.taskStatistics.medRunTime + return this.taskStatisticsRequirements.runTime.median ? this.pool.workerNodes[workerNodeKey].workerUsage.runTime.median : this.pool.workerNodes[workerNodeKey].workerUsage.runTime.average } /** * Gets the worker task wait time. - * If the task statistics wants `avgWaitTime`, the average wait time is returned. - * If the task statistics wants `medWaitTime`, the median wait time is returned. + * If the task statistics require the average wait time, the average wait time is returned. + * If the task statistics require the median wait time, the median wait time is returned. * * @param workerNodeKey - The worker node key. * @returns The worker task wait time. */ - protected getWorkerWaitTime (workerNodeKey: number): number { - return this.taskStatistics.medWaitTime + protected getWorkerTaskWaitTime (workerNodeKey: number): number { + return this.taskStatisticsRequirements.waitTime.median ? this.pool.workerNodes[workerNodeKey].workerUsage.runTime.median : this.pool.workerNodes[workerNodeKey].workerUsage.runTime.average } + /** + * Gets the worker task ELU. + * If the task statistics require the average ELU, the average ELU is returned. + * If the task statistics require the median ELU, the median ELU is returned. + * + * @param workerNodeKey - The worker node key. + * @returns The worker task ELU. + */ + protected getWorkerTaskElu (workerNodeKey: number): number { + return this.taskStatisticsRequirements.elu.median + ? this.pool.workerNodes[workerNodeKey].workerUsage.elu.active.median + : this.pool.workerNodes[workerNodeKey].workerUsage.elu.active.average + } + protected computeDefaultWorkerWeight (): number { let cpusCycleTimeWeight = 0 for (const cpu of cpus()) { @@ -142,7 +203,7 @@ export abstract class AbstractWorkerChoiceStrategy< /** * 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 a worker is found with `0` executing tasks, it is detected as free and its worker node key is returned. * * If no free worker is found, `-1` is returned. * @@ -157,7 +218,7 @@ export abstract class AbstractWorkerChoiceStrategy< /** * 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 a worker is found with `0` executing tasks, it is detected as free and its worker node key is returned. * * If no free worker is found, `-1` is returned. *