X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpools%2Fselection-strategies%2Fselection-strategies-utils.ts;h=1c0b91b4de0ae9e6ca8a3c93ce11c06fdec39b1b;hb=8b7aa4204c27efd1dc699f7baea65b5262bd26b3;hp=d1e60e0350839893631a9e153ef143521ca2f6b3;hpb=85bbc7ab16c9f69a5dd358b71e3e6d4204dfd630;p=poolifier.git diff --git a/src/pools/selection-strategies/selection-strategies-utils.ts b/src/pools/selection-strategies/selection-strategies-utils.ts index d1e60e03..1c0b91b4 100644 --- a/src/pools/selection-strategies/selection-strategies-utils.ts +++ b/src/pools/selection-strategies/selection-strategies-utils.ts @@ -10,9 +10,12 @@ import { LeastUsedWorkerChoiceStrategy } from './least-used-worker-choice-strate import { RoundRobinWorkerChoiceStrategy } from './round-robin-worker-choice-strategy.js' import { type IWorkerChoiceStrategy, + type MeasurementStatisticsRequirements, + type StrategyPolicy, + type TaskStatisticsRequirements, WorkerChoiceStrategies, type WorkerChoiceStrategy, - type WorkerChoiceStrategyOptions + type WorkerChoiceStrategyOptions, } from './selection-strategies-types.js' import { WeightedRoundRobinWorkerChoiceStrategy } from './weighted-round-robin-worker-choice-strategy.js' import type { WorkerChoiceStrategiesContext } from './worker-choice-strategies-context.js' @@ -92,9 +95,63 @@ export const buildWorkerChoiceStrategyOptions = < ...{ runTime: { median: false }, waitTime: { median: false }, - elu: { median: false } + elu: { median: false }, + }, + ...opts, + } +} + +export const toggleMedianMeasurementStatisticsRequirements = ( + measurementStatisticsRequirements: MeasurementStatisticsRequirements, + toggleMedian: boolean +): void => { + if (measurementStatisticsRequirements.average && toggleMedian) { + measurementStatisticsRequirements.average = false + measurementStatisticsRequirements.median = toggleMedian + } + if (measurementStatisticsRequirements.median && !toggleMedian) { + measurementStatisticsRequirements.average = true + measurementStatisticsRequirements.median = toggleMedian + } +} + +export const buildWorkerChoiceStrategiesPolicy = ( + workerChoiceStrategies: Map +): StrategyPolicy => { + const policies: StrategyPolicy[] = Array.from( + workerChoiceStrategies, + ([_, workerChoiceStrategy]) => workerChoiceStrategy.strategyPolicy + ) + return { + dynamicWorkerUsage: policies.some(p => p.dynamicWorkerUsage), + dynamicWorkerReady: policies.some(p => p.dynamicWorkerReady), + } +} + +export const buildWorkerChoiceStrategiesTaskStatisticsRequirements = ( + workerChoiceStrategies: Map +): TaskStatisticsRequirements => { + const taskStatisticsRequirements: TaskStatisticsRequirements[] = Array.from( + workerChoiceStrategies, + ([_, workerChoiceStrategy]) => + workerChoiceStrategy.taskStatisticsRequirements + ) + return { + runTime: { + aggregate: taskStatisticsRequirements.some(r => r.runTime.aggregate), + average: taskStatisticsRequirements.some(r => r.runTime.average), + median: taskStatisticsRequirements.some(r => r.runTime.median), + }, + waitTime: { + aggregate: taskStatisticsRequirements.some(r => r.waitTime.aggregate), + average: taskStatisticsRequirements.some(r => r.waitTime.average), + median: taskStatisticsRequirements.some(r => r.waitTime.median), + }, + elu: { + aggregate: taskStatisticsRequirements.some(r => r.elu.aggregate), + average: taskStatisticsRequirements.some(r => r.elu.average), + median: taskStatisticsRequirements.some(r => r.elu.median), }, - ...opts } }