diff --git a/doc/api/cluster.markdown b/doc/api/cluster.markdown index e4c2111f04..2d78654cc7 100644 --- a/doc/api/cluster.markdown +++ b/doc/api/cluster.markdown @@ -250,7 +250,15 @@ See [child_process event: 'exit'](child_process.html#child_process_event_exit). ## Event: 'setup' -Emitted every time `.setupMaster()` is called with a `settings` argument. +* `settings` {Object} + +Emitted every time `.setupMaster()` is called. + +The `settings` object is the `cluster.settings` object at the time +`.setupMaster()` was called and is advisory only, since multiple calls to +`.setupMaster()` can be made in a single tick. + +If accuracy is important, use `cluster.settings`. ## cluster.setupMaster([settings]) diff --git a/lib/cluster.js b/lib/cluster.js index e5d3533da3..2d08d43905 100644 --- a/lib/cluster.js +++ b/lib/cluster.js @@ -258,8 +258,8 @@ function masterInit() { } cluster.settings = settings; if (initialized === true) - return options && process.nextTick(function() { - cluster.emit('setup'); + return process.nextTick(function() { + cluster.emit('setup', settings); }); initialized = true; schedulingPolicy = cluster.schedulingPolicy; // Freeze policy. @@ -274,7 +274,7 @@ function masterInit() { }); process.nextTick(function() { - cluster.emit('setup'); + cluster.emit('setup', settings); }); }; diff --git a/test/simple/test-cluster-setup-master-emit.js b/test/simple/test-cluster-setup-master-emit.js new file mode 100644 index 0000000000..ee3af2ad41 --- /dev/null +++ b/test/simple/test-cluster-setup-master-emit.js @@ -0,0 +1,60 @@ +// 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. + + +var common = require('../common'); +var assert = require('assert'); +var cluster = require('cluster'); + +assert(cluster.isMaster); + +var assertsRun = 0; + +function emitAndCatch(next) { + cluster.once('setup', function(settings) { + assert.strictEqual(settings.exec, 'new-exec'); + console.log('ok "setup" emitted with options set'); + assertsRun += 1; + setImmediate(next); + }); + cluster.setupMaster({ exec: 'new-exec' }); +} + +function emitAndCatch2(next) { + cluster.once('setup', function(settings) { + assert('exec' in settings); + console.log('ok "setup" emitted without options set'); + assertsRun += 1; + setImmediate(next); + }); + cluster.setupMaster(); +} + +process.on('exit', function() { + assert.strictEqual(assertsRun, 2); + console.log('ok correct number of assertions'); +}); + +emitAndCatch(function() { + emitAndCatch2(function() { + console.log('ok emitted and caught'); + }); +});