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, | |
05302647 | 7 | TaskStatisticsRequirements, |
058a9457 JB |
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 */ | |
05302647 | 26 | public readonly taskStatisticsRequirements: TaskStatisticsRequirements = { |
e460940e JB |
27 | runTime: { |
28 | aggregate: false, | |
29 | average: false, | |
30 | median: false | |
31 | }, | |
32 | waitTime: { | |
33 | aggregate: false, | |
34 | average: false, | |
35 | median: false | |
36 | }, | |
5df69fab JB |
37 | elu: { |
38 | aggregate: true, | |
39 | average: false, | |
40 | median: false | |
41 | } | |
058a9457 JB |
42 | } |
43 | ||
44 | /** @inheritDoc */ | |
45 | public constructor ( | |
46 | pool: IPool<Worker, Data, Response>, | |
47 | opts: WorkerChoiceStrategyOptions = DEFAULT_WORKER_CHOICE_STRATEGY_OPTIONS | |
48 | ) { | |
49 | super(pool, opts) | |
e460940e | 50 | this.setTaskStatisticsRequirements(this.opts) |
058a9457 JB |
51 | } |
52 | ||
53 | /** @inheritDoc */ | |
54 | public reset (): boolean { | |
55 | return true | |
56 | } | |
57 | ||
58 | /** @inheritDoc */ | |
59 | public update (): boolean { | |
60 | return true | |
61 | } | |
62 | ||
63 | /** @inheritDoc */ | |
64 | public choose (): number { | |
cdb517b3 | 65 | let minWorkerElu = Infinity |
058a9457 JB |
66 | let leastEluWorkerNodeKey!: number |
67 | for (const [workerNodeKey, workerNode] of this.pool.workerNodes.entries()) { | |
cdb517b3 | 68 | const workerUsage = workerNode.workerUsage |
5df69fab | 69 | const workerElu = workerUsage.elu?.active.aggregate ?? 0 |
cdb517b3 | 70 | if (workerElu === 0) { |
058a9457 | 71 | return workerNodeKey |
cdb517b3 JB |
72 | } else if (workerElu < minWorkerElu) { |
73 | minWorkerElu = workerElu | |
058a9457 JB |
74 | leastEluWorkerNodeKey = workerNodeKey |
75 | } | |
76 | } | |
77 | return leastEluWorkerNodeKey | |
78 | } | |
79 | ||
80 | /** @inheritDoc */ | |
81 | public remove (): boolean { | |
82 | return true | |
83 | } | |
84 | } |