Repository: zookeeper
Updated Branches:
  refs/heads/master a0eba7abd -> eab6e7a13


ZOOKEEPER-2786: Flaky test: 
org.apache.zookeeper.test.ClientTest.testNonExistingOpCode

As hanm noticed and mentioned on the JIRA this flaky test can still fail. The 
reason is that we can reconnect before calling 
`watcher.waitForDisconnected(5000);` We need to make sure that we only process 
a single event from the watcher. Using a `synchronized (watcher)` provides that 
guarantee here.

This issue can be reproduced by dropping a Thread.sleep before 
`watcher.waitForDisconnected(5000);`.

Author: Abraham Fine <af...@apache.org>

Reviewers: Michael Han <h...@apache.org>

Closes #286 from afine/ZOOKEEPER-2786_3.5_fix

(cherry picked from commit 74e45a0d635702f1a1f57adffdaba9acdc9efee2)
Signed-off-by: Michael Han <h...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/eab6e7a1
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/eab6e7a1
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/eab6e7a1

Branch: refs/heads/master
Commit: eab6e7a139eed285973950b8d4f95dfc3d52b5a6
Parents: a0eba7a
Author: Abraham Fine <af...@apache.org>
Authored: Fri Jun 30 13:43:45 2017 -0700
Committer: Michael Han <h...@apache.org>
Committed: Fri Jun 30 13:43:53 2017 -0700

----------------------------------------------------------------------
 .../org/apache/zookeeper/test/ClientTest.java   | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/eab6e7a1/src/java/test/org/apache/zookeeper/test/ClientTest.java
----------------------------------------------------------------------
diff --git a/src/java/test/org/apache/zookeeper/test/ClientTest.java 
b/src/java/test/org/apache/zookeeper/test/ClientTest.java
index ffc81c1..6373bb3 100644
--- a/src/java/test/org/apache/zookeeper/test/ClientTest.java
+++ b/src/java/test/org/apache/zookeeper/test/ClientTest.java
@@ -18,12 +18,11 @@
 
 package org.apache.zookeeper.test;
 
-import static org.junit.Assert.fail;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -33,6 +32,7 @@ import org.apache.zookeeper.KeeperException.Code;
 import org.apache.zookeeper.KeeperException.InvalidACLException;
 import org.apache.zookeeper.TestableZooKeeper;
 import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.Watcher.Event.EventType;
 import org.apache.zookeeper.Watcher.Event.KeeperState;
 import org.apache.zookeeper.ZooDefs.Ids;
@@ -828,8 +828,16 @@ public class ClientTest extends ClientBase {
      */
     @Test
     public void testNonExistingOpCode() throws Exception  {
-        CountdownWatcher watcher = new CountdownWatcher();
-        TestableZooKeeper zk = createClient(watcher);
+        final CountDownLatch clientDisconnected = new CountDownLatch(1);
+        Watcher watcher = new Watcher() {
+            @Override
+            public synchronized void process(WatchedEvent event) {
+                if (event.getState() == KeeperState.Disconnected) {
+                    clientDisconnected.countDown();
+                }
+            }
+        };
+        TestableZooKeeper zk = new TestableZooKeeper(hostPort, 
CONNECTION_TIMEOUT, watcher);
 
         final String path = "/m1";
 
@@ -839,12 +847,14 @@ public class ClientTest extends ClientBase {
         request.setPath(path);
         request.setWatch(false);
         ExistsResponse response = new ExistsResponse();
+
         ReplyHeader r = zk.submitRequest(h, request, response, null);
 
         Assert.assertEquals(r.getErr(), Code.UNIMPLEMENTED.intValue());
 
         // Sending a nonexisting opcode should cause the server to disconnect
-        watcher.waitForDisconnected(5000);
+        Assert.assertTrue("failed to disconnect",
+                clientDisconnected.await(5000, TimeUnit.MILLISECONDS));
     }
 
     @Test

Reply via email to