this.workerChoiceStrategy
) as IWorkerChoiceStrategy
if (!workerChoiceStrategy.hasPoolWorkerNodesReady()) {
- // wait for a worker node to be ready without blocking the event loop
+ return this.execute()
}
return this.executeStrategy(workerChoiceStrategy)
}
WorkerChoiceStrategies
} from '../../../lib/index.js'
import { CircularArray } from '../../../lib/circular-array.js'
+import { sleep } from '../../test-utils.js'
describe('Selection strategies test suite', () => {
const min = 0
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'
+ )
+ await sleep(600)
+ 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(
.returns(false)
.onCall(4)
.returns(false)
- .onCall(6)
- .returns(false)
- .onCall(7)
- .returns(false)
- .onCall(8)
- .returns(false)
.returns(true),
choose: stub().returns(1)
}
workerChoiceStrategyContext.workerChoiceStrategies.get(
workerChoiceStrategyContext.workerChoiceStrategy
).hasPoolWorkerNodesReady.callCount
- ).toBe(12)
+ ).toBe(6)
expect(
workerChoiceStrategyContext.workerChoiceStrategies.get(
workerChoiceStrategyContext.workerChoiceStrategy
expect(chosenWorkerKey).toBe(1)
})
- it('Verify that execute() throws error if worker choice strategy consecutive executions has been reached', () => {
+ it('Verify that execute() throws error if worker choice strategy recursion reach the maximum depth', () => {
const workerChoiceStrategyContext = new WorkerChoiceStrategyContext(
fixedPool
)
workerChoiceStrategyStub
)
expect(() => workerChoiceStrategyContext.execute()).toThrow(
- new RangeError(
- 'Worker choice strategy consecutive executions has exceeded the maximum of 10000'
- )
+ new RangeError('Maximum call stack size exceeded')
)
})