mirror of https://github.com/lukechilds/node.git
Browse Source
It avoids the creation of unnecessary handles. This issue is causing intermitent failures in `test-cluster-disconnect-race` on `FreeBSD` and `OS X`. The problem is that the `worker2.disconnect` is being called on the master before the `queryServer` is handled, causing the worker to be deleted, then the Server handle is created afterwards. Later on, when `removeWorker` is called from the `exit` handler, there are no workers left, but one handle, thus the `AssertionError`. Add a new `test/sequential/test-cluster-disconnect-leak` based on `test-cluster-disconnect-race` that creates lots of workers and fails consistently without this patch. PR-URL: https://github.com/nodejs/node/pull/4465 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Johan Bergström <bugs@bergstroem.nu> Reviewed-By: Rich Trott <rtrott@gmail.com>process-exit-stdio-flushing
Santiago Gimeno
9 years ago
committed by
Rich Trott
2 changed files with 50 additions and 0 deletions
@ -0,0 +1,47 @@ |
|||||
|
'use strict'; |
||||
|
// Flags: --expose-internals
|
||||
|
|
||||
|
const common = require('../common'); |
||||
|
const assert = require('assert'); |
||||
|
const net = require('net'); |
||||
|
const cluster = require('cluster'); |
||||
|
const handles = require('internal/cluster').handles; |
||||
|
const os = require('os'); |
||||
|
|
||||
|
if (common.isWindows) { |
||||
|
console.log('1..0 # Skipped: This test does not apply to Windows.'); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
cluster.schedulingPolicy = cluster.SCHED_NONE; |
||||
|
|
||||
|
if (cluster.isMaster) { |
||||
|
const cpus = os.cpus().length; |
||||
|
const tries = cpus > 8 ? 128 : cpus * 16; |
||||
|
|
||||
|
const worker1 = cluster.fork(); |
||||
|
worker1.on('message', common.mustCall(() => { |
||||
|
worker1.disconnect(); |
||||
|
for (let i = 0; i < tries; ++ i) { |
||||
|
const w = cluster.fork(); |
||||
|
w.on('online', common.mustCall(w.disconnect)); |
||||
|
} |
||||
|
})); |
||||
|
|
||||
|
cluster.on('exit', common.mustCall((worker, code) => { |
||||
|
assert.strictEqual(code, 0, 'worker exited with error'); |
||||
|
}, tries + 1)); |
||||
|
|
||||
|
process.on('exit', () => { |
||||
|
assert.deepEqual(Object.keys(cluster.workers), []); |
||||
|
assert.strictEqual(Object.keys(handles).length, 0); |
||||
|
}); |
||||
|
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var server = net.createServer(); |
||||
|
|
||||
|
server.listen(common.PORT, function() { |
||||
|
process.send('listening'); |
||||
|
}); |
Loading…
Reference in new issue