Browse Source

cluster: disconnect event not emitted correctly

Inside of a worker, disconnect event was not emitted on cluster.worker

Fixes: https://github.com/iojs/io.js/issues/1304
PR-URL: https://github.com/iojs/io.js/pull/1386
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
v2.0.2
Oleg Elifantiev 10 years ago
committed by Brendan Ashworth
parent
commit
5883a59b21
  1. 1
      lib/cluster.js
  2. 10
      test/parallel/test-cluster-worker-disconnect.js

1
lib/cluster.js

@ -511,6 +511,7 @@ function workerInit() {
}); });
cluster.worker = worker; cluster.worker = worker;
process.once('disconnect', function() { process.once('disconnect', function() {
worker.emit('disconnect');
if (!worker.suicide) { if (!worker.suicide) {
// Unexpected disconnect, master exited, or some such nastiness, so // Unexpected disconnect, master exited, or some such nastiness, so
// worker exits immediately. // worker exits immediately.

10
test/parallel/test-cluster-worker-disconnect.js

@ -8,6 +8,10 @@ if (cluster.isWorker) {
}).listen(common.PORT, '127.0.0.1'); }).listen(common.PORT, '127.0.0.1');
cluster.worker.on('disconnect', function() {
process.exit(42);
});
} else if (cluster.isMaster) { } else if (cluster.isMaster) {
var checks = { var checks = {
@ -18,6 +22,7 @@ if (cluster.isWorker) {
}, },
worker: { worker: {
emitDisconnect: false, emitDisconnect: false,
emitDisconnectInsideWorker: false,
emitExit: false, emitExit: false,
state: false, state: false,
suicideMode: false, suicideMode: false,
@ -59,9 +64,11 @@ if (cluster.isWorker) {
}); });
// Check that the worker died // Check that the worker died
worker.once('exit', function() { worker.once('exit', function(code) {
checks.worker.emitExit = true; checks.worker.emitExit = true;
checks.worker.died = !alive(worker.process.pid); checks.worker.died = !alive(worker.process.pid);
checks.worker.emitDisconnectInsideWorker = code === 42;
process.nextTick(function() { process.nextTick(function() {
process.exit(0); process.exit(0);
}); });
@ -74,6 +81,7 @@ if (cluster.isWorker) {
// events // events
assert.ok(w.emitDisconnect, 'Disconnect event did not emit'); assert.ok(w.emitDisconnect, 'Disconnect event did not emit');
assert.ok(w.emitDisconnectInsideWorker, 'Disconnect event did not emit inside worker');
assert.ok(c.emitDisconnect, 'Disconnect event did not emit'); assert.ok(c.emitDisconnect, 'Disconnect event did not emit');
assert.ok(w.emitExit, 'Exit event did not emit'); assert.ok(w.emitExit, 'Exit event did not emit');
assert.ok(c.emitExit, 'Exit event did not emit'); assert.ok(c.emitExit, 'Exit event did not emit');

Loading…
Cancel
Save