Skip to content

Commit

Permalink
lib: emit listening event once when call listen twice
Browse files Browse the repository at this point in the history
PR-URL: #52119
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
theanarkh authored and marco-ippolito committed May 3, 2024
1 parent 41646d9 commit d5d6e04
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
8 changes: 7 additions & 1 deletion lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -1970,7 +1970,11 @@ function listenInCluster(server, address, port, addressType,
const ex = new ExceptionWithHostPort(err, 'bind', address, port);
return server.emit('error', ex);
}

// If there was a handle, just close it to avoid fd leak
// but it doesn't look like that's going to happen right now
if (server._handle) {
server._handle.close();
}
// Reuse primary's server handle
server._handle = handle;
// _listen2 sets up the listened handle, it is still named like this
Expand Down Expand Up @@ -1999,6 +2003,8 @@ Server.prototype.listen = function(...args) {

options = options._handle || options.handle || options;
const flags = getFlags(options.ipv6Only);
// Refresh the id to make the previous call invalid
this._listeningId++;
// (handle[, backlog][, cb]) where handle is an object with a handle
if (options instanceof TCP) {
this._handle = options;
Expand Down
38 changes: 38 additions & 0 deletions test/parallel/test-net-listen-twice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
'use strict';
const common = require('../common');
const net = require('net');
const cluster = require('cluster');
const assert = require('assert');

if (cluster.isPrimary) {
const worker = cluster.fork();
worker.on('exit', common.mustCall((code) => {
assert.ok(code === 0);
}));
} else {
const server = net.createServer();
server.listen();
try {
// Currently, we can call `listen` twice in cluster worker,
// if we can not call `listen` twice in the futrue,
// just skip this test.
server.listen();
} catch (e) {
console.error(e);
process.exit(0);
}
let i = 0;
process.on('internalMessage', (msg) => {
if (msg.cmd === 'NODE_CLUSTER') {
if (++i === 2) {
setImmediate(() => {
server.close(() => {
process.disconnect();
});
});
}
}
});
// Must only call once
server.on('listening', common.mustCall());
}

0 comments on commit d5d6e04

Please sign in to comment.