diff --git a/lib/internal/cluster/child.js b/lib/internal/cluster/child.js index 00638e7784550b..2fc4390e72cbec 100644 --- a/lib/internal/cluster/child.js +++ b/lib/internal/cluster/child.js @@ -210,6 +210,8 @@ function onconnection(message, handle) { if (accepted) server.onconnection(0, handle); + else + handle.close(); } function send(message, cb) { diff --git a/test/parallel/test-cluster-worker-handle-close.js b/test/parallel/test-cluster-worker-handle-close.js new file mode 100644 index 00000000000000..47a80ef1cd1f1a --- /dev/null +++ b/test/parallel/test-cluster-worker-handle-close.js @@ -0,0 +1,27 @@ +'use strict'; +const common = require('../common'); +const cluster = require('cluster'); +const net = require('net'); + +if (cluster.isPrimary) { + cluster.schedulingPolicy = cluster.SCHED_RR; + cluster.fork(); +} else { + const server = net.createServer(common.mustNotCall()); + server.listen(0, common.mustCall(() => { + net.connect(server.address().port); + })); + process.prependListener('internalMessage', common.mustCallAtLeast((message, handle) => { + if (message.act !== 'newconn') { + return; + } + // Make the worker drops the connection, see `rr` and `onconnection` in child.js + server.close(); + const close = handle.close; + handle.close = common.mustCall(() => { + close.call(handle, common.mustCall(() => { + process.exit(); + })); + }); + })); +}