} from './selection-strategies-types.js'
import { WorkerChoiceStrategies } from './selection-strategies-types.js'
import {
+ buildWorkerChoiceStrategiesPolicy,
+ buildWorkerChoiceStrategiesTaskStatisticsRequirements,
getWorkerChoiceStrategiesRetries,
getWorkerChoiceStrategy
} from './selection-strategies-utils.js'
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.
*/
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<Worker, Data, Response>(
+ 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
}
/**
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)
+ }
}
/**
* @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.
* @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)
}
/**
}
}
+ /**
+ * 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<WorkerChoiceStrategy>,
+ 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<Worker, Data, Response>,
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)
+ }
}