From 073e67397ca0dbfd6f4ec02b8c61b51d81da9bc9 Mon Sep 17 00:00:00 2001 From: snewcomer Date: Fri, 19 Jul 2019 09:45:00 -0700 Subject: [PATCH 1/4] Fork Worker only if no Initialization Error --- src/fastboot-app-server.js | 41 +++++++++++++++++++++++++++----------- src/worker.js | 4 ++-- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/fastboot-app-server.js b/src/fastboot-app-server.js index fa1340ed..e0445563 100644 --- a/src/fastboot-app-server.js +++ b/src/fastboot-app-server.js @@ -163,28 +163,45 @@ class FastBootAppServer { let env = this.buildWorkerEnv(); let worker = cluster.fork(env); + let firstBootResolve; + let firstBootReject; + const firstBootPromise = new Promise((resolve, reject) => { + firstBootResolve = resolve; + firstBootReject = reject; + }); + this.ui.writeLine(`forked worker ${worker.process.pid}`); + worker.on('online', () => { + this.ui.writeLine('worker online'); + + worker.on('message', message => { + if (message.event === 'http-online') { + firstBootResolve(); + } + }); + }); + worker.on('exit', (code, signal) => { + let error; + if (signal) { - this.ui.writeLine(`worker was killed by signal: ${signal}`); + error = new Error(`Worker ${(worker.process.pid)} was killed by signal: ${signal}`) } else if (code !== 0) { - this.ui.writeLine(`worker exited with error code: ${code}`); + error = new Error(`Worker ${(worker.process.pid)} exited with an error code: ${code}`) } else { - this.ui.writeLine(`worker exited`); + error = new Error(`Worker ${(worker.process.pid)} exited gracefully`) } - this.forkWorker(); + if (this.initializationError) { + firstBootReject(error); + } else { + this.ui.writeLine(error); + this.forkWorker(); + } }); - return new Promise(resolve => { - this.ui.writeLine('worker online'); - worker.on('message', message => { - if (message.event === 'http-online') { - resolve(); - } - }); - }); + return firstBootPromise; } buildWorkerEnv() { diff --git a/src/worker.js b/src/worker.js index 72f83151..26e65e19 100644 --- a/src/worker.js +++ b/src/worker.js @@ -46,10 +46,10 @@ class Worker { this.middleware = this.noAppMiddleware(); } else { this.middleware = this.buildMiddleware(); + this.bindEvents(); + this.serveHTTP(); } - this.bindEvents(); - this.serveHTTP(); } bindEvents() { From 73b9755e7b7e8ce6972652d8f5196849bd120d8e Mon Sep 17 00:00:00 2001 From: snewcomer Date: Fri, 19 Jul 2019 11:20:31 -0700 Subject: [PATCH 2/4] fix tests --- src/worker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/worker.js b/src/worker.js index 26e65e19..72f83151 100644 --- a/src/worker.js +++ b/src/worker.js @@ -46,10 +46,10 @@ class Worker { this.middleware = this.noAppMiddleware(); } else { this.middleware = this.buildMiddleware(); - this.bindEvents(); - this.serveHTTP(); } + this.bindEvents(); + this.serveHTTP(); } bindEvents() { From a8215f2f97159f7486b97256793140a719a3a0df Mon Sep 17 00:00:00 2001 From: snewcomer Date: Sun, 21 Jul 2019 10:09:24 -0700 Subject: [PATCH 3/4] Dont restart worker if cluser never initialized on first boot --- src/fastboot-app-server.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fastboot-app-server.js b/src/fastboot-app-server.js index e0445563..d06745ca 100644 --- a/src/fastboot-app-server.js +++ b/src/fastboot-app-server.js @@ -26,6 +26,8 @@ class FastBootAppServer { this.sandboxGlobals = options.sandboxGlobals; this.chunkedResponse = options.chunkedResponse; + this._clusterIsInitialized = false; + if (!this.ui) { let UI = require('./ui'); this.ui = new UI(); @@ -70,6 +72,8 @@ class FastBootAppServer { .then(() => { if (this.initializationError) { this.broadcast({ event: 'error', error: this.initializationError.stack }); + } else { + this._clusterIsInitialized = true; } }) .catch(err => { @@ -193,7 +197,8 @@ class FastBootAppServer { error = new Error(`Worker ${(worker.process.pid)} exited gracefully`) } - if (this.initializationError) { + if (!this._clusterIsInitialized) { + // dont attempt to fork again if never a healthy first boot firstBootReject(error); } else { this.ui.writeLine(error); From f8c0eb336d88538265374b54641f3c4740790d9d Mon Sep 17 00:00:00 2001 From: snewcomer Date: Sun, 21 Jul 2019 10:27:43 -0700 Subject: [PATCH 4/4] fail fork workers and process.exit --- src/fastboot-app-server.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/fastboot-app-server.js b/src/fastboot-app-server.js index d06745ca..e402b91a 100644 --- a/src/fastboot-app-server.js +++ b/src/fastboot-app-server.js @@ -66,10 +66,17 @@ class FastBootAppServer { start() { if (cluster.isWorker) { return; } - return this.initializeApp() + const forkWorkersPromise = this.initializeApp() .then(() => this.subscribeToNotifier()) .then(() => this.forkWorkers()) - .then(() => { + + // fail hard if first boot fails + forkWorkersPromise.catch((error) => { + this.ui.writeLine(error); + process.exit(1); + }); + + return forkWorkersPromise.then(() => { if (this.initializationError) { this.broadcast({ event: 'error', error: this.initializationError.stack }); } else {