Commit | Line | Data |
---|---|---|
058a9457 JB |
1 | import { DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS } from '../../utils' |
2 | import type { IPool } from '../pool' | |
3 | import type { IWorker } from '../worker' | |
4 | import { AbstractWorkerChoiceStrategy } from './abstract-worker-choice-strategy' | |
5 | import type { | |
6 | IWorkerChoiceStrategy, | |
7 | TaskStatistics, | |
8 | WorkerChoiceStrategyOptions | |
9 | } from './selection-strategies-types' | |
10 | ||
11 | /** | |
12 | * Selects the worker with the least ELU. | |
13 | * | |
14 | * @typeParam Worker - Type of worker which manages the strategy. | |
15 | * @typeParam Data - Type of data sent to the worker. This can only be serializable data. | |
16 | * @typeParam Response - Type of execution response. This can only be serializable data. | |
17 | */ | |
18 | export class LeastEluWorkerChoiceStrategy< | |
19 | Worker extends IWorker, | |
20 | Data = unknown, | |
21 | Response = unknown | |
22 | > | |
23 | extends AbstractWorkerChoiceStrategy<Worker, Data, Response> | |
24 | implements IWorkerChoiceStrategy { | |
25 | /** @inheritDoc */ | |
26 | public readonly taskStatistics: TaskStatistics = { | |
27 | runTime: false, | |
28 | avgRunTime: true, | |
29 | medRunTime: false, | |
30 | waitTime: false, | |
31 | avgWaitTime: false, | |
32 | medWaitTime: false, | |
33 | elu: true | |
34 | } | |
35 | ||
36 | /** @inheritDoc */ | |
37 | public constructor ( | |
38 | pool: IPool<Worker, Data, Response>, | |
39 | opts: WorkerChoiceStrategyOptions = DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS | |
40 | ) { | |
41 | super(pool, opts) | |
42 | this.setTaskStatistics(this.opts) | |
43 | } | |
44 | ||
45 | /** @inheritDoc */ | |
46 | public reset (): boolean { | |
47 | return true | |
48 | } | |
49 | ||
50 | /** @inheritDoc */ | |
51 | public update (): boolean { | |
52 | return true | |
53 | } | |
54 | ||
55 | /** @inheritDoc */ | |
56 | public choose (): number { | |
058a9457 JB |
57 | let minTasksElu = Infinity |
58 | let leastEluWorkerNodeKey!: number | |
59 | for (const [workerNodeKey, workerNode] of this.pool.workerNodes.entries()) { | |
60 | const tasksUsage = workerNode.tasksUsage | |
61 | const tasksElu = tasksUsage.elu?.utilization ?? 0 | |
62 | if (tasksElu === 0) { | |
63 | return workerNodeKey | |
64 | } else if (tasksElu < minTasksElu) { | |
65 | minTasksElu = tasksElu | |
66 | leastEluWorkerNodeKey = workerNodeKey | |
67 | } | |
68 | } | |
69 | return leastEluWorkerNodeKey | |
70 | } | |
71 | ||
72 | /** @inheritDoc */ | |
73 | public remove (): boolean { | |
74 | return true | |
75 | } | |
76 | } |