Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

cluster: don't always kill the master on uncaughtException

uncaughtException handlers installed by the user override the default one that
the cluster module installs, the one that kills off the master process.

Fixes #2556.
  • Loading branch information...
commit d44ce9790948c69f0b9bc449f2488b30cd099105 1 parent 091ab85
@bnoordhuis bnoordhuis authored
Showing with 62 additions and 0 deletions.
  1. +3 −0  lib/cluster.js
  2. +59 −0 test/simple/test-cluster-uncaught-exception.js
View
3  lib/cluster.js
@@ -78,6 +78,9 @@ function startMaster() {
workerArgs = process.argv.slice(2);
process.on('uncaughtException', function(e) {
+ // Did the user install a listener? If so, it overrides this one.
+ if (process.listeners('uncaughtException').length > 1) return;
+
// Quickly try to kill all the workers.
// TODO: be session leader - will cause auto SIGHUP to the children.
eachWorker(function(worker) {
View
59 test/simple/test-cluster-uncaught-exception.js
@@ -0,0 +1,59 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Installing a custom uncaughtException handler should override the default
+// one that the cluster module installs.
+// https://github.com/joyent/node/issues/2556
+
+var common = require('../common');
+var assert = require('assert');
+var cluster = require('cluster');
+var fork = require('child_process').fork;
+
+var MAGIC_EXIT_CODE = 42;
+
+var isTestRunner = process.argv[2] != 'child';
+
+if (isTestRunner) {
+ var exitCode = -1;
+
+ process.on('exit', function() {
+ assert.equal(exitCode, MAGIC_EXIT_CODE);
+ });
+
+ var master = fork(__filename, ['child']);
+ master.on('exit', function(code) {
+ exitCode = code;
+ });
+}
+else if (cluster.isMaster) {
+ process.on('uncaughtException', function() {
+ process.nextTick(function() {
+ process.exit(MAGIC_EXIT_CODE);
+ });
+ });
+
+ cluster.fork();
+ throw new Error('kill master');
+}
+else { // worker
+ process.exit();
+}
Please sign in to comment.
Something went wrong with that request. Please try again.