Skip to content

Commit bd5c12f

Browse files
committed
cluster: report EADDRINUSE when a worker listens twice on the same port
1 parent facd71e commit bd5c12f

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

‎lib/internal/cluster/primary.js‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const {
1616
} = require('internal/errors');
1717

1818
const assert = require('internal/assert');
19+
const { UV_EADDRINUSE } = internalBinding('uv');
1920
const { fork } = require('child_process');
2021
const path = require('path');
2122
const EventEmitter = require('events');
@@ -274,7 +275,16 @@ function queryServer(worker, message) {
274275
`${message.fd}` + (message.port === 0 ? `:${message.index}` : '');
275276
const cachedHandle = handles.get(key);
276277
let handle;
277-
if (cachedHandle && !cachedHandle.has(worker)) {
278+
if (cachedHandle) {
279+
if (cachedHandle.has(worker)) {
280+
send(worker, {
281+
errno: UV_EADDRINUSE,
282+
key,
283+
ack: message.seq,
284+
data: cachedHandle.data,
285+
});
286+
return;
287+
}
278288
handle = cachedHandle;
279289
}
280290

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const cluster = require('cluster');
6+
const net = require('net');
7+
8+
if (cluster.isPrimary) {
9+
cluster.fork().on('exit', common.mustCall((code) => {
10+
assert.strictEqual(code, 0);
11+
}));
12+
return;
13+
}
14+
15+
function listen() {
16+
return new Promise((resolve, reject) => {
17+
const server = net.createServer();
18+
server.once('error', reject);
19+
server.once('listening', () => resolve(server));
20+
server.listen({ host: '127.0.0.1', port: common.PORT });
21+
});
22+
}
23+
24+
(async () => {
25+
const server1 = await listen();
26+
await assert.rejects(listen(), { code: 'EADDRINUSE' });
27+
await new Promise((resolve) => server1.close(resolve));
28+
cluster.worker.disconnect();
29+
})().then(common.mustCall());

0 commit comments

Comments
 (0)