fix: ensure worker choice is retried at least the pool max size
[poolifier.git] / tests / pools / selection-strategies / selection-strategies.test.mjs
index 4a2ace0469d1da108fe49e3c5f776ab3ad8a5825..200e83c7c83af1eaca13ec86e62efee724402d3b 100644 (file)
@@ -66,14 +66,9 @@ describe('Selection strategies test suite', () => {
       expect(pool.workerChoiceStrategyContext.workerChoiceStrategy).toBe(
         workerChoiceStrategy
       )
-      expect(pool.opts.workerChoiceStrategyOptions).toStrictEqual({
-        retries: 6,
-        runTime: { median: false },
-        waitTime: { median: false },
-        elu: { median: false }
-      })
+      expect(pool.opts.workerChoiceStrategyOptions).toBeUndefined()
       expect(pool.workerChoiceStrategyContext.opts).toStrictEqual({
-        retries: 6,
+        retries: pool.info.maxSize,
         runTime: { median: false },
         waitTime: { median: false },
         elu: { median: false }
@@ -86,19 +81,14 @@ describe('Selection strategies test suite', () => {
         max,
         './tests/worker-files/cluster/testWorker.js'
       )
-      pool.setWorkerChoiceStrategy(workerChoiceStrategy, { retries: 3 })
+      pool.setWorkerChoiceStrategy(workerChoiceStrategy)
       expect(pool.opts.workerChoiceStrategy).toBe(workerChoiceStrategy)
       expect(pool.workerChoiceStrategyContext.workerChoiceStrategy).toBe(
         workerChoiceStrategy
       )
-      expect(pool.opts.workerChoiceStrategyOptions).toStrictEqual({
-        retries: 3,
-        runTime: { median: false },
-        waitTime: { median: false },
-        elu: { median: false }
-      })
+      expect(pool.opts.workerChoiceStrategyOptions).toBeUndefined()
       expect(pool.workerChoiceStrategyContext.opts).toStrictEqual({
-        retries: 3,
+        retries: pool.info.maxSize,
         runTime: { median: false },
         waitTime: { median: false },
         elu: { median: false }
@@ -174,6 +164,25 @@ describe('Selection strategies test suite', () => {
     await pool.destroy()
   })
 
+  it('Verify strategies wait for worker node readiness in dynamic pool', async () => {
+    const pool = new DynamicThreadPool(
+      min,
+      max,
+      './tests/worker-files/thread/testWorker.mjs'
+    )
+    expect(pool.starting).toBe(false)
+    expect(pool.workerNodes.length).toBe(min)
+    const maxMultiplier = 10000
+    const promises = new Set()
+    for (let i = 0; i < max * maxMultiplier; i++) {
+      promises.add(pool.execute())
+    }
+    await Promise.all(promises)
+    expect(pool.workerNodes.length).toBe(max)
+    // We need to clean up the resources after our test
+    await pool.destroy()
+  })
+
   it('Verify ROUND_ROBIN strategy default policy', async () => {
     const workerChoiceStrategy = WorkerChoiceStrategies.ROUND_ROBIN
     let pool = new FixedThreadPool(
@@ -277,8 +286,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: {
@@ -333,8 +342,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: {
@@ -559,8 +568,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: {
@@ -618,8 +627,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: {
@@ -758,8 +767,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -827,8 +836,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -977,8 +986,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: {
@@ -1052,8 +1061,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: {
@@ -1208,8 +1217,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -1294,8 +1303,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -1385,8 +1394,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -1586,8 +1595,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -1665,8 +1674,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -1749,8 +1758,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -2012,8 +2021,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({
@@ -2098,8 +2107,8 @@ describe('Selection strategies test suite', () => {
           executing: 0,
           queued: 0,
           maxQueued: 0,
-          stolen: 0,
           sequentiallyStolen: 0,
+          stolen: 0,
           failed: 0
         },
         runTime: expect.objectContaining({