Browse Source

test: fix cluster-disconnect-handles flakiness

Sometimes the test was timing out because the worker process remained
stuck in the breakpoint and didn't exit. This could happen because the
continue was sent before the breakpoint was set. If that's the case,
with this change, a new continue command is sent so the worker process
can end.

PR-URL: https://github.com/nodejs/node/pull/4009
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
process-exit-stdio-flushing
Santiago Gimeno 9 years ago
committed by Ben Noordhuis
parent
commit
8677627054
  1. 15
      test/parallel/test-cluster-disconnect-handles.js

15
test/parallel/test-cluster-disconnect-handles.js

@ -33,6 +33,7 @@ if (cluster.isMaster) {
worker.on('message', common.mustCall(message => { worker.on('message', common.mustCall(message => {
assert.strictEqual(Array.isArray(message), true); assert.strictEqual(Array.isArray(message), true);
assert.strictEqual(message[0], 'listening'); assert.strictEqual(message[0], 'listening');
let continueRecv = false;
const address = message[1]; const address = message[1];
const host = address.address; const host = address.address;
const debugClient = net.connect({ host, port: common.PORT }); const debugClient = net.connect({ host, port: common.PORT });
@ -41,13 +42,25 @@ if (cluster.isMaster) {
debugClient.on('data', data => protocol.execute(data)); debugClient.on('data', data => protocol.execute(data));
debugClient.once('connect', common.mustCall(() => { debugClient.once('connect', common.mustCall(() => {
protocol.onResponse = common.mustCall(res => { protocol.onResponse = common.mustCall(res => {
protocol.onResponse = () => {}; protocol.onResponse = (res) => {
// It can happen that the first continue was sent before the break
// event was received. If that's the case, send also a continue from
// here so the worker exits
if (res.body.command === 'continue') {
continueRecv = true;
} else if (res.body.event === 'break' && continueRecv) {
const req = protocol.serialize({ command: 'continue' });
debugClient.write(req);
}
};
const conn = net.connect({ host, port: address.port }); const conn = net.connect({ host, port: address.port });
conn.once('connect', common.mustCall(() => { conn.once('connect', common.mustCall(() => {
conn.destroy(); conn.destroy();
assert.notDeepStrictEqual(handles, {}); assert.notDeepStrictEqual(handles, {});
worker.disconnect(); worker.disconnect();
assert.deepStrictEqual(handles, {}); assert.deepStrictEqual(handles, {});
// Always send the continue, as the break event might have already
// been received.
const req = protocol.serialize({ command: 'continue' }); const req = protocol.serialize({ command: 'continue' });
debugClient.write(req); debugClient.write(req);
})); }));

Loading…
Cancel
Save