]> Piment Noir Git Repositories - poolifier.git/commitdiff
feat: account task wait time in least ELU strategy
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 15 Jul 2025 09:35:14 +0000 (11:35 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 15 Jul 2025 09:35:14 +0000 (11:35 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/pools/selection-strategies/least-elu-worker-choice-strategy.ts
tests/pools/abstract-pool.test.mjs
tests/pools/selection-strategies/selection-strategies.test.mjs

index 9ee3090f69f6900b88340b182f798589a97d5ee8..011625f0e85074a10e1e61cfb75243e58fef3883 100644 (file)
@@ -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
       },
index 210ac186ef081e54bad0db4d3a6b5d0bde063062..3c448b7e90f49176240696c6b68560b183465356 100644 (file)
@@ -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
index 7869709d6ae89482efa384cd887edeb90145ca96..276579280c35643cded6739b4a0fd0b5e0b4daa5 100644 (file)
@@ -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 {