Skip to content

Commit 96d1316

Browse files
MoLowrichardlau
authored andcommitted
cluster: use inspector utils
PR-URL: #44592 Backport-PR-URL: #44873 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent 02a18ea commit 96d1316

File tree

2 files changed

+20
-36
lines changed

2 files changed

+20
-36
lines changed

lib/internal/cluster/primary.js

+11-27
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ const {
66
ArrayPrototypeSome,
77
ObjectKeys,
88
ObjectValues,
9-
RegExpPrototypeExec,
109
SafeMap,
1110
StringPrototypeStartsWith,
1211
} = primordials;
12+
const {
13+
codes: {
14+
ERR_SOCKET_BAD_PORT,
15+
}
16+
} = require('internal/errors');
1317

1418
const assert = require('internal/assert');
1519
const { fork } = require('child_process');
@@ -18,14 +22,12 @@ const EventEmitter = require('events');
1822
const RoundRobinHandle = require('internal/cluster/round_robin_handle');
1923
const SharedHandle = require('internal/cluster/shared_handle');
2024
const Worker = require('internal/cluster/worker');
25+
const { getInspectPort, isUsingInspector } = require('internal/util/inspector');
2126
const { internal, sendHelper } = require('internal/cluster/utils');
2227
const cluster = new EventEmitter();
2328
const intercom = new EventEmitter();
2429
const SCHED_NONE = 1;
2530
const SCHED_RR = 2;
26-
const minPort = 1024;
27-
const maxPort = 65535;
28-
const { validatePort } = require('internal/validators');
2931

3032
module.exports = cluster;
3133

@@ -40,7 +42,6 @@ cluster.SCHED_NONE = SCHED_NONE; // Leave it to the operating system.
4042
cluster.SCHED_RR = SCHED_RR; // Primary distributes connections.
4143

4244
let ids = 0;
43-
let debugPortOffset = 1;
4445
let initialized = false;
4546

4647
// XXX(bnoordhuis) Fold cluster.schedulingPolicy into cluster.settings?
@@ -117,29 +118,12 @@ function setupSettingsNT(settings) {
117118
function createWorkerProcess(id, env) {
118119
const workerEnv = { ...process.env, ...env, NODE_UNIQUE_ID: `${id}` };
119120
const execArgv = [...cluster.settings.execArgv];
120-
const debugArgRegex = /--inspect(?:-brk|-port)?|--debug-port/;
121-
const nodeOptions = process.env.NODE_OPTIONS || '';
122-
123-
// TODO(MoLow): Use getInspectPort from internal/util/inspector
124-
if (ArrayPrototypeSome(execArgv,
125-
(arg) => RegExpPrototypeExec(debugArgRegex, arg) !== null) ||
126-
RegExpPrototypeExec(debugArgRegex, nodeOptions) !== null) {
127-
let inspectPort;
128-
if ('inspectPort' in cluster.settings) {
129-
if (typeof cluster.settings.inspectPort === 'function')
130-
inspectPort = cluster.settings.inspectPort();
131-
else
132-
inspectPort = cluster.settings.inspectPort;
133-
134-
validatePort(inspectPort);
135-
} else {
136-
inspectPort = process.debugPort + debugPortOffset;
137-
if (inspectPort > maxPort)
138-
inspectPort = inspectPort - maxPort + minPort - 1;
139-
debugPortOffset++;
140-
}
141121

142-
ArrayPrototypePush(execArgv, `--inspect-port=${inspectPort}`);
122+
if (cluster.settings.inspectPort === null) {
123+
throw new ERR_SOCKET_BAD_PORT('Port', null, true);
124+
}
125+
if (isUsingInspector(cluster.settings.execArgv)) {
126+
ArrayPrototypePush(execArgv, `--inspect-port=${getInspectPort(cluster.settings.inspectPort)}`);
143127
}
144128

145129
return fork(cluster.settings.exec, cluster.settings.args, {

lib/internal/util/inspector.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const {
88
ObjectKeys,
99
ObjectPrototypeHasOwnProperty,
1010
RegExpPrototypeExec,
11+
SafeWeakMap,
1112
} = primordials;
1213

1314
const { validatePort } = require('internal/validators');
@@ -17,19 +18,18 @@ const kMaxPort = 65535;
1718
const kInspectArgRegex = /--inspect(?:-brk|-port)?|--debug-port/;
1819
const kInspectMsgRegex = /Debugger listening on ws:\/\/\[?(.+?)\]?:(\d+)\/|Debugger attached|Waiting for the debugger to disconnect\.\.\./;
1920

20-
let _isUsingInspector;
21-
function isUsingInspector() {
22-
_isUsingInspector ??=
23-
ArrayPrototypeSome(process.execArgv, (arg) => RegExpPrototypeExec(kInspectArgRegex, arg) !== null) ||
24-
RegExpPrototypeExec(kInspectArgRegex, process.env.NODE_OPTIONS) !== null;
25-
return _isUsingInspector;
21+
const _isUsingInspector = new SafeWeakMap();
22+
function isUsingInspector(execArgv = process.execArgv) {
23+
if (!_isUsingInspector.has(execArgv)) {
24+
_isUsingInspector.set(execArgv,
25+
ArrayPrototypeSome(execArgv, (arg) => RegExpPrototypeExec(kInspectArgRegex, arg) !== null) ||
26+
RegExpPrototypeExec(kInspectArgRegex, process.env.NODE_OPTIONS) !== null);
27+
}
28+
return _isUsingInspector.get(execArgv);
2629
}
2730

2831
let debugPortOffset = 1;
2932
function getInspectPort(inspectPort) {
30-
if (!isUsingInspector()) {
31-
return null;
32-
}
3333
if (typeof inspectPort === 'function') {
3434
inspectPort = inspectPort();
3535
} else if (inspectPort == null) {

0 commit comments

Comments
 (0)