mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
lib: fix listen with handle in cluster worker
PR-URL: https://github.com/nodejs/node/pull/52056 Reviewed-By: Paolo Insogna <paolo@cowtech.it> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
parent
639c096004
commit
20525f14b9
@ -2002,7 +2002,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);
|
||||
|
27
test/parallel/test-net-listen-handle-in-cluster-1.js
Normal file
27
test/parallel/test-net-listen-handle-in-cluster-1.js
Normal file
@ -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
test/parallel/test-net-listen-handle-in-cluster-2.js
Normal file
21
test/parallel/test-net-listen-handle-in-cluster-2.js
Normal file
@ -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);
|
||||
}));
|
||||
}
|
Loading…
Reference in New Issue
Block a user