Merge branch 'master' of github.com:poolifier/poolifier into interleaved-weighted...
authorJérôme Benoit <jerome.benoit@sap.com>
Tue, 30 May 2023 08:54:58 +0000 (10:54 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Tue, 30 May 2023 08:54:58 +0000 (10:54 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
1  2 
src/pools/selection-strategies/selection-strategies-types.ts
src/pools/selection-strategies/worker-choice-strategy-context.ts
tests/pools/selection-strategies/selection-strategies.test.js

index 077aa1b6a068ecf673e91befb192919717185d89,282e306db18a4c55bb1016e078ce8456ff64d843..29f1ca81dcb29ce3351fd6aa611e29039fd063cf
@@@ -7,13 -7,13 +7,13 @@@ export const WorkerChoiceStrategies = O
     */
    ROUND_ROBIN: 'ROUND_ROBIN',
    /**
-    * Less used worker selection strategy.
+    * Least used worker selection strategy.
     */
-   LESS_USED: 'LESS_USED',
+   LEAST_USED: 'LEAST_USED',
    /**
-    * Less busy worker selection strategy.
+    * Least busy worker selection strategy.
     */
-   LESS_BUSY: 'LESS_BUSY',
+   LEAST_BUSY: 'LEAST_BUSY',
    /**
     * Fair share worker selection strategy.
     */
    /**
     * Weighted round robin worker selection strategy.
     */
 -  WEIGHTED_ROUND_ROBIN: 'WEIGHTED_ROUND_ROBIN'
 +  WEIGHTED_ROUND_ROBIN: 'WEIGHTED_ROUND_ROBIN',
 +  /**
 +   * Interleaved weighted round robin worker selection strategy.
 +   *
 +   * @experimental
 +   */
 +  INTERLEAVED_WEIGHTED_ROUND_ROBIN: 'INTERLEAVED_WEIGHTED_ROUND_ROBIN'
  } as const)
  
  /**
index 0d0d269c076537bd2018cc4cc9450ea43584a6b8,21c24f7c63799561f1b32e17ebda121b5a2464d3..43bcb3adee19a9aaedf072e526f0b59235e55b40
@@@ -2,9 -2,8 +2,9 @@@ import { DEFAULT_WORKER_CHOICE_STRATEGY
  import type { IPool } from '../pool'
  import type { IWorker } from '../worker'
  import { FairShareWorkerChoiceStrategy } from './fair-share-worker-choice-strategy'
- import { LessBusyWorkerChoiceStrategy } from './less-busy-worker-choice-strategy'
- import { LessUsedWorkerChoiceStrategy } from './less-used-worker-choice-strategy'
 +import { InterleavedWeightedRoundRobinWorkerChoiceStrategy } from './interleaved-weighted-round-robin-worker-choice-strategy'
+ import { LeastBusyWorkerChoiceStrategy } from './least-busy-worker-choice-strategy'
+ import { LeastUsedWorkerChoiceStrategy } from './least-used-worker-choice-strategy'
  import { RoundRobinWorkerChoiceStrategy } from './round-robin-worker-choice-strategy'
  import type {
    IWorkerChoiceStrategy,
@@@ -57,15 -56,15 +57,15 @@@ export class WorkerChoiceStrategyContex
          )
        ],
        [
-         WorkerChoiceStrategies.LESS_USED,
-         new (LessUsedWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
+         WorkerChoiceStrategies.LEAST_USED,
+         new (LeastUsedWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
            pool,
            opts
          )
        ],
        [
-         WorkerChoiceStrategies.LESS_BUSY,
-         new (LessBusyWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
+         WorkerChoiceStrategies.LEAST_BUSY,
+         new (LeastBusyWorkerChoiceStrategy.bind(this))<Worker, Data, Response>(
            pool,
            opts
          )
          Data,
          Response
          >(pool, opts)
 +      ],
 +      [
 +        WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN,
 +        new (InterleavedWeightedRoundRobinWorkerChoiceStrategy.bind(this))<
 +        Worker,
 +        Data,
 +        Response
 +        >(pool, opts)
        ]
      ])
    }
index 05dbaefceb02742353186e7c199f6ce1f14228c8,9e3e99e3ba3f1291ea4ebe1893588c084ed064f7..ea5fc04a69dd2c1fe6cf8b124c22b63fd2af3638
@@@ -12,15 -12,12 +12,15 @@@ describe('Selection strategies test sui
  
    it('Verify that WorkerChoiceStrategies enumeration provides string values', () => {
      expect(WorkerChoiceStrategies.ROUND_ROBIN).toBe('ROUND_ROBIN')
-     expect(WorkerChoiceStrategies.LESS_USED).toBe('LESS_USED')
-     expect(WorkerChoiceStrategies.LESS_BUSY).toBe('LESS_BUSY')
+     expect(WorkerChoiceStrategies.LEAST_USED).toBe('LEAST_USED')
+     expect(WorkerChoiceStrategies.LEAST_BUSY).toBe('LEAST_BUSY')
      expect(WorkerChoiceStrategies.FAIR_SHARE).toBe('FAIR_SHARE')
      expect(WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN).toBe(
        'WEIGHTED_ROUND_ROBIN'
      )
 +    expect(WorkerChoiceStrategies.INTERLEAVED_WEIGHTED_ROUND_ROBIN).toBe(
 +      'INTERLEAVED_WEIGHTED_ROUND_ROBIN'
 +    )
    })
  
    it('Verify ROUND_ROBIN strategy is the default at pool creation', async () => {
      await pool.destroy()
    })
  
-   it('Verify LESS_USED strategy default tasks usage statistics requirements', async () => {
-     const workerChoiceStrategy = WorkerChoiceStrategies.LESS_USED
+   it('Verify LEAST_USED strategy default tasks usage statistics requirements', async () => {
+     const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_USED
      let pool = new FixedThreadPool(
        max,
        './tests/worker-files/thread/testWorker.js',
      await pool.destroy()
    })
  
-   it('Verify LESS_USED strategy can be run in a fixed pool', async () => {
+   it('Verify LEAST_USED strategy can be run in a fixed pool', async () => {
      const pool = new FixedThreadPool(
        max,
        './tests/worker-files/thread/testWorker.js',
-       { workerChoiceStrategy: WorkerChoiceStrategies.LESS_USED }
+       { workerChoiceStrategy: WorkerChoiceStrategies.LEAST_USED }
      )
-     // TODO: Create a better test to cover `LessUsedWorkerChoiceStrategy#choose`
+     // TODO: Create a better test to cover `LeastUsedWorkerChoiceStrategy#choose`
      const maxMultiplier = 2
      for (let i = 0; i < max * maxMultiplier; i++) {
        await pool.execute()
      await pool.destroy()
    })
  
-   it('Verify LESS_USED strategy can be run in a dynamic pool', async () => {
+   it('Verify LEAST_USED strategy can be run in a dynamic pool', async () => {
      const pool = new DynamicThreadPool(
        min,
        max,
        './tests/worker-files/thread/testWorker.js',
-       { workerChoiceStrategy: WorkerChoiceStrategies.LESS_USED }
+       { workerChoiceStrategy: WorkerChoiceStrategies.LEAST_USED }
      )
-     // TODO: Create a better test to cover `LessUsedWorkerChoiceStrategy#choose`
+     // TODO: Create a better test to cover `LeastUsedWorkerChoiceStrategy#choose`
      const maxMultiplier = 2
      for (let i = 0; i < max * maxMultiplier; i++) {
        await pool.execute()
      await pool.destroy()
    })
  
-   it('Verify LESS_BUSY strategy default tasks usage statistics requirements', async () => {
-     const workerChoiceStrategy = WorkerChoiceStrategies.LESS_BUSY
+   it('Verify LEAST_BUSY strategy default tasks usage statistics requirements', async () => {
+     const workerChoiceStrategy = WorkerChoiceStrategies.LEAST_BUSY
      let pool = new FixedThreadPool(
        max,
        './tests/worker-files/thread/testWorker.js',
      await pool.destroy()
    })
  
-   it('Verify LESS_BUSY strategy can be run in a fixed pool', async () => {
+   it('Verify LEAST_BUSY strategy can be run in a fixed pool', async () => {
      const pool = new FixedThreadPool(
        max,
        './tests/worker-files/thread/testWorker.js',
-       { workerChoiceStrategy: WorkerChoiceStrategies.LESS_BUSY }
+       { workerChoiceStrategy: WorkerChoiceStrategies.LEAST_BUSY }
      )
-     // TODO: Create a better test to cover `LessBusyWorkerChoiceStrategy#choose`
+     // TODO: Create a better test to cover `LeastBusyWorkerChoiceStrategy#choose`
      const maxMultiplier = 2
      for (let i = 0; i < max * maxMultiplier; i++) {
        await pool.execute()
      await pool.destroy()
    })
  
-   it('Verify LESS_BUSY strategy can be run in a dynamic pool', async () => {
+   it('Verify LEAST_BUSY strategy can be run in a dynamic pool', async () => {
      const pool = new DynamicThreadPool(
        min,
        max,
        './tests/worker-files/thread/testWorker.js',
-       { workerChoiceStrategy: WorkerChoiceStrategies.LESS_BUSY }
+       { workerChoiceStrategy: WorkerChoiceStrategies.LEAST_BUSY }
      )
-     // TODO: Create a better test to cover `LessBusyWorkerChoiceStrategy#choose`
+     // TODO: Create a better test to cover `LeastBusyWorkerChoiceStrategy#choose`
      const maxMultiplier = 2
      for (let i = 0; i < max * maxMultiplier; i++) {
        await pool.execute()