From 297f3bbe14ff67d6e7bf27bd9dd4088170151ce5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 7 May 2023 22:42:12 +0200 Subject: [PATCH] refactor: implement IWRR as incremental nested loops MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- ...hted-round-robin-worker-choice-strategy.ts | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) 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 } -- 2.34.1