From a88524d388bd68574bca002484ebacb2a6ba33af Mon Sep 17 00:00:00 2001
From: Brian Silverman <brian@peloton-tech.com>
Date: Mon, 20 Jul 2015 19:41:03 -0700
Subject: [PATCH] Fix test_proxy hanging occasionally by setting ZMQ_LINGER to
 0.

---
 tests/test_proxy.cpp | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/tests/test_proxy.cpp b/tests/test_proxy.cpp
index 425fb1e1..fe35b768 100644
--- a/tests/test_proxy.cpp
+++ b/tests/test_proxy.cpp
@@ -62,6 +62,9 @@ client_task (void *ctx)
     assert (control);
     int rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0);
     assert (rc == 0);
+    int linger = 0;
+    rc = zmq_setsockopt (control, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
     rc = zmq_connect (control, "inproc://control");
     assert (rc == 0);
 
@@ -71,6 +74,9 @@ client_task (void *ctx)
     sprintf (identity, "%04X-%04X", rand() % 0xFFFF, rand() % 0xFFFF);
     rc = zmq_setsockopt (client, ZMQ_IDENTITY, identity, ID_SIZE); // includes '\0' as an helper for printf
     assert (rc == 0);
+    linger = 0;
+    rc = zmq_setsockopt (client, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
     rc = zmq_connect (client, "tcp://127.0.0.1:5563");
     assert (rc == 0);
 
@@ -128,12 +134,17 @@ server_task (void *ctx)
     // Frontend socket talks to clients over TCP
     void *frontend = zmq_socket (ctx, ZMQ_ROUTER);
     assert (frontend);
-    int rc = zmq_bind (frontend, "tcp://127.0.0.1:5563");
+    int linger = 0;
+    int rc = zmq_setsockopt (frontend, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
+    rc = zmq_bind (frontend, "tcp://127.0.0.1:5563");
     assert (rc == 0);
 
     // Backend socket talks to workers over inproc
     void *backend = zmq_socket (ctx, ZMQ_DEALER);
     assert (backend);
+    rc = zmq_setsockopt (backend, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
     rc = zmq_bind (backend, "inproc://backend");
     assert (rc == 0);
 
@@ -142,6 +153,8 @@ server_task (void *ctx)
     assert (control);
     rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0);
     assert (rc == 0);
+    rc = zmq_setsockopt (control, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
     rc = zmq_connect (control, "inproc://control");
     assert (rc == 0);
 
@@ -174,7 +187,10 @@ server_worker (void *ctx)
 {
     void *worker = zmq_socket (ctx, ZMQ_DEALER);
     assert (worker);
-    int rc = zmq_connect (worker, "inproc://backend");
+    int linger = 0;
+    int rc = zmq_setsockopt (worker, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
+    rc = zmq_connect (worker, "inproc://backend");
     assert (rc == 0);
 
     // Control socket receives terminate command from main over inproc
@@ -182,6 +198,8 @@ server_worker (void *ctx)
     assert (control);
     rc = zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0);
     assert (rc == 0);
+    rc = zmq_setsockopt (control, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
     rc = zmq_connect (control, "inproc://control");
     assert (rc == 0);
 
@@ -237,7 +255,10 @@ int main (void)
     // Control socket receives terminate command from main over inproc
     void *control = zmq_socket (ctx, ZMQ_PUB);
     assert (control);
-    int rc = zmq_bind (control, "inproc://control");
+    int linger = 0;
+    int rc = zmq_setsockopt (control, ZMQ_LINGER, &linger, sizeof (linger));
+    assert (rc == 0);
+    rc = zmq_bind (control, "inproc://control");
     assert (rc == 0);
 
     void *threads [QT_CLIENTS + 1];
-- 
2.18.0