test: fix cluster-worker-wait-server-close races
authorSam Roberts <sam@strongloop.com>
Thu, 11 Jun 2015 21:43:09 +0000 (14:43 -0700)
committerSam Roberts <sam@strongloop.com>
Fri, 12 Jun 2015 19:56:40 +0000 (12:56 -0700)
Wait for data to arrive from worker before doing a disconnect. Without
this, whether the disconnect arrives at the worker before the master
accepts and forwards the connection descriptor to the worker is a race.

Reviewed-By: Sam Roberts <vieuxtech@gmail.com>
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Rod Vagg <rod@vagg.org>
PR-URL: https://github.com/nodejs/io.js/pull/1953
Fixes: https://github.com/nodejs/io.js/issues/1933
Fixes: https://github.com/nodejs/io.js/pull/1400

test/parallel/test-cluster-worker-wait-server-close.js

index 0f1836c..0488343 100644 (file)
@@ -8,7 +8,9 @@ var net = require('net');
 if (cluster.isWorker) {
   net.createServer(function(socket) {
     // Wait for any data, then close connection
-    socket.on('data', socket.end.bind(socket));
+    socket.write('.');
+    socket.on('data', function discard() {
+    });
   }).listen(common.PORT, common.localhostIPv4);
 } else if (cluster.isMaster) {
 
@@ -22,11 +24,15 @@ if (cluster.isWorker) {
   worker.once('listening', function() {
     net.createConnection(common.PORT, common.localhostIPv4, function() {
       var socket = this;
-      worker.disconnect();
-      setTimeout(function() {
-        socket.write('.');
-        connectionDone = true;
-      }, 1000);
+      this.on('data', function() {
+        console.log('got data from client');
+        // socket definitely connected to worker if we got data
+        worker.disconnect();
+        setTimeout(function() {
+          socket.end();
+          connectionDone = true;
+        }, 1000);
+      });
     });
   });