From b6e22c4bd57831512aef370419db319a3ac15fc2 Mon Sep 17 00:00:00 2001 From: Ali Ijaz Sheikh Date: Mon, 30 Mar 2015 10:54:59 -0700 Subject: [PATCH] src: setup cluster workers before preloading We need to process cluster workers before any preload modules is executed. Otherwise, the child processes are not correctly disovered as clustered workers inside the preloaded modules. Fixes: https://github.com/iojs/io.js/issues/1269 PR-URL: https://github.com/iojs/io.js/pull/1314 Reviewed-By: Ben Noordhuis Reviewed-By: Fedor Indutny --- src/node.js | 21 +++++++++++---------- test/fixtures/cluster-preload-test.js | 7 +++++++ test/fixtures/cluster-preload.js | 3 +++ test/parallel/test-preload.js | 8 ++++++++ 4 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 test/fixtures/cluster-preload-test.js create mode 100644 test/fixtures/cluster-preload.js diff --git a/src/node.js b/src/node.js index 6346529..1339fb3 100644 --- a/src/node.js +++ b/src/node.js @@ -71,6 +71,17 @@ } else { // There is user code to be run + // If this is a worker in cluster mode, start up the communication + // channel. This needs to be done before any user code gets executed + // (including preload modules). + if (process.argv[1] && process.env.NODE_UNIQUE_ID) { + var cluster = NativeModule.require('cluster'); + cluster._setupWorker(); + + // Make sure it's not accidentally inherited by child processes. + delete process.env.NODE_UNIQUE_ID; + } + // Load any preload modules if (process._preload_modules) { var Module = NativeModule.require('module'); @@ -87,16 +98,6 @@ var path = NativeModule.require('path'); process.argv[1] = path.resolve(process.argv[1]); - // If this is a worker in cluster mode, start up the communication - // channel. - if (process.env.NODE_UNIQUE_ID) { - var cluster = NativeModule.require('cluster'); - cluster._setupWorker(); - - // Make sure it's not accidentally inherited by child processes. - delete process.env.NODE_UNIQUE_ID; - } - var Module = NativeModule.require('module'); if (global.v8debug && diff --git a/test/fixtures/cluster-preload-test.js b/test/fixtures/cluster-preload-test.js new file mode 100644 index 0000000..43d3887 --- /dev/null +++ b/test/fixtures/cluster-preload-test.js @@ -0,0 +1,7 @@ +var cluster = require('cluster'); +if (cluster.isMaster) { + cluster.fork(); // one child + cluster.on('exit', function(worker, code, signal) { + console.log('worker terminated with code ' + code); + }); +} diff --git a/test/fixtures/cluster-preload.js b/test/fixtures/cluster-preload.js new file mode 100644 index 0000000..651fc48 --- /dev/null +++ b/test/fixtures/cluster-preload.js @@ -0,0 +1,3 @@ +var cluster = require('cluster'); +cluster.isMaster || process.exit(42 + cluster.worker.id); // +42 to distinguish +// from exit(1) for other random reasons diff --git a/test/parallel/test-preload.js b/test/parallel/test-preload.js index aef778b..643edfb 100644 --- a/test/parallel/test-preload.js +++ b/test/parallel/test-preload.js @@ -72,3 +72,11 @@ child_process.exec(nodeBinary + ' ' if (err) throw err; assert.equal(stdout, 'A\nB\nhello\n'); }); + +child_process.exec(nodeBinary + ' ' + + '--require ' + fixture('cluster-preload.js') + ' ' + + fixture('cluster-preload-test.js'), + function(err, stdout, stderr) { + if (err) throw err; + assert.ok(/worker terminated with code 43/.test(stdout)); + }); -- 2.7.4