You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2013/05/17 22:39:16 UTC

[06/12] git commit: CURATOR-18 There is a race between creating a node and deleting it. If LeaderLatch is closed while the node creation is in flight, the created node won't get deleted, and latch node will stay in ZK forever.

CURATOR-18
There is a race between creating a node and deleting it. If LeaderLatch is closed while the node creation is in flight, the created node won't get deleted, and latch node will stay in ZK forever.


Project: http://git-wip-us.apache.org/repos/asf/incubator-curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-curator/commit/38f28b5c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-curator/tree/38f28b5c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-curator/diff/38f28b5c

Branch: refs/heads/master
Commit: 38f28b5c951fd341c9845a3538d52bb3508536e2
Parents: 3d6181c
Author: randgalt <ra...@apache.org>
Authored: Thu May 9 17:00:43 2013 -0700
Committer: randgalt <ra...@apache.org>
Committed: Thu May 9 17:00:43 2013 -0700

----------------------------------------------------------------------
 .../framework/recipes/leader/LeaderLatch.java      |    9 ++++-
 .../framework/recipes/leader/TestLeaderLatch.java  |   30 +++++++++++++++
 2 files changed, 38 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-curator/blob/38f28b5c/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
----------------------------------------------------------------------
diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
index 508ca7c..dc37386 100644
--- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
+++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/leader/LeaderLatch.java
@@ -396,7 +396,14 @@ public class LeaderLatch implements Closeable
                 if ( event.getResultCode() == KeeperException.Code.OK.intValue() )
                 {
                     setNode(event.getName());
-                    getChildren();
+                    if ( state.get() == State.CLOSED )
+                    {
+                        setNode(null);
+                    }
+                    else
+                    {
+                        getChildren();
+                    }
                 }
                 else
                 {

http://git-wip-us.apache.org/repos/asf/incubator-curator/blob/38f28b5c/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
----------------------------------------------------------------------
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
index 58a61ee..4741e76 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
@@ -80,6 +80,36 @@ public class TestLeaderLatch extends BaseClassForTests
     }
 
     @Test
+    public void testCreateDeleteRace() throws Exception
+    {
+        Timing timing = new Timing();
+        CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
+        try
+        {
+            client.start();
+            LeaderLatch latch = new LeaderLatch(client, PATH_NAME);
+
+            latch.debugResetWaitLatch = new CountDownLatch(1);
+
+            latch.start();
+            latch.close();
+
+            timing.sleepABit();
+
+            latch.debugResetWaitLatch.countDown();
+
+            timing.sleepABit();
+
+            Assert.assertEquals(client.getChildren().forPath(PATH_NAME).size(), 0);
+
+        }
+        finally
+        {
+            Closeables.closeQuietly(client);
+        }
+    }
+
+    @Test
     public void testLostConnection() throws Exception
     {
         final int PARTICIPANT_QTY = 10;