summaryrefslogtreecommitdiff
path: root/test/parallel/test-cluster-disconnect-race.js
diff options
context:
space:
mode:
authorRich Trott <rtrott@gmail.com>2015-12-24 13:00:29 -0800
committerRich Trott <rtrott@gmail.com>2015-12-27 13:10:28 -0800
commit57a51a00e8472bae21bc0a4767535bd3c55e592c (patch)
tree6921db8464f6dcb5859b9c395d09526f8e71b116 /test/parallel/test-cluster-disconnect-race.js
parent082cc8d6d8f5c7c797e58cefeb475b783c730635 (diff)
downloadandroid-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.js33
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');
+});