Return-Path: X-Original-To: apmail-curator-commits-archive@minotaur.apache.org Delivered-To: apmail-curator-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 46B091844C for ; Fri, 16 Oct 2015 18:40:18 +0000 (UTC) Received: (qmail 12741 invoked by uid 500); 16 Oct 2015 18:40:18 -0000 Delivered-To: apmail-curator-commits-archive@curator.apache.org Received: (qmail 12665 invoked by uid 500); 16 Oct 2015 18:40:18 -0000 Mailing-List: contact commits-help@curator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@curator.apache.org Delivered-To: mailing list commits@curator.apache.org Received: (qmail 12637 invoked by uid 99); 16 Oct 2015 18:40:17 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 16 Oct 2015 18:40:17 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id BDBF6E0200; Fri, 16 Oct 2015 18:40:17 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: randgalt@apache.org To: commits@curator.apache.org Date: Fri, 16 Oct 2015 18:40:17 -0000 Message-Id: <579ae6bf35b84a0fb91da9f456646006@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/7] curator git commit: continue watching the node until it is deleted or the recipe is stopped Repository: curator Updated Branches: refs/heads/CURATOR-267 275b1d5e9 -> 722d0cee3 continue watching the node until it is deleted or the recipe is stopped Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/cdb3a803 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/cdb3a803 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/cdb3a803 Branch: refs/heads/CURATOR-267 Commit: cdb3a8035a551e3fb23e972a19cbeae47b14c27f Parents: 970bd39 Author: Njal Karevoll Authored: Wed Sep 2 20:03:28 2015 +0200 Committer: Njal Karevoll Committed: Wed Sep 2 20:03:28 2015 +0200 ---------------------------------------------------------------------- .../recipes/nodes/PersistentEphemeralNode.java | 18 +++-- .../nodes/TestPersistentEphemeralNode.java | 82 ++++++++++++++++++++ 2 files changed, 95 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/cdb3a803/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java index 7e00e10..4868c7a 100644 --- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java +++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java @@ -74,10 +74,18 @@ public class PersistentEphemeralNode implements Closeable @Override public void process(WatchedEvent event) { - if ( event.getType() == EventType.NodeDeleted) - { - createNode(); - } + if ( event.getType() == EventType.NodeDeleted) + { + createNode(); + } + else if ( event.getType() == EventType.NodeDataChanged) + { + try { + watchNode(); + } catch (Exception e) { + log.error(String.format("Unexpected error during watching of path: %s", basePath), e); + } + } } }; private final BackgroundCallback checkExistsCallback = new BackgroundCallback() @@ -426,4 +434,4 @@ public class PersistentEphemeralNode implements Closeable { return authFailure.get(); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/curator/blob/cdb3a803/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java index 8d5d05f..84eaa52 100644 --- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java +++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java @@ -391,6 +391,46 @@ public class TestPersistentEphemeralNode extends BaseClassForTests } @Test + public void testRecreatesNodeWhenEphemeralOwnerSessionExpires() throws Exception + { + CuratorFramework curator = newCurator(); + CuratorFramework nodeCreator = newCurator(); + CuratorFramework observer = newCurator(); + + nodeCreator.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(PATH, new byte[0]); + + Trigger dataChangedTrigger = Trigger.dataChanged(); + observer.getData().usingWatcher(dataChangedTrigger).forPath(PATH); + + PersistentEphemeralNode node = new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, new byte[0]); + node.start(); + try + { + node.waitForInitialCreate(5, TimeUnit.SECONDS); + assertNodeExists(observer, node.getActualPath()); + + assertTrue(dataChangedTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS)); + + Trigger deletedTrigger = Trigger.deleted(); + observer.checkExists().usingWatcher(deletedTrigger).forPath(node.getActualPath()); + + killSession(nodeCreator); + + // Make sure the node got deleted... + assertTrue(deletedTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS)); + + // Check for it to be recreated... + Trigger createdTrigger = Trigger.created(); + Stat stat = observer.checkExists().usingWatcher(createdTrigger).forPath(node.getActualPath()); + assertTrue(stat != null || createdTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS)); + } + finally + { + node.close(); + } + } + + @Test public void testRecreatesNodeWhenItGetsDeleted() throws Exception { CuratorFramework curator = newCurator(); @@ -419,6 +459,43 @@ public class TestPersistentEphemeralNode extends BaseClassForTests } @Test + public void testRecreatesNodeWhenItGetsDeletedAfterSetData() throws Exception + { + CuratorFramework curator = newCurator(); + + PersistentEphemeralNode node = new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, new byte[0]); + node.start(); + try + { + node.waitForInitialCreate(timing.forWaiting().seconds(), TimeUnit.SECONDS); + String originalNode = node.getActualPath(); + assertNodeExists(curator, originalNode); + + Trigger dataChangedTrigger = Trigger.dataChanged(); + curator.getData().usingWatcher(dataChangedTrigger).forPath(originalNode); + + // update the data of the node + node.setData(new byte[0]); + + // wait for the data to be updated: + assertTrue(dataChangedTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS)); + + // Delete the original node... + curator.delete().forPath(originalNode); + + // Since we're using an ephemeral node, and the original session hasn't been interrupted the name of the new + // node that gets created is going to be exactly the same as the original. + Trigger createdWatchTrigger = Trigger.created(); + Stat stat = curator.checkExists().usingWatcher(createdWatchTrigger).forPath(originalNode); + assertTrue(stat != null || createdWatchTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS)); + } + finally + { + node.close(); + } + } + + @Test public void testNodesCreateUniquePaths() throws Exception { CuratorFramework curator = newCurator(); @@ -721,5 +798,10 @@ public class TestPersistentEphemeralNode extends BaseClassForTests { return new Trigger(Event.EventType.NodeDeleted); } + + private static Trigger dataChanged() + { + return new Trigger(EventType.NodeDataChanged); + } } }