X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fselection-strategies%2Fabstract-worker-choice-strategy.ts;h=a060cea3a5ba4486059fec1f6b45dac515f155e3;hb=dc32abbbbd36504ce933a0403cc245899c25a828;hp=b5b77ff6e261519d2bbef3154ca701e059d77a16;hpb=87de9ff55a7ad494b9e9500208b9b7319c094ea6;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 b5b77ff6..a060cea3 100644 --- a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts @@ -4,6 +4,7 @@ import type { IPool } from '../pool' import type { IWorker } from '../worker' import type { IWorkerChoiceStrategy, + 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 strategyPolicy: StrategyPolicy = { + useDynamicWorker: false + } + /** @inheritDoc */ public readonly taskStatisticsRequirements: TaskStatisticsRequirements = { - runTime: false, - avgRunTime: false, - medRunTime: false, - waitTime: false, - avgWaitTime: false, - medWaitTime: false, - elu: false + runTime: { + aggregate: false, + average: false, + median: false + }, + waitTime: { + aggregate: false, + average: false, + median: false + }, + elu: { + aggregate: false, + average: false, + median: false + } } /** @@ -48,34 +63,54 @@ export abstract class AbstractWorkerChoiceStrategy< this.choose = this.choose.bind(this) } - protected setTaskStatistics (opts: WorkerChoiceStrategyOptions): void { + protected setTaskStatisticsRequirements ( + opts: WorkerChoiceStrategyOptions + ): void { if ( - this.taskStatisticsRequirements.avgRunTime && - opts.medRunTime === true + this.taskStatisticsRequirements.runTime.average && + opts.runTime?.median === true ) { - this.taskStatisticsRequirements.avgRunTime = false - this.taskStatisticsRequirements.medRunTime = opts.medRunTime as boolean + this.taskStatisticsRequirements.runTime.average = false + this.taskStatisticsRequirements.runTime.median = opts.runTime + .median as boolean } if ( - this.taskStatisticsRequirements.medRunTime && - opts.medRunTime === false + this.taskStatisticsRequirements.runTime.median && + opts.runTime?.median === false ) { - this.taskStatisticsRequirements.avgRunTime = true - this.taskStatisticsRequirements.medRunTime = opts.medRunTime as boolean + this.taskStatisticsRequirements.runTime.average = true + this.taskStatisticsRequirements.runTime.median = opts.runTime + .median as boolean } if ( - this.taskStatisticsRequirements.avgWaitTime && - opts.medWaitTime === true + this.taskStatisticsRequirements.waitTime.average && + opts.waitTime?.median === true ) { - this.taskStatisticsRequirements.avgWaitTime = false - this.taskStatisticsRequirements.medWaitTime = opts.medWaitTime as boolean + this.taskStatisticsRequirements.waitTime.average = false + this.taskStatisticsRequirements.waitTime.median = opts.waitTime + .median as boolean } if ( - this.taskStatisticsRequirements.medWaitTime && - opts.medWaitTime === false + this.taskStatisticsRequirements.waitTime.median && + opts.waitTime?.median === false ) { - this.taskStatisticsRequirements.avgWaitTime = true - this.taskStatisticsRequirements.medWaitTime = opts.medWaitTime as boolean + 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 } } @@ -94,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 } @@ -114,32 +149,46 @@ export abstract class AbstractWorkerChoiceStrategy< /** * Gets the worker task runtime. - * If the task statistics require `avgRunTime`, the average runtime is returned. - * If the task statistics require `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.taskStatisticsRequirements.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 require `avgWaitTime`, the average wait time is returned. - * If the task statistics require `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.taskStatisticsRequirements.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()) { @@ -154,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. * @@ -169,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. *