import type { IPool } from '../pool.js'
+import { getWorkerChoiceStrategyRetries } from '../utils.js'
import type { IWorker } from '../worker.js'
-import { getWorkerChoiceStrategyRetries } from '../../utils.js'
import { FairShareWorkerChoiceStrategy } from './fair-share-worker-choice-strategy.js'
import { InterleavedWeightedRoundRobinWorkerChoiceStrategy } from './interleaved-weighted-round-robin-worker-choice-strategy.js'
import { LeastBusyWorkerChoiceStrategy } from './least-busy-worker-choice-strategy.js'
-import { LeastUsedWorkerChoiceStrategy } from './least-used-worker-choice-strategy.js'
import { LeastEluWorkerChoiceStrategy } from './least-elu-worker-choice-strategy.js'
+import { LeastUsedWorkerChoiceStrategy } from './least-used-worker-choice-strategy.js'
import { RoundRobinWorkerChoiceStrategy } from './round-robin-worker-choice-strategy.js'
import type {
IWorkerChoiceStrategy,
Response = unknown
> {
/**
- * The worker choice strategies registered in the context.
+ * The number of worker choice strategy execution retries.
+ */
+ public retriesCount: number
+
+ /**
+ * The worker choice strategy instances registered in the context.
*/
private readonly workerChoiceStrategies: Map<
WorkerChoiceStrategy,
>
/**
- * The number of worker choice strategy execution retries.
+ * The maximum number of worker choice strategy execution retries.
*/
private readonly retries: number
>(pool, opts)
]
])
+ this.retriesCount = 0
this.retries = getWorkerChoiceStrategyRetries(pool, opts)
}
* Executes the worker choice strategy in the context algorithm.
*
* @returns The key of the worker node.
- * @throws {@link https://nodejs.org/api/errors.html#class-error} If after configured retries the worker node key is null or undefined.
+ * @throws {@link https://nodejs.org/api/errors.html#class-error} If after computed retries the worker node key is null or undefined.
*/
public execute (): number {
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- const workerChoiceStrategy = this.workerChoiceStrategies.get(
- this.workerChoiceStrategy
- )!
- if (!workerChoiceStrategy.hasPoolWorkerNodesReady()) {
- return this.execute()
- }
- return this.executeStrategy(workerChoiceStrategy)
+ return this.executeStrategy(
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ this.workerChoiceStrategies.get(this.workerChoiceStrategy)!
+ )
}
/**
*
* @param workerChoiceStrategy - The worker choice strategy.
* @returns The key of the worker node.
- * @throws {@link https://nodejs.org/api/errors.html#class-error} If after configured retries the worker node key is null or undefined.
+ * @throws {@link https://nodejs.org/api/errors.html#class-error} If after computed retries the worker node key is null or undefined.
*/
private executeStrategy (workerChoiceStrategy: IWorkerChoiceStrategy): number {
let workerNodeKey: number | undefined
do {
workerNodeKey = workerChoiceStrategy.choose()
if (workerNodeKey == null && chooseCount > 0) {
- retriesCount++
+ ++retriesCount
+ ++this.retriesCount
}
- chooseCount++
+ ++chooseCount
} while (workerNodeKey == null && retriesCount < this.retries)
if (workerNodeKey == null) {
throw new Error(