From f05ed93ccebb3ea4212d015788bcd6ca9e0b38d2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 16 Aug 2023 18:49:31 +0200 Subject: [PATCH] fix: ensure pool workers are properly initialized MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- CHANGELOG.md | 4 ++++ src/pools/abstract-pool.ts | 3 +++ src/worker/cluster-worker.ts | 12 ++++++++---- src/worker/thread-worker.ts | 14 +++++++++----- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ac71e7c..5344323c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Ensure pool workers are properly initialized. + ### Added - HTTP server pool examples: express-cluster, express-hybrid. diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index 18d4fb83..6d71e87e 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -1125,6 +1125,9 @@ export abstract class AbstractPool< } private handleWorkerReadyResponse (message: MessageValue): void { + if (message.ready === false) { + throw new Error(`Worker ${message.workerId} failed to initialize`) + } this.getWorkerInfo( this.getWorkerNodeKeyByWorkerId(message.workerId) ).ready = message.ready as boolean diff --git a/src/worker/cluster-worker.ts b/src/worker/cluster-worker.ts index b22c50fe..e5bcb727 100644 --- a/src/worker/cluster-worker.ts +++ b/src/worker/cluster-worker.ts @@ -43,10 +43,14 @@ export class ClusterWorker< /** @inheritDoc */ protected handleReadyMessage (message: MessageValue): void { - if (message.workerId === this.id && message.ready != null) { - this.getMainWorker()?.on('message', this.messageListener.bind(this)) - this.sendTaskFunctionsListToMainWorker() - this.sendToMainWorker({ ready: true, workerId: this.id }) + if (message.workerId === this.id && message.ready === false) { + try { + this.getMainWorker()?.on('message', this.messageListener.bind(this)) + this.sendTaskFunctionsListToMainWorker() + this.sendToMainWorker({ ready: true, workerId: this.id }) + } catch { + this.sendToMainWorker({ ready: false, workerId: this.id }) + } } } diff --git a/src/worker/thread-worker.ts b/src/worker/thread-worker.ts index 69940f96..6f36664b 100644 --- a/src/worker/thread-worker.ts +++ b/src/worker/thread-worker.ts @@ -54,13 +54,17 @@ export class ThreadWorker< protected handleReadyMessage (message: MessageValue): void { if ( message.workerId === this.id && - message.ready != null && + message.ready === false && message.port != null ) { - this.port = message.port - this.port.on('message', this.messageListener.bind(this)) - this.sendTaskFunctionsListToMainWorker() - this.sendToMainWorker({ ready: true, workerId: this.id }) + try { + this.port = message.port + this.port.on('message', this.messageListener.bind(this)) + this.sendTaskFunctionsListToMainWorker() + this.sendToMainWorker({ ready: true, workerId: this.id }) + } catch { + this.sendToMainWorker({ ready: false, workerId: this.id }) + } } } -- 2.34.1