test: fix worker send error

In test-child-process-fork-closed-channel-segfault.js, race condition
is observed between the server getting closed and the worker sending
a message. Accommodate the potential errors.

Earlier, the same race was observed between the client and server
and was addressed through ignoring the relevant errors through error
handler. The same mechanism is re-used for worker too.

The only difference is that the filter is applied at the callback
instead of at the worker's error listener.

Refs: https://github.com/nodejs/node/issues/3635#issuecomment-157714683
Fixes: https://github.com/nodejs/node/issues/20836
PR-URL: https://github.com/nodejs/node/pull/20973

Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Jon Moss <me@jonathanmoss.me>
Reviewed-By: Matheus Marchini <matheus@sthima.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Bartosz Sosnowski <bartosz@janeasystems.com>
This commit is contained in:
Gireesh Punathil 2018-05-26 11:18:02 +05:30
parent 1dae526348
commit 397eceb6d8

View File

@ -31,6 +31,16 @@ const server = net
.listen(0, function() { .listen(0, function() {
const worker = cluster.fork(); const worker = cluster.fork();
worker.on('error', function(err) {
if (
err.code !== 'ECONNRESET' &&
err.code !== 'ECONNREFUSED' &&
err.code !== 'EMFILE'
) {
throw err;
}
});
function send(callback) { function send(callback) {
const s = net.connect(server.address().port, function() { const s = net.connect(server.address().port, function() {
worker.send({}, s, callback); worker.send({}, s, callback);
@ -66,7 +76,10 @@ const server = net
send(function(err) { send(function(err) {
// Ignore errors when sending the second handle because the worker // Ignore errors when sending the second handle because the worker
// may already have exited. // may already have exited.
if (err && err.code !== 'ERR_IPC_CHANNEL_CLOSED') { if (err && err.code !== 'ERR_IPC_CHANNEL_CLOSED' &&
err.code !== 'ECONNRESET' &&
err.code !== 'ECONNREFUSED' &&
err.code !== 'EMFILE') {
throw err; throw err;
} }
}); });