From 673d651cc621bcf2325bd31df7f6850c81371c4a Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Tue, 15 Jul 2025 11:35:14 +0200 Subject: [PATCH] feat: account task wait time in least ELU strategy MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../least-elu-worker-choice-strategy.ts | 12 +++++++--- tests/pools/abstract-pool.test.mjs | 15 +++++++++++-- .../selection-strategies.test.mjs | 22 ++++++++++++++----- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/pools/selection-strategies/least-elu-worker-choice-strategy.ts b/src/pools/selection-strategies/least-elu-worker-choice-strategy.ts index 9ee3090f6..011625f0e 100644 --- a/src/pools/selection-strategies/least-elu-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/least-elu-worker-choice-strategy.ts @@ -36,7 +36,11 @@ export class LeastEluWorkerChoiceStrategy< median: false, }, runTime: DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS, - waitTime: DEFAULT_MEASUREMENT_STATISTICS_REQUIREMENTS, + waitTime: { + aggregate: true, + average: false, + median: false, + }, }) /** @inheritDoc */ @@ -79,8 +83,10 @@ export class LeastEluWorkerChoiceStrategy< if (minWorkerNodeKey === -1) { return workerNodeKey } - return (workerNode.usage.elu.active.aggregate ?? 0) < - (workerNodes[minWorkerNodeKey].usage.elu.active.aggregate ?? 0) + return (workerNode.usage.waitTime.aggregate ?? 0) + + (workerNode.usage.elu.active.aggregate ?? 0) < + (workerNodes[minWorkerNodeKey].usage.waitTime.aggregate ?? 0) + + (workerNodes[minWorkerNodeKey].usage.elu.active.aggregate ?? 0) ? workerNodeKey : minWorkerNodeKey }, diff --git a/tests/pools/abstract-pool.test.mjs b/tests/pools/abstract-pool.test.mjs index 210ac186e..3c448b7e9 100644 --- a/tests/pools/abstract-pool.test.mjs +++ b/tests/pools/abstract-pool.test.mjs @@ -1658,13 +1658,24 @@ describe('Abstract pool test suite', () => { sequentiallyStolen: 0, stolen: 0, }, - waitTime: { + waitTime: expect.objectContaining({ history: expect.any(CircularBuffer), - }, + }), }) expect( workerNode.getTaskFunctionWorkerUsage('echo').tasks.executed ).toBeGreaterThan(0) + if ( + workerNode.getTaskFunctionWorkerUsage('echo').waitTime.aggregate == null + ) { + expect( + workerNode.getTaskFunctionWorkerUsage('echo').waitTime.aggregate + ).toBeUndefined() + } else { + expect( + workerNode.getTaskFunctionWorkerUsage('echo').waitTime.aggregate + ).toBeGreaterThan(0) + } if ( workerNode.getTaskFunctionWorkerUsage('echo').elu.active.aggregate == null diff --git a/tests/pools/selection-strategies/selection-strategies.test.mjs b/tests/pools/selection-strategies/selection-strategies.test.mjs index 7869709d6..276579280 100644 --- a/tests/pools/selection-strategies/selection-strategies.test.mjs +++ b/tests/pools/selection-strategies/selection-strategies.test.mjs @@ -894,7 +894,7 @@ describe('Selection strategies test suite', () => { median: false, }, waitTime: { - aggregate: false, + aggregate: true, average: false, median: false, }, @@ -920,7 +920,7 @@ describe('Selection strategies test suite', () => { median: false, }, waitTime: { - aggregate: false, + aggregate: true, average: false, median: false, }, @@ -964,14 +964,19 @@ describe('Selection strategies test suite', () => { sequentiallyStolen: 0, stolen: 0, }, - waitTime: { + waitTime: expect.objectContaining({ history: expect.any(CircularBuffer), - }, + }), }) expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0) expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual( max * maxMultiplier ) + if (workerNode.usage.waitTime.aggregate == null) { + expect(workerNode.usage.waitTime.aggregate).toBeUndefined() + } else { + expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0) + } if (workerNode.usage.elu.active.aggregate == null) { expect(workerNode.usage.elu.active.aggregate).toBeUndefined() } else { @@ -1039,14 +1044,19 @@ describe('Selection strategies test suite', () => { sequentiallyStolen: 0, stolen: 0, }, - waitTime: { + waitTime: expect.objectContaining({ history: expect.any(CircularBuffer), - }, + }), }) expect(workerNode.usage.tasks.executed).toBeGreaterThanOrEqual(0) expect(workerNode.usage.tasks.executed).toBeLessThanOrEqual( max * maxMultiplier ) + if (workerNode.usage.waitTime.aggregate == null) { + expect(workerNode.usage.waitTime.aggregate).toBeUndefined() + } else { + expect(workerNode.usage.waitTime.aggregate).toBeGreaterThan(0) + } if (workerNode.usage.elu.active.aggregate == null) { expect(workerNode.usage.elu.active.aggregate).toBeUndefined() } else { -- 2.43.0