Skip to content

Commit fb9d660

Browse files
Added inspect port overriding in cluster
Current cluster inspect port logic doen't let user to manually set inspect port for workers. After this commit, adding any --inspect* options to execArgv in cluster.setupMaster's options will disable port autoincrement
1 parent ef28d85 commit fb9d660

File tree

2 files changed

+119
-18
lines changed

2 files changed

+119
-18
lines changed

lib/internal/cluster/master.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ cluster.SCHED_RR = SCHED_RR; // Master distributes connections.
2626
var ids = 0;
2727
var debugPortOffset = 1;
2828
var initialized = false;
29+
let debugSettingsOverriden = false;
2930

3031
// XXX(bnoordhuis) Fold cluster.schedulingPolicy into cluster.settings?
3132
var schedulingPolicy = {
@@ -41,15 +42,15 @@ if (schedulingPolicy === undefined) {
4142

4243
cluster.schedulingPolicy = schedulingPolicy;
4344

44-
cluster.setupMaster = function(options) {
45+
cluster.setupMaster = function(options = {}) {
4546
var settings = {
4647
args: process.argv.slice(2),
4748
exec: process.argv[1],
4849
execArgv: process.execArgv,
4950
silent: false
5051
};
5152
util._extend(settings, cluster.settings);
52-
util._extend(settings, options || {});
53+
util._extend(settings, options);
5354

5455
// Tell V8 to write profile data for each process to a separate file.
5556
// Without --logfile=v8-%p.log, everything ends up in a single, unusable
@@ -60,6 +61,14 @@ cluster.setupMaster = function(options) {
6061
settings.execArgv = settings.execArgv.concat(['--logfile=v8-%p.log']);
6162
}
6263

64+
// This allows user to override inspect port for workers.
65+
const debugPortArgsRegex = /--inspect(=|-port=)|--debug-port=/;
66+
67+
if (!debugSettingsOverriden && options.execArgv &&
68+
options.execArgv.some((arg) => arg.match(debugPortArgsRegex))) {
69+
debugSettingsOverriden = true;
70+
}
71+
6372
cluster.settings = settings;
6473

6574
if (initialized === true)
@@ -103,7 +112,8 @@ function createWorkerProcess(id, env) {
103112
util._extend(workerEnv, env);
104113
workerEnv.NODE_UNIQUE_ID = '' + id;
105114

106-
if (execArgv.some((arg) => arg.match(debugArgRegex))) {
115+
if (!debugSettingsOverriden &&
116+
execArgv.some((arg) => arg.match(debugArgRegex))) {
107117
execArgv.push(`--inspect-port=${process.debugPort + debugPortOffset}`);
108118
debugPortOffset++;
109119
}

test/inspector/test-inspector-port-cluster.js

Lines changed: 106 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ function testRunnerMain() {
2323
workers: [{expectedPort: 9230}]
2424
});
2525

26-
let port = debuggerPort + offset++ * 10;
26+
let port = debuggerPort + offset++ * 5;
2727

2828
spawnMaster({
2929
execArgv: [`--inspect=${port}`],
@@ -34,81 +34,172 @@ function testRunnerMain() {
3434
]
3535
});
3636

37-
port = debuggerPort + offset++ * 10;
37+
port = debuggerPort + offset++ * 5;
3838

3939
spawnMaster({
4040
execArgv: ['--inspect', `--inspect-port=${port}`],
4141
workers: [{expectedPort: port + 1}]
4242
});
4343

44-
port = debuggerPort + offset++ * 10;
44+
port = debuggerPort + offset++ * 5;
4545

4646
spawnMaster({
4747
execArgv: ['--inspect', `--debug-port=${port}`],
4848
workers: [{expectedPort: port + 1}]
4949
});
5050

51-
port = debuggerPort + offset++ * 10;
51+
port = debuggerPort + offset++ * 5;
5252

5353
spawnMaster({
5454
execArgv: [`--inspect=0.0.0.0:${port}`],
5555
workers: [{expectedPort: port + 1, expectedHost: '0.0.0.0'}]
5656
});
5757

58-
port = debuggerPort + offset++ * 10;
58+
port = debuggerPort + offset++ * 5;
5959

6060
spawnMaster({
6161
execArgv: [`--inspect=127.0.0.1:${port}`],
6262
workers: [{expectedPort: port + 1, expectedHost: '127.0.0.1'}]
6363
});
6464

6565
if (common.hasIPv6) {
66-
port = debuggerPort + offset++ * 10;
66+
port = debuggerPort + offset++ * 5;
6767

6868
spawnMaster({
6969
execArgv: [`--inspect=[::]:${port}`],
7070
workers: [{expectedPort: port + 1, expectedHost: '::'}]
7171
});
7272

73-
port = debuggerPort + offset++ * 10;
73+
port = debuggerPort + offset++ * 5;
7474

7575
spawnMaster({
7676
execArgv: [`--inspect=[::1]:${port}`],
7777
workers: [{expectedPort: port + 1, expectedHost: '::1'}]
7878
});
7979
}
80+
81+
/*
82+
* Following tests check that port should not increment
83+
* if developer sets inspector port in cluster.setupMaster arguments.
84+
*/
85+
86+
port = debuggerPort + offset++ * 5;
87+
88+
spawnMaster({
89+
execArgv: [`--inspect=${port}`],
90+
workers: [
91+
{expectedPort: port + 2},
92+
{expectedPort: port + 4},
93+
{expectedPort: port + 6}
94+
],
95+
clusterExecArgv: [
96+
[`--inspect=${port + 2}`],
97+
[`--inspect-port=${port + 4}`],
98+
[`--debug-port=${port + 6}`],
99+
]
100+
});
101+
102+
port = debuggerPort + offset++ * 5;
103+
104+
spawnMaster({
105+
execArgv: [],
106+
workers: [
107+
{expectedPort: port}
108+
],
109+
clusterExecArgv: [
110+
[`--inspect=${port}`]
111+
]
112+
});
113+
114+
// Next tests check that inspector port incrementing logic
115+
// is disabled if zero port passed to workers.
116+
// Even if supplied execArgv is equal to master's.
117+
118+
spawnMaster({
119+
execArgv: [],
120+
workers: [
121+
{expectedInitialPort: 0},
122+
{expectedInitialPort: 0},
123+
{expectedInitialPort: 0}
124+
],
125+
clusterExecArgv: [
126+
['--inspect=0'],
127+
['--inspect=0'],
128+
['--inspect=0']
129+
]
130+
});
131+
132+
spawnMaster({
133+
execArgv: ['--inspect=0'],
134+
workers: [
135+
{expectedInitialPort: 0},
136+
{expectedInitialPort: 0},
137+
{expectedInitialPort: 0}
138+
],
139+
clusterExecArgv: [
140+
['--inspect=0'],
141+
['--inspect=0'],
142+
['--inspect=0']
143+
]
144+
});
145+
146+
spawnMaster({
147+
execArgv: ['--inspect=0'],
148+
workers: [
149+
{expectedInitialPort: 0},
150+
{expectedInitialPort: 0},
151+
{expectedInitialPort: 0}
152+
],
153+
clusterExecArgv: [
154+
['--inspect', '--inspect-port=0'],
155+
['--inspect', '--inspect-port=0'],
156+
['--inspect', '--inspect-port=0']
157+
]
158+
});
159+
80160
}
81161

82162
function masterProcessMain() {
83163
const workers = JSON.parse(process.env.workers);
164+
const clusterExecArgv = JSON.parse(process.env.clusterExecArgv);
165+
166+
for (const [index, worker] of workers.entries()) {
167+
if (clusterExecArgv[index]) {
168+
cluster.setupMaster({execArgv: clusterExecArgv[index]});
169+
}
84170

85-
for (const worker of workers) {
86171
cluster.fork({
87172
expectedPort: worker.expectedPort,
173+
expectedInitialPort: worker.expectedInitialPort,
88174
expectedHost: worker.expectedHost
89175
}).on('exit', common.mustCall(checkExitCode));
90176
}
91177
}
92178

93179
function workerProcessMain() {
94-
const {expectedPort, expectedHost} = process.env;
180+
const {expectedPort, expectedInitialPort, expectedHost} = process.env;
181+
const debugOptions = process.binding('config').debugOptions;
182+
183+
if (+expectedPort) {
184+
assert.strictEqual(process.debugPort, +expectedPort);
185+
}
95186

96-
assert.strictEqual(process.debugPort, +expectedPort);
187+
if (+expectedInitialPort) {
188+
assert.strictEqual(debugOptions.port, +expectedInitialPort);
189+
}
97190

98191
if (expectedHost !== 'undefined') {
99-
assert.strictEqual(
100-
process.binding('config').debugOptions.host,
101-
expectedHost
102-
);
192+
assert.strictEqual(debugOptions.host, expectedHost);
103193
}
104194

105195
process.exit();
106196
}
107197

108-
function spawnMaster({execArgv, workers}) {
198+
function spawnMaster({execArgv, workers, clusterExecArgv = []}) {
109199
childProcess.fork(__filename, {
110200
env: {
111201
workers: JSON.stringify(workers),
202+
clusterExecArgv: JSON.stringify(clusterExecArgv),
112203
testProcess: true
113204
},
114205
execArgv

0 commit comments

Comments
 (0)