cluster: disconnect event not emitted correctly
authorOleg Elifantiev <oleg@elifantiev.ru>
Thu, 2 Apr 2015 20:27:27 +0000 (23:27 +0300)
committerBrendan Ashworth <brendan.ashworth@me.com>
Fri, 8 May 2015 19:33:14 +0000 (12:33 -0700)
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>
lib/cluster.js
test/parallel/test-cluster-worker-disconnect.js

index 10a5599..9a7900b 100644 (file)
@@ -511,6 +511,7 @@ function workerInit() {
     });
     cluster.worker = worker;
     process.once('disconnect', function() {
+      worker.emit('disconnect');
       if (!worker.suicide) {
         // Unexpected disconnect, master exited, or some such nastiness, so
         // worker exits immediately.
index 4bb9b16..e7a0960 100644 (file)
@@ -8,6 +8,10 @@ if (cluster.isWorker) {
 
   }).listen(common.PORT, '127.0.0.1');
 
+  cluster.worker.on('disconnect', function() {
+    process.exit(42);
+  });
+
 } else if (cluster.isMaster) {
 
   var checks = {
@@ -18,6 +22,7 @@ if (cluster.isWorker) {
     },
     worker: {
       emitDisconnect: false,
+      emitDisconnectInsideWorker: false,
       emitExit: false,
       state: false,
       suicideMode: false,
@@ -59,9 +64,11 @@ if (cluster.isWorker) {
   });
 
   // Check that the worker died
-  worker.once('exit', function() {
+  worker.once('exit', function(code) {
     checks.worker.emitExit = true;
     checks.worker.died = !alive(worker.process.pid);
+    checks.worker.emitDisconnectInsideWorker = code === 42;
+
     process.nextTick(function() {
       process.exit(0);
     });
@@ -74,6 +81,7 @@ if (cluster.isWorker) {
 
     // events
     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(w.emitExit, 'Exit event did not emit');
     assert.ok(c.emitExit, 'Exit event did not emit');