Compare commits

..

1 Commits

Author SHA1 Message Date
Jarred Sumner
f5264ceac2 fix net server noDelay 2025-05-28 18:22:50 -07:00
3 changed files with 39 additions and 82 deletions

View File

@@ -372,6 +372,10 @@ const ServerHandlers: SocketHandler = {
_socket[kAttach](this.localPort, socket);
if (self.noDelay) {
_socket.setNoDelay(self.noDelay);
}
if (self.blockList) {
const addressType = isIP(socket.remoteAddress);
if (addressType && self.blockList.check(socket.remoteAddress, `ipv${addressType}`)) {
@@ -2313,17 +2317,10 @@ Server.prototype.listen = function listen(port, hostname, onListen) {
options[kSocketClass] = Socket;
}
let address = hostname;
let portOrPath = port;
if (path) {
address = path;
portOrPath = -1;
}
listenInCluster(
this,
address,
portOrPath,
null,
port,
4,
backlog,
fd,

View File

@@ -1,73 +0,0 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const net = require('net');
const cluster = require('cluster');
const tmpdir = require('../common/tmpdir');
// The core has bug in handling pipe handle by ipc when platform is win32,
// it can be triggered on win32. I will fix it in another pr.
if (common.isWindows)
common.skip('no setSimultaneousAccepts on pipe handle');
const totalConns = 10;
const totalWorkers = 3;
let worker0;
let worker1;
let worker2;
let connectionCount = 0;
let listenCount = 0;
function request(path) {
for (let i = 0; i < totalConns; i++) {
net.connect(path);
}
}
function handleMessage(message) {
assert.match(message.action, /listen|connection/);
if (message.action === 'listen') {
if (++listenCount === totalWorkers) {
request(common.PIPE);
}
} else if (message.action === 'connection') {
if (++connectionCount === totalConns) {
worker0.send({ action: 'disconnect' });
worker1.send({ action: 'disconnect' });
worker2.send({ action: 'disconnect' });
}
}
}
if (cluster.isPrimary) {
cluster.schedulingPolicy = cluster.SCHED_RR;
tmpdir.refresh();
worker0 = cluster.fork({ maxConnections: 0, pipePath: common.PIPE });
worker1 = cluster.fork({ maxConnections: 1, pipePath: common.PIPE });
worker2 = cluster.fork({ maxConnections: 9, pipePath: common.PIPE });
// expected = { action: 'listen' } + maxConnections * { action: 'connection' }
worker0.on('message', common.mustCall((message) => {
handleMessage(message);
}, 1));
worker1.on('message', common.mustCall((message) => {
handleMessage(message);
}, 2));
worker2.on('message', common.mustCall((message) => {
handleMessage(message);
}, 10));
} else {
const server = net.createServer(common.mustCall((socket) => {
process.send({ action: 'connection' });
}, +process.env.maxConnections));
server.listen(process.env.pipePath, common.mustCall(() => {
process.send({ action: 'listen' });
}));
server.maxConnections = +process.env.maxConnections;
process.on('message', common.mustCall((message) => {
assert.strictEqual(message.action, 'disconnect');
process.disconnect();
}));
}

View File

@@ -0,0 +1,33 @@
const common = require('../common');
const assert = require('assert');
const net = require('net');
const server = net
.createServer(
{
noDelay: true,
},
common.mustCall((socket) => {
socket._handle.setNoDelay = common.mustNotCall();
socket.setNoDelay(true);
socket.destroy();
server.close();
}),
)
.listen(
0,
common.mustCall(() => {
net.connect(server.address().port);
}),
);
const onconnection = server._handle.onconnection;
server._handle.onconnection = common.mustCall((err, clientHandle) => {
const setNoDelay = clientHandle.setNoDelay;
clientHandle.setNoDelay = common.mustCall((enable) => {
assert.strictEqual(enable, server.noDelay);
setNoDelay.call(clientHandle, enable);
clientHandle.setNoDelay = setNoDelay;
});
onconnection.call(server._handle, err, clientHandle);
});