X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fpools%2Fselection-strategies%2Fabstract-worker-choice-strategy.ts;h=3dda355ef29a043ad3c9c4d34241cebac6e1f28f;hb=feec4213515cceb460e722dedca403914764b487;hp=6a9cff236a2def16eee80786e869e795d774f586;hpb=d01e4d675d7612232edfb9203124deab570b2281;p=poolifier.git diff --git a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts index 6a9cff23..3dda355e 100644 --- a/src/pools/selection-strategies/abstract-worker-choice-strategy.ts +++ b/src/pools/selection-strategies/abstract-worker-choice-strategy.ts @@ -1,5 +1,5 @@ import { DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS } from '../../utils' -import { PoolType, type IPool } from '../pool' +import { type IPool, PoolType } from '../pool' import type { IWorker } from '../worker' import type { IWorkerChoiceStrategy, @@ -19,6 +19,10 @@ export abstract class AbstractWorkerChoiceStrategy< Data = unknown, Response = unknown > implements IWorkerChoiceStrategy { + /** + * Toggles finding the last free worker node key. + */ + private toggleFindLastFreeWorkerNodeKey: boolean = false /** @inheritDoc */ protected readonly isDynamicPool: boolean /** @inheritDoc */ @@ -39,7 +43,7 @@ export abstract class AbstractWorkerChoiceStrategy< protected opts: WorkerChoiceStrategyOptions = DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS ) { this.isDynamicPool = this.pool.type === PoolType.DYNAMIC - this.choose.bind(this) + this.choose = this.choose.bind(this) } protected checkOptions (opts: WorkerChoiceStrategyOptions): void { @@ -68,4 +72,55 @@ export abstract class AbstractWorkerChoiceStrategy< this.checkOptions(opts) this.opts = opts } + + /** + * Finds a free worker node key. + * + * @returns The free worker node key or `-1` if there is no free worker node. + */ + protected findFreeWorkerNodeKey (): number { + if (this.toggleFindLastFreeWorkerNodeKey) { + this.toggleFindLastFreeWorkerNodeKey = false + return this.findLastFreeWorkerNodeKey() + } + this.toggleFindLastFreeWorkerNodeKey = true + return this.findFirstFreeWorkerNodeKey() + } + + /** + * Finds the first free worker node key based on the number of tasks the worker has applied. + * + * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned. + * + * If no free worker is found, `-1` is returned. + * + * @returns A worker node key if there is one, `-1` otherwise. + */ + private findFirstFreeWorkerNodeKey (): number { + return this.pool.workerNodes.findIndex(workerNode => { + return workerNode.tasksUsage?.running === 0 + }) + } + + /** + * Finds the last free worker node key based on the number of tasks the worker has applied. + * + * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned. + * + * If no free worker is found, `-1` is returned. + * + * @returns A worker node key if there is one, `-1` otherwise. + */ + private findLastFreeWorkerNodeKey (): number { + // It requires node >= 18.0.0: + // return this.workerNodes.findLastIndex(workerNode => { + // return workerNode.tasksUsage?.running === 0 + // }) + for (let i = this.pool.workerNodes.length - 1; i >= 0; i--) { + if (this.pool.workerNodes[i].tasksUsage?.running === 0) { + return i + } + } + return -1 + } }