From cc336744703489764c85ff4120cb16fac3ff1fc8 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Fri, 22 Feb 2013 15:59:51 +0200 Subject: [PATCH 1/8] fix critical bug that can cause up master to crash, and make use of this.reloading to ignore reload signal while reloading --- lib/up.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/up.js b/lib/up.js index ae5ac2b..19d9899 100644 --- a/lib/up.js +++ b/lib/up.js @@ -120,9 +120,11 @@ UpServer.prototype.reload = function (fn) { return this; } + this.reloading = true; + // remove all workers in the spawning state - for (var i = 0, l = this.spawning.length; i < l; i++) { - this.spawning[i].shutdown(); + while (this.spawning.length > 0) { + this.spawning[0].shutdown(); } if (this.workerTimeout > 0) { @@ -142,6 +144,7 @@ UpServer.prototype.reload = function (fn) { for (var i = 0, l = reload.length; i < l; i++) { reload[i].shutdown(); } + this.reloading = false; }); } else { debug('removing old workers'); @@ -160,6 +163,7 @@ UpServer.prototype.reload = function (fn) { this.once('spawn', function() { self.emit('reload'); fn && fn(); + this.reloading = false; }) } }) From f1b57bbea406916fceca4c076b5ccfa84a3b9afc Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Fri, 22 Feb 2013 16:00:10 +0200 Subject: [PATCH 2/8] Upgrade to 0.2.2 to fix critical bug that can cause up master to crash --- package.json | 59 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 27405b6..db672a7 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,37 @@ { - "name": "up" - , "description": "Zero downtime reloads for Node HTTP(S) servers." - , "tags": ["cluster", "reload", "process", "monitor", "graceful", "restart"] - , "homepage": "https://github.com/learnboost/up" - , "version": "0.2.1" - , "bin": { "up": "./bin/up" } - , "main": "./lib/up" - , "engines": { "node": ">= 0.6.0" } - , "dependencies": { - "eq": "0.1.0" - , "ms": "0.1.0" - , "debug": "0.1.0" - , "commander": "0.6.1" - , "distribute": "0.1.4" - } - , "devDependencies": { - "mocha": "*" - , "expect.js": "*" - , "express": "*" - , "superagent": "*" - } - , "scripts": { - "test": "./node_modules/mocha/bin/mocha test/*.test.js" - } + "name": "up", + "description": "Zero downtime reloads for Node HTTP(S) servers.", + "tags": [ + "cluster", + "reload", + "process", + "monitor", + "graceful", + "restart" + ], + "homepage": "https://github.com/learnboost/up", + "version": "0.2.2", + "bin": { + "up": "./bin/up" + }, + "main": "./lib/up", + "engines": { + "node": ">= 0.6.0" + }, + "dependencies": { + "eq": "0.1.0", + "ms": "0.1.0", + "debug": "0.1.0", + "commander": "0.6.1", + "distribute": "0.1.4" + }, + "devDependencies": { + "mocha": "*", + "expect.js": "*", + "express": "*", + "superagent": "*" + }, + "scripts": { + "test": "./node_modules/mocha/bin/mocha test/*.test.js" + } } From b55782fc3ead86bbe66ec7959de1e0e5e17fd8b5 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Sat, 23 Feb 2013 08:18:29 +0200 Subject: [PATCH 3/8] Instead of violently exiting the process, send it SIGTERM so it can gracefully exits. --- lib/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/worker.js b/lib/worker.js index 5fcc5da..1b350c6 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -62,7 +62,7 @@ process.on('message', function (msg) { switch (msg.type) { case 'die': setTimeout(function () { - process.exit(0); + process.kill(process.pid); }, msg.time); break; case 'ready': From 9918e24826974501b575bf10f76214f24498fb79 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Sat, 23 Feb 2013 08:18:43 +0200 Subject: [PATCH 4/8] 0.2.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index db672a7..53ed06f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "restart" ], "homepage": "https://github.com/learnboost/up", - "version": "0.2.2", + "version": "0.2.3", "bin": { "up": "./bin/up" }, From 46cd400f1b5456c1552d4f4f71049f36a3864c33 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Mon, 25 Feb 2013 22:15:56 +0200 Subject: [PATCH 5/8] CLI have -m, --manual-ready option, up.js always does the reloading --- bin/up | 2 ++ lib/up.js | 8 -------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/bin/up b/bin/up index 9bf8925..0c8cb75 100755 --- a/bin/up +++ b/bin/up @@ -44,6 +44,7 @@ program , 'development' == process.env.NODE_ENV ? 1 : cpus) .option('-t, --timeout [ms]', 'Worker timeout.') .option('-k, --keepalive', 'Restart failed workers.') + .option('-m, --manual-ready', 'Manual call require("up").ready() in code.') /** * Capture requires. @@ -159,6 +160,7 @@ var httpServer = http.Server().listen(program.port) , requires: requires , title: program.title , keepAlive: keepAlive + , assumeReady: !program.manualReady }) /** diff --git a/lib/up.js b/lib/up.js index 19d9899..85e5f0f 100644 --- a/lib/up.js +++ b/lib/up.js @@ -115,12 +115,6 @@ UpServer.prototype.__proto__ = Distributor.prototype; */ UpServer.prototype.reload = function (fn) { - if (this.reloading) { - debug('reloading in process - ignoring reload'); - return this; - } - - this.reloading = true; // remove all workers in the spawning state while (this.spawning.length > 0) { @@ -144,7 +138,6 @@ UpServer.prototype.reload = function (fn) { for (var i = 0, l = reload.length; i < l; i++) { reload[i].shutdown(); } - this.reloading = false; }); } else { debug('removing old workers'); @@ -163,7 +156,6 @@ UpServer.prototype.reload = function (fn) { this.once('spawn', function() { self.emit('reload'); fn && fn(); - this.reloading = false; }) } }) From 2085c34dbcfe7a84fb4b59754c8e321ff373b239 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Mon, 25 Feb 2013 22:16:49 +0200 Subject: [PATCH 6/8] 0.2.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 53ed06f..bbed35a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "restart" ], "homepage": "https://github.com/learnboost/up", - "version": "0.2.3", + "version": "0.2.4", "bin": { "up": "./bin/up" }, From e358801a9e4a2aa830b5a681fac503720f2dbe0a Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Tue, 12 Mar 2013 21:28:06 +0200 Subject: [PATCH 7/8] besides SIGUSR2, SIGHUP behaves the same to maintain the compatibility with upstart's `initctl reload` --- bin/up | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/bin/up b/bin/up index 0c8cb75..8785885 100755 --- a/bin/up +++ b/bin/up @@ -150,7 +150,8 @@ var keepAlive = program.keepalive; */ debug('starting cluster with %d workers on port %d', numWorkers, port); -debug('`\033[97mkill -s SIGUSR2 %d\033[90m` or \033[97mctrl + r\033[90m' +debug('`\033[97mkill -s SIGUSR2 %d\033[90m` or' + + '`\033[97mkill -s SIGHUP %d\033[90m` or \033[97mctrl + r\033[90m' + ' to load new code', process.pid); var httpServer = http.Server().listen(program.port) @@ -174,6 +175,15 @@ if (program.pidfile) { }); } +/** + * Listen on SIGHUP signal. + */ + +process.on('SIGHUP', function () { + debug('\033[97mSIGHUP\033[90m signal detected - reloading'); + srv.reload(); +}); + /** * Listen on SIGUSR2 signal. */ From 5e24f938e8b88a8648798f3ff2c7b891ea643046 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Tue, 12 Mar 2013 21:28:36 +0200 Subject: [PATCH 8/8] 0.2.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bbed35a..7b1e6f4 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "restart" ], "homepage": "https://github.com/learnboost/up", - "version": "0.2.4", + "version": "0.2.5", "bin": { "up": "./bin/up" },