Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
lib: fix listen with handle in cluster worker
  • Loading branch information
theanarkh committed Mar 12, 2024
commit ca3519b08613f3250b7b639bd2e7f9e0b5740090
2 changes: 1 addition & 1 deletion lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -1994,7 +1994,7 @@ Server.prototype.listen = function(...args) {
if (options instanceof TCP) {
this._handle = options;
this[async_id_symbol] = this._handle.getAsyncId();
listenInCluster(this, null, -1, -1, backlogFromArgs);
listenInCluster(this, null, -1, -1, backlogFromArgs, undefined, true);
return this;
}
addServerAbortSignalOption(this, options);
Expand Down
27 changes: 27 additions & 0 deletions test/parallel/test-net-listen-handle-in-cluster-1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
const cluster = require('cluster');

// Test if the worker can listen with handle successfully
if (cluster.isPrimary) {
const worker = cluster.fork();
const server = net.createServer();
worker.on('online', common.mustCall(() => {
server.listen(common.mustCall(() => {
// Send the server to worker
worker.send(null, server);
}));
}));
worker.on('exit', common.mustCall(() => {
server.close();
}));
} else {
// The `got` function of net.Server will create a TCP server by listen(handle)
// See lib/internal/child_process.js
process.on('message', common.mustCall((_, server) => {
assert.strictEqual(server instanceof net.Server, true);
process.exit(0);
}));
}
21 changes: 21 additions & 0 deletions test/parallel/test-net-listen-handle-in-cluster-2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Flags: --expose-internals
'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
const cluster = require('cluster');
const { internalBinding } = require('internal/test/binding');
const { TCP, constants: TCPConstants } = internalBinding('tcp_wrap');

// Test if the worker can listen with handle successfully
if (cluster.isPrimary) {
cluster.fork();
} else {
const handle = new TCP(TCPConstants.SOCKET);
const errno = handle.bind('0.0.0.0', 0);
assert.strictEqual(errno, 0);
// Execute _listen2 instead of cluster._getServer in listenInCluster
net.createServer().listen(handle, common.mustCall(() => {
process.exit(0);
}));
}