From: Jérôme Benoit Date: Sun, 7 May 2023 20:42:12 +0000 (+0200) Subject: refactor: implement IWRR as incremental nested loops X-Git-Tag: v2.5.0~3^2~43 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=297f3bbe14ff67d6e7bf27bd9dd4088170151ce5;p=poolifier.git refactor: implement IWRR as incremental nested loops Signed-off-by: Jérôme Benoit --- diff --git a/src/pools/selection-strategies/interleaved-weighted-round-robin-worker-choice-strategy.ts b/src/pools/selection-strategies/interleaved-weighted-round-robin-worker-choice-strategy.ts index 44d4689f..89576e33 100644 --- a/src/pools/selection-strategies/interleaved-weighted-round-robin-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/interleaved-weighted-round-robin-worker-choice-strategy.ts @@ -73,46 +73,38 @@ export class InterleavedWeightedRoundRobinWorkerChoiceStrategy< /** @inheritDoc */ public choose (): number { - let chosenWorkerNodeKey: number - const workerWeight = - this.opts.weights?.[this.currentWorkerNodeId] ?? this.defaultWorkerWeight - if (workerWeight >= this.roundWeights[this.currentRoundId]) { - chosenWorkerNodeKey = this.currentWorkerNodeId - this.currentWorkerNodeId = - this.currentWorkerNodeId === this.pool.workerNodes.length - 1 - ? 0 - : this.currentWorkerNodeId + 1 - if (this.currentWorkerNodeId === this.pool.workerNodes.length - 1) { - this.currentRoundId = - this.currentRoundId === this.roundWeights.length - 1 - ? 0 - : this.currentRoundId + 1 - } - } else { - let roundId: number | undefined - let workerNodeId: number | undefined + let roundId: number | undefined + let workerNodeId: number | undefined + for ( + let round = this.currentRoundId; + round < this.roundWeights.length; + round++ + ) { for ( - let round = this.currentRoundId; - round < this.roundWeights.length; - round++ + let workerNodeKey = this.currentWorkerNodeId; + workerNodeKey < this.pool.workerNodes.length; + workerNodeKey++ ) { - for ( - let workerNodeKey = this.currentWorkerNodeId + 1; - workerNodeKey < this.pool.workerNodes.length; - workerNodeKey++ - ) { - const workerWeight = - this.opts.weights?.[workerNodeKey] ?? this.defaultWorkerWeight - if (workerWeight >= this.roundWeights[round]) { - roundId = round - workerNodeId = workerNodeKey - break - } + const workerWeight = + this.opts.weights?.[workerNodeKey] ?? this.defaultWorkerWeight + if (workerWeight >= this.roundWeights[round]) { + roundId = round + workerNodeId = workerNodeKey + break } } - this.currentRoundId = roundId ?? 0 - this.currentWorkerNodeId = workerNodeId ?? 0 - chosenWorkerNodeKey = this.currentWorkerNodeId + } + this.currentRoundId = roundId ?? 0 + this.currentWorkerNodeId = workerNodeId ?? 0 + const chosenWorkerNodeKey = this.currentWorkerNodeId + if (this.currentWorkerNodeId === this.pool.workerNodes.length - 1) { + this.currentWorkerNodeId = 0 + this.currentRoundId = + this.currentRoundId === this.roundWeights.length - 1 + ? 0 + : this.currentRoundId + 1 + } else { + this.currentWorkerNodeId = this.currentWorkerNodeId + 1 } return chosenWorkerNodeKey }