diff options
author | Rich Trott <rtrott@gmail.com> | 2015-12-24 13:00:29 -0800 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2015-12-27 13:10:28 -0800 |
commit | 57a51a00e8472bae21bc0a4767535bd3c55e592c (patch) | |
tree | 6921db8464f6dcb5859b9c395d09526f8e71b116 /test/parallel/test-cluster-disconnect-race.js | |
parent | 082cc8d6d8f5c7c797e58cefeb475b783c730635 (diff) | |
download | android-node-v8-57a51a00e8472bae21bc0a4767535bd3c55e592c.tar.gz android-node-v8-57a51a00e8472bae21bc0a4767535bd3c55e592c.tar.bz2 android-node-v8-57a51a00e8472bae21bc0a4767535bd3c55e592c.zip |
child_process: guard against race condition
It is possible that the internal hnadleMessage() might try to send to
a channel that has been closed. The result can be an AssertionError.
Guard against this.
Fixes: https://github.com/nodejs/node/issues/4205
PR-URL: https://github.com/nodejs/node/pull/4418
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Diffstat (limited to 'test/parallel/test-cluster-disconnect-race.js')
-rw-r--r-- | test/parallel/test-cluster-disconnect-race.js | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/test/parallel/test-cluster-disconnect-race.js b/test/parallel/test-cluster-disconnect-race.js new file mode 100644 index 0000000000..40cfd919e3 --- /dev/null +++ b/test/parallel/test-cluster-disconnect-race.js @@ -0,0 +1,33 @@ +'use strict'; + +// This code triggers an AssertionError on Linux in Node.js 5.3.0 and earlier. +// Ref: https://github.com/nodejs/node/issues/4205 + +const common = require('../common'); +const assert = require('assert'); +const net = require('net'); +const cluster = require('cluster'); +cluster.schedulingPolicy = cluster.SCHED_NONE; + +if (cluster.isMaster) { + var worker1, worker2; + + worker1 = cluster.fork(); + worker1.on('message', common.mustCall(function() { + worker2 = cluster.fork(); + worker1.disconnect(); + worker2.on('online', common.mustCall(worker2.disconnect)); + })); + + cluster.on('exit', function(worker, code) { + assert.strictEqual(code, 0, 'worker exited with error'); + }); + + return; +} + +var server = net.createServer(); + +server.listen(common.PORT, function() { + process.send('listening'); +}); |