From: Jérôme Benoit Date: Wed, 3 Jan 2024 23:09:48 +0000 (+0100) Subject: fix: ensure worker info is defined before accessing it X-Git-Tag: v3.1.17~12 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=1851fed0d7a9a5f5449797b01848dd44386c1517;p=poolifier.git fix: ensure worker info is defined before accessing it Signed-off-by: Jérôme Benoit --- diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 5d79cb43..47411563 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -703,7 +703,7 @@ export abstract class AbstractPool< message: MessageValue ): void => { this.checkMessageWorkerId(message) - const workerId = this.getWorkerInfo(workerNodeKey).id + const workerId = this.getWorkerInfo(workerNodeKey)?.id if ( message.taskFunctionOperationStatus != null && message.workerId === workerId @@ -1157,6 +1157,7 @@ export abstract class AbstractPool< private shallUpdateTaskFunctionWorkerUsage (workerNodeKey: number): boolean { const workerInfo = this.getWorkerInfo(workerNodeKey) return ( + workerInfo != null && Array.isArray(workerInfo.taskFunctionNames) && workerInfo.taskFunctionNames.length > 2 ) @@ -1536,13 +1537,14 @@ export abstract class AbstractPool< (this.info.stealingWorkerNodes ?? 0) > Math.floor(this.workerNodes.length / 2) ) { - if (previousStolenTask != null) { + if (workerInfo != null && previousStolenTask != null) { workerInfo.stealing = false } return } const workerNodeTasksUsage = this.workerNodes[workerNodeKey].usage.tasks if ( + workerInfo != null && previousStolenTask != null && workerNodeTasksUsage.sequentiallyStolen > 0 && (workerNodeTasksUsage.executing > 0 || @@ -1560,6 +1562,11 @@ export abstract class AbstractPool< this.resetTaskSequentiallyStolenStatisticsWorkerUsage(workerNodeKey) return } + if (workerInfo == null) { + throw new Error( + `Worker node with key '${workerNodeKey}' not found in pool` + ) + } workerInfo.stealing = true const stolenTask = this.workerNodeStealTask(workerNodeKey) if ( @@ -1660,6 +1667,11 @@ export abstract class AbstractPool< this.opts.tasksQueueOptions!.size! - sizeOffset ) { const workerInfo = this.getWorkerInfo(workerNodeKey) + if (workerInfo == null) { + throw new Error( + `Worker node with key '${workerNodeKey}' not found in pool` + ) + } workerInfo.stealing = true // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const task = sourceWorkerNode.popTask()! @@ -1687,9 +1699,12 @@ export abstract class AbstractPool< this.handleTaskExecutionResponse(message) } else if (taskFunctionNames != null) { // Task function names message received from worker - this.getWorkerInfo( + const workerInfo = this.getWorkerInfo( this.getWorkerNodeKeyByWorkerId(workerId) - ).taskFunctionNames = taskFunctionNames + ) + if (workerInfo != null) { + workerInfo.taskFunctionNames = taskFunctionNames + } } } @@ -1783,13 +1798,8 @@ export abstract class AbstractPool< * @param workerNodeKey - The worker node key. * @returns The worker information. */ - protected getWorkerInfo (workerNodeKey: number): WorkerInfo { - const workerInfo = this.workerNodes[workerNodeKey]?.info - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (workerInfo == null) { - throw new Error(`Worker node with key '${workerNodeKey}' not found`) - } - return workerInfo + protected getWorkerInfo (workerNodeKey: number): WorkerInfo | undefined { + return this.workerNodes[workerNodeKey]?.info } /** @@ -1848,7 +1858,10 @@ export abstract class AbstractPool< } protected flagWorkerNodeAsNotReady (workerNodeKey: number): void { - this.getWorkerInfo(workerNodeKey).ready = false + const workerInfo = this.getWorkerInfo(workerNodeKey) + if (workerInfo != null) { + workerInfo.ready = false + } } private hasBackPressure (): boolean { diff --git a/src/pools/cluster/fixed.ts b/src/pools/cluster/fixed.ts index 09dbe509..e4cc7d6e 100644 --- a/src/pools/cluster/fixed.ts +++ b/src/pools/cluster/fixed.ts @@ -54,7 +54,7 @@ export class FixedClusterPool< ): void { this.workerNodes[workerNodeKey].worker.send({ ...message, - workerId: this.getWorkerInfo(workerNodeKey).id + workerId: this.getWorkerInfo(workerNodeKey)?.id }) } diff --git a/src/pools/thread/fixed.ts b/src/pools/thread/fixed.ts index ff427ea2..9561cc78 100644 --- a/src/pools/thread/fixed.ts +++ b/src/pools/thread/fixed.ts @@ -54,7 +54,7 @@ export class FixedThreadPool< transferList?: TransferListItem[] ): void { this.workerNodes[workerNodeKey].messageChannel?.port1.postMessage( - { ...message, workerId: this.getWorkerInfo(workerNodeKey).id }, + { ...message, workerId: this.getWorkerInfo(workerNodeKey)?.id }, transferList ) } @@ -67,7 +67,7 @@ export class FixedThreadPool< workerNode.worker.postMessage( { ready: false, - workerId: this.getWorkerInfo(workerNodeKey).id, + workerId: this.getWorkerInfo(workerNodeKey)?.id, port: port2 }, [port2]