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 2015/10/11 22:51:16 UTC
[1/4] curator git commit: continue watching the node until it is
deleted or the recipe is stopped
Repository: curator
Updated Branches:
refs/heads/CURATOR-3.0 2fa711c50 -> 9a9e18e24
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-3.0
Commit: cdb3a8035a551e3fb23e972a19cbeae47b14c27f
Parents: 970bd39
Author: Njal Karevoll <nj...@karevoll.no>
Authored: Wed Sep 2 20:03:28 2015 +0200
Committer: Njal Karevoll <nj...@karevoll.no>
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);
+ }
}
}
[3/4] curator git commit: reformatting - also use CuratorWatcher
Posted by ra...@apache.org.
reformatting - also use CuratorWatcher
Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/8b08778b
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/8b08778b
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/8b08778b
Branch: refs/heads/CURATOR-3.0
Commit: 8b08778bc6c6b25145188e8df72a01ffa2f9924c
Parents: 02a03f9
Author: randgalt <ra...@apache.org>
Authored: Sun Oct 11 15:50:40 2015 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sun Oct 11 15:50:40 2015 -0500
----------------------------------------------------------------------
.../recipes/nodes/PersistentEphemeralNode.java | 97 +++++++++-----------
1 file changed, 41 insertions(+), 56 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/curator/blob/8b08778b/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 4868c7a..a3298ab 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
@@ -21,22 +21,21 @@ package org.apache.curator.framework.recipes.nodes;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CreateModable;
import org.apache.curator.framework.api.CuratorEvent;
+import org.apache.curator.framework.api.CuratorWatcher;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
+import org.apache.curator.utils.PathUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import java.io.Closeable;
import java.io.IOException;
import java.util.Arrays;
@@ -45,8 +44,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
-import org.apache.curator.utils.PathUtils;
-
/**
* <p>
* A persistent ephemeral node is an ephemeral node that attempts to stay present in
@@ -69,22 +66,18 @@ public class PersistentEphemeralNode implements Closeable
private final AtomicReference<State> state = new AtomicReference<State>(State.LATENT);
private final AtomicBoolean authFailure = new AtomicBoolean(false);
private final BackgroundCallback backgroundCallback;
- private final Watcher watcher = new Watcher()
+ private final CuratorWatcher watcher = new CuratorWatcher()
{
@Override
- public void process(WatchedEvent event)
+ public void process(WatchedEvent event) throws Exception
{
- if ( event.getType() == EventType.NodeDeleted)
+ if ( event.getType() == EventType.NodeDeleted )
{
createNode();
}
- else if ( event.getType() == EventType.NodeDataChanged)
+ else if ( event.getType() == EventType.NodeDataChanged )
{
- try {
- watchNode();
- } catch (Exception e) {
- log.error(String.format("Unexpected error during watching of path: %s", basePath), e);
- }
+ watchNode();
}
}
};
@@ -99,21 +92,23 @@ public class PersistentEphemeralNode implements Closeable
}
}
};
- private final BackgroundCallback setDataCallback = new BackgroundCallback() {
-
- @Override
- public void processResult(CuratorFramework client, CuratorEvent event)
- throws Exception {
- //If the result is ok then initialisation is complete (if we're still initialising)
- //Don't retry on other errors as the only recoverable cases will be connection loss
- //and the node not existing, both of which are already handled by other watches.
- if ( event.getResultCode() == KeeperException.Code.OK.intValue() )
- {
- //Update is ok, mark initialisation as complete if required.
- initialisationComplete();
- }
- }
- };
+ private final BackgroundCallback setDataCallback = new BackgroundCallback()
+ {
+
+ @Override
+ public void processResult(CuratorFramework client, CuratorEvent event)
+ throws Exception
+ {
+ //If the result is ok then initialisation is complete (if we're still initialising)
+ //Don't retry on other errors as the only recoverable cases will be connection loss
+ //and the node not existing, both of which are already handled by other watches.
+ if ( event.getResultCode() == KeeperException.Code.OK.intValue() )
+ {
+ //Update is ok, mark initialisation as complete if required.
+ initialisationComplete();
+ }
+ }
+ };
private final ConnectionStateListener connectionStateListener = new ConnectionStateListener()
{
@Override
@@ -219,7 +214,7 @@ public class PersistentEphemeralNode implements Closeable
* @param client client instance
* @param mode creation/protection mode
* @param basePath the base path for the node
- * @param data data for the node
+ * @param initData data for the node
*/
public PersistentEphemeralNode(CuratorFramework client, Mode mode, String basePath, byte[] initData)
{
@@ -236,9 +231,9 @@ public class PersistentEphemeralNode implements Closeable
String path = null;
boolean nodeExists = false;
if ( event.getResultCode() == KeeperException.Code.NODEEXISTS.intValue() )
- {
- path = event.getPath();
- nodeExists = true;
+ {
+ path = event.getPath();
+ nodeExists = true;
}
else if ( event.getResultCode() == KeeperException.Code.OK.intValue() )
{
@@ -246,23 +241,23 @@ public class PersistentEphemeralNode implements Closeable
}
else if ( event.getResultCode() == KeeperException.Code.NOAUTH.intValue() )
{
- log.warn("Client does not have authorisation to write ephemeral node at path {}", path);
- authFailure.set(true);
- return;
+ log.warn("Client does not have authorisation to write ephemeral node at path {}", event.getPath());
+ authFailure.set(true);
+ return;
}
if ( path != null )
{
- authFailure.set(false);
+ authFailure.set(false);
nodePath.set(path);
watchNode();
- if(nodeExists)
+ if ( nodeExists )
{
- client.setData().inBackground(setDataCallback).forPath(getActualPath(), getData());
+ client.setData().inBackground(setDataCallback).forPath(getActualPath(), getData());
}
else
{
- initialisationComplete();
+ initialisationComplete();
}
}
else
@@ -275,7 +270,7 @@ public class PersistentEphemeralNode implements Closeable
createMethod = mode.isProtected() ? client.create().creatingParentContainersIfNeeded().withProtection() : client.create().creatingParentContainersIfNeeded();
this.data.set(Arrays.copyOf(data, data.length));
}
-
+
private void initialisationComplete()
{
CountDownLatch localLatch = initialCreateLatch.getAndSet(null);
@@ -360,7 +355,8 @@ public class PersistentEphemeralNode implements Closeable
}
}
- private byte[] getData() {
+ private byte[] getData()
+ {
return this.data.get();
}
@@ -377,10 +373,6 @@ public class PersistentEphemeralNode implements Closeable
{
// ignore
}
- catch ( Exception e )
- {
- throw e;
- }
}
}
@@ -413,14 +405,7 @@ public class PersistentEphemeralNode implements Closeable
String localNodePath = nodePath.get();
if ( localNodePath != null )
{
- try
- {
- client.checkExists().usingWatcher(watcher).inBackground(checkExistsCallback).forPath(localNodePath);
- }
- catch ( Exception e )
- {
- throw e;
- }
+ client.checkExists().usingWatcher(watcher).inBackground(checkExistsCallback).forPath(localNodePath);
}
}
@@ -428,10 +413,10 @@ public class PersistentEphemeralNode implements Closeable
{
return (state.get() == State.STARTED);
}
-
+
@VisibleForTesting
boolean isAuthFailure()
{
- return authFailure.get();
+ return authFailure.get();
}
}
[2/4] curator git commit: Merge branch 'CURATOR-258' of
github.com:nkvoll/curator into CURATOR-258
Posted by ra...@apache.org.
Merge branch 'CURATOR-258' of github.com:nkvoll/curator into CURATOR-258
Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/02a03f94
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/02a03f94
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/02a03f94
Branch: refs/heads/CURATOR-3.0
Commit: 02a03f943cc1a68ac6b1450b0381fcfd86c7b392
Parents: f4f2208 cdb3a80
Author: randgalt <ra...@apache.org>
Authored: Sun Oct 11 15:46:13 2015 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sun Oct 11 15:46:13 2015 -0500
----------------------------------------------------------------------
.../recipes/nodes/PersistentEphemeralNode.java | 18 +++--
.../nodes/TestPersistentEphemeralNode.java | 82 ++++++++++++++++++++
2 files changed, 95 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
[4/4] curator git commit: Merge branch 'master' into CURATOR-3.0
Posted by ra...@apache.org.
Merge branch 'master' into CURATOR-3.0
Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/9a9e18e2
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/9a9e18e2
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/9a9e18e2
Branch: refs/heads/CURATOR-3.0
Commit: 9a9e18e24f9ef7067c455c3a1b950544b0f88a26
Parents: 2fa711c 8b08778
Author: randgalt <ra...@apache.org>
Authored: Sun Oct 11 15:51:09 2015 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sun Oct 11 15:51:09 2015 -0500
----------------------------------------------------------------------
.../recipes/nodes/PersistentEphemeralNode.java | 101 +++++++++----------
.../nodes/TestPersistentEphemeralNode.java | 82 +++++++++++++++
2 files changed, 129 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/curator/blob/9a9e18e2/curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java
----------------------------------------------------------------------
diff --cc curator-recipes/src/main/java/org/apache/curator/framework/recipes/nodes/PersistentEphemeralNode.java
index 1606c36,a3298ab..fe42738
--- 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
@@@ -21,9 -21,7 +21,8 @@@ package org.apache.curator.framework.re
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
-
import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.WatcherRemoveCuratorFramework;
import org.apache.curator.framework.api.ACLBackgroundPathAndBytesable;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CreateModable;
http://git-wip-us.apache.org/repos/asf/curator/blob/9a9e18e2/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
----------------------------------------------------------------------
diff --cc curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
index 20cc028,84eaa52..7ee768b
--- 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
@@@ -733,9 -794,14 +810,14 @@@ public class TestPersistentEphemeralNod
return new Trigger(Event.EventType.NodeCreated);
}
- private static Trigger deleted()
+ private static Trigger deletedOrSetData()
{
- return new Trigger(Event.EventType.NodeDeleted);
+ return new Trigger(Event.EventType.NodeDeleted, EventType.NodeDataChanged);
}
+
+ private static Trigger dataChanged()
+ {
+ return new Trigger(EventType.NodeDataChanged);
+ }
}
}