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:
parent
1dae526348
commit
397eceb6d8
@ -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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user