From 093eae38115fb23e6a36dede255f2d4a04e14cb9 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 11 Jun 2015 11:47:52 -0400 Subject: [PATCH] cluster: do not unconditionally set --debug-port Currently, each cluster worker is assigned an ever increasing --debug-port argument. A long running cluster application that does not use the debugger can run into errors related to the port range. This commit mitigates the problem by only setting the debug port if the master is started with debug arguments, or the user explicitly defines debug arguments for the worker. This commit also adds a new debug port offset counter that is only incremented when a worker is created that utilizes debugging. Fixes: https://github.com/joyent/node/issues/8159 Refs: https://github.com/nodejs/io.js/pull/1524 PR-URL: https://github.com/nodejs/io.js/pull/1949 Reviewed-By: Ben Noordhuis Reviewed-By: Oleg Elifantiev --- lib/cluster.js | 10 +++---- test/parallel/test-cluster-debug-port.js | 38 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 test/parallel/test-cluster-debug-port.js diff --git a/lib/cluster.js b/lib/cluster.js index 9f70c0273c528b..cbccd02605cb67 100644 --- a/lib/cluster.js +++ b/lib/cluster.js @@ -278,11 +278,11 @@ function masterInit() { cluster.emit('setup', settings); } + var debugPortOffset = 1; + function createWorkerProcess(id, env) { var workerEnv = util._extend({}, process.env); var execArgv = cluster.settings.execArgv.slice(); - var debugPort = process.debugPort + id; - var hasDebugArg = false; workerEnv = util._extend(workerEnv, env); workerEnv.NODE_UNIQUE_ID = '' + id; @@ -291,14 +291,12 @@ function masterInit() { var match = execArgv[i].match(/^(--debug|--debug-(brk|port))(=\d+)?$/); if (match) { + let debugPort = process.debugPort + debugPortOffset; + ++debugPortOffset; execArgv[i] = match[1] + '=' + debugPort; - hasDebugArg = true; } } - if (!hasDebugArg) - execArgv = ['--debug-port=' + debugPort].concat(execArgv); - return fork(cluster.settings.exec, cluster.settings.args, { env: workerEnv, silent: cluster.settings.silent, diff --git a/test/parallel/test-cluster-debug-port.js b/test/parallel/test-cluster-debug-port.js new file mode 100644 index 00000000000000..1a42850e9b2bc1 --- /dev/null +++ b/test/parallel/test-cluster-debug-port.js @@ -0,0 +1,38 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const cluster = require('cluster'); + +if (cluster.isMaster) { + assert.strictEqual(process.execArgv.length, 0, 'run test with no args'); + + function checkExitCode(code, signal) { + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + } + + console.log('forked worker should not have --debug-port'); + cluster.fork().on('exit', checkExitCode); + + cluster.setupMaster({ + execArgv: ['--debug-port=' + process.debugPort] + }); + + console.log('forked worker should have --debug-port, with offset = 1'); + cluster.fork({ + portSet: process.debugPort + 1 + }).on('exit', checkExitCode); + + console.log('forked worker should have --debug-port, with offset = 2'); + cluster.fork({ + portSet: process.debugPort + 2 + }).on('exit', checkExitCode); +} else { + const hasDebugArg = process.execArgv.some(function(arg) { + return /debug/.test(arg); + }); + + assert.strictEqual(hasDebugArg, process.env.portSet !== undefined); + assert.strictEqual(process.debugPort, +process.env.portSet || 5858); + process.exit(); +}