X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fselection-strategies%2Fworker-choice-strategies-context.ts;h=185fed71287e668179e201d7ee79848463fd1d76;hb=63af54001cdb7be2f14d51be593a7f96c8c480b6;hp=2650dd373ddf2b4ffe1395553993ba1792ad1ecd;hpb=3e931141fe4cbbb1221697a1ee4fd26f4c419c82;p=poolifier.git diff --git a/src/pools/selection-strategies/worker-choice-strategies-context.ts b/src/pools/selection-strategies/worker-choice-strategies-context.ts index 2650dd37..185fed71 100644 --- a/src/pools/selection-strategies/worker-choice-strategies-context.ts +++ b/src/pools/selection-strategies/worker-choice-strategies-context.ts @@ -9,6 +9,8 @@ import type { } from './selection-strategies-types.js' import { WorkerChoiceStrategies } from './selection-strategies-types.js' import { + buildWorkerChoiceStrategiesPolicy, + buildWorkerChoiceStrategiesTaskStatisticsRequirements, getWorkerChoiceStrategiesRetries, getWorkerChoiceStrategy } from './selection-strategies-utils.js' @@ -43,6 +45,16 @@ export class WorkerChoiceStrategiesContext< IWorkerChoiceStrategy > + /** + * The active worker choice strategies in the context policy. + */ + private workerChoiceStrategiesPolicy: StrategyPolicy + + /** + * The active worker choice strategies in the context task statistics requirements. + */ + private workerChoiceStrategiesTaskStatisticsRequirements: TaskStatisticsRequirements + /** * The maximum number of worker choice strategies execution retries. */ @@ -71,55 +83,36 @@ export class WorkerChoiceStrategiesContext< for (const workerChoiceStrategy of workerChoiceStrategies) { this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts) } + this.workerChoiceStrategiesPolicy = buildWorkerChoiceStrategiesPolicy( + this.workerChoiceStrategies + ) + this.workerChoiceStrategiesTaskStatisticsRequirements = + buildWorkerChoiceStrategiesTaskStatisticsRequirements( + this.workerChoiceStrategies + ) this.retriesCount = 0 - this.retries = getWorkerChoiceStrategiesRetries(this.pool, opts) + this.retries = getWorkerChoiceStrategiesRetries( + this.pool, + opts + ) } /** - * Gets the active worker choice strategies policy in the context. + * Gets the active worker choice strategies in the context policy. * * @returns The strategies policy. */ public getPolicy (): StrategyPolicy { - const policies: StrategyPolicy[] = [] - for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) { - policies.push(workerChoiceStrategy.strategyPolicy) - } - return { - dynamicWorkerUsage: policies.some(p => p.dynamicWorkerUsage), - dynamicWorkerReady: policies.some(p => p.dynamicWorkerReady) - } + return this.workerChoiceStrategiesPolicy } /** * Gets the active worker choice strategies in the context task statistics requirements. * - * @returns The task statistics requirements. + * @returns The strategies task statistics requirements. */ public getTaskStatisticsRequirements (): TaskStatisticsRequirements { - const taskStatisticsRequirements: TaskStatisticsRequirements[] = [] - for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) { - taskStatisticsRequirements.push( - 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) - } - } + return this.workerChoiceStrategiesTaskStatisticsRequirements } /** @@ -132,8 +125,10 @@ export class WorkerChoiceStrategiesContext< workerChoiceStrategy: WorkerChoiceStrategy, opts?: WorkerChoiceStrategyOptions ): void { - this.defaultWorkerChoiceStrategy = workerChoiceStrategy - this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts) + if (workerChoiceStrategy !== this.defaultWorkerChoiceStrategy) { + this.defaultWorkerChoiceStrategy = workerChoiceStrategy + this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts) + } } /** @@ -142,15 +137,14 @@ export class WorkerChoiceStrategiesContext< * @returns `true` if the update is successful, `false` otherwise. */ public update (workerNodeKey: number): boolean { - const res: boolean[] = [] - for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) { - res.push(workerChoiceStrategy.update(workerNodeKey)) - } - return res.every(r => r) + return Array.from( + this.workerChoiceStrategies, + ([_, workerChoiceStrategy]) => workerChoiceStrategy.update(workerNodeKey) + ).every(r => r) } /** - * Executes the worker choice strategy in the context algorithm. + * Executes the given worker choice strategy in the context algorithm. * * @param workerChoiceStrategy - The worker choice strategy algorithm to execute. @defaultValue this.defaultWorkerChoiceStrategy * @returns The key of the worker node. @@ -200,11 +194,10 @@ export class WorkerChoiceStrategiesContext< * @returns `true` if the removal is successful, `false` otherwise. */ public remove (workerNodeKey: number): boolean { - const res: boolean[] = [] - for (const workerChoiceStrategy of this.workerChoiceStrategies.values()) { - res.push(workerChoiceStrategy.remove(workerNodeKey)) - } - return res.every(r => r) + return Array.from( + this.workerChoiceStrategies, + ([_, workerChoiceStrategy]) => workerChoiceStrategy.remove(workerNodeKey) + ).every(r => r) } /** @@ -218,6 +211,42 @@ export class WorkerChoiceStrategiesContext< } } + /** + * Synchronizes the active worker choice strategies in the context with the given worker choice strategies. + * + * @param workerChoiceStrategies - The worker choice strategies to synchronize. + * @param opts - The worker choice strategy options. + */ + public syncWorkerChoiceStrategies ( + workerChoiceStrategies: Set, + opts?: WorkerChoiceStrategyOptions + ): void { + for (const workerChoiceStrategy of this.workerChoiceStrategies.keys()) { + if (!workerChoiceStrategies.has(workerChoiceStrategy)) { + this.removeWorkerChoiceStrategy(workerChoiceStrategy) + } + } + for (const workerChoiceStrategy of workerChoiceStrategies) { + if (!this.workerChoiceStrategies.has(workerChoiceStrategy)) { + this.addWorkerChoiceStrategy(workerChoiceStrategy, this.pool, opts) + } + } + this.workerChoiceStrategiesPolicy = buildWorkerChoiceStrategiesPolicy( + this.workerChoiceStrategies + ) + this.workerChoiceStrategiesTaskStatisticsRequirements = + buildWorkerChoiceStrategiesTaskStatisticsRequirements( + this.workerChoiceStrategies + ) + } + + /** + * Adds a worker choice strategy to the context. + * + * @param workerChoiceStrategy - The worker choice strategy to add. + * @param opts - The worker choice strategy options. + * @returns The worker choice strategies. + */ private addWorkerChoiceStrategy ( workerChoiceStrategy: WorkerChoiceStrategy, pool: IPool, @@ -237,9 +266,15 @@ export class WorkerChoiceStrategiesContext< return this.workerChoiceStrategies } - // private removeWorkerChoiceStrategy ( - // workerChoiceStrategy: WorkerChoiceStrategy - // ): boolean { - // return this.workerChoiceStrategies.delete(workerChoiceStrategy) - // } + /** + * Removes a worker choice strategy from the context. + * + * @param workerChoiceStrategy - The worker choice strategy to remove. + * @returns `true` if the worker choice strategy is removed, `false` otherwise. + */ + private removeWorkerChoiceStrategy ( + workerChoiceStrategy: WorkerChoiceStrategy + ): boolean { + return this.workerChoiceStrategies.delete(workerChoiceStrategy) + } }