cluster: send suicide message on disconnect

This commit causes Worker.prototype.disconnect() to send a
suicide message to the cluster master. The function is also
restructured to eliminate redundant code.

Fixes: https://github.com/nodejs/node/issues/3238
PR-URL: https://github.com/nodejs/node/pull/3720
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
cjihrig 2015-11-09 15:08:50 -05:00
parent b70dc67828
commit f299d870dc
2 changed files with 31 additions and 12 deletions

View File

@ -654,26 +654,24 @@ function workerInit() {
Worker.prototype.disconnect = function() {
this.suicide = true;
var waitingHandles = 0;
let waitingCount = 1;
function checkRemainingHandles() {
waitingHandles--;
if (waitingHandles === 0) {
function checkWaitingCount() {
waitingCount--;
if (waitingCount === 0) {
send({ act: 'suicide' });
process.disconnect();
}
}
for (var key in handles) {
var handle = handles[key];
for (const key in handles) {
const handle = handles[key];
delete handles[key];
waitingHandles++;
handle.owner.close(checkRemainingHandles);
}
if (waitingHandles === 0) {
process.disconnect();
waitingCount++;
handle.owner.close(checkWaitingCount);
}
checkWaitingCount();
};
Worker.prototype.destroy = function() {

View File

@ -0,0 +1,21 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const cluster = require('cluster');
if (cluster.isMaster) {
const worker = cluster.fork();
let disconnected = false;
worker.on('disconnect', common.mustCall(function() {
assert.strictEqual(worker.suicide, true);
disconnected = true;
}));
worker.on('exit', common.mustCall(function() {
assert.strictEqual(worker.suicide, true);
assert.strictEqual(disconnected, true);
}));
} else {
cluster.worker.disconnect();
}