Repository: curator Updated Branches: refs/heads/CURATOR-477 [created] 2d4aa5778
added support for zkwatches Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/d4a0d954 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/d4a0d954 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/d4a0d954 Branch: refs/heads/CURATOR-477 Commit: d4a0d95488345bfb0983553bfbfbc40643ac031b Parents: 8950151 Author: Rama <[email protected]> Authored: Mon Aug 20 12:16:12 2018 +0530 Committer: Rama <[email protected]> Committed: Mon Aug 20 12:16:12 2018 +0530 ---------------------------------------------------------------------- .../framework/recipes/cache/TreeCache.java | 41 +++++++++++++++++--- .../framework/recipes/cache/TestTreeCache.java | 25 ++++++++++++ 2 files changed, 60 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/d4a0d954/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java index 7f8aad7..7bcc8d1 100644 --- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java +++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java @@ -73,6 +73,7 @@ public class TreeCache implements Closeable { private static final Logger LOG = LoggerFactory.getLogger(TreeCache.class); private final boolean createParentNodes; + private final boolean createZkWatches; private final TreeCacheSelector selector; public static final class Builder @@ -84,6 +85,7 @@ public class TreeCache implements Closeable private ExecutorService executorService = null; private int maxDepth = Integer.MAX_VALUE; private boolean createParentNodes = false; + private boolean createZkWatches = true; private TreeCacheSelector selector = new DefaultTreeCacheSelector(); private Builder(CuratorFramework client, String path) @@ -102,7 +104,7 @@ public class TreeCache implements Closeable { executor = Executors.newSingleThreadExecutor(defaultThreadFactory); } - return new TreeCache(client, path, cacheData, dataIsCompressed, maxDepth, executor, createParentNodes, selector); + return new TreeCache(client, path, cacheData, dataIsCompressed, maxDepth, executor, createParentNodes, createZkWatches, selector); } /** @@ -166,6 +168,18 @@ public class TreeCache implements Closeable } /** + * By default, TreeCache creates {@link org.apache.zookeeper.ZooKeeper} watches for every created path. + * Change this behavior with this method. + * @param createZkWatches true to create watches + * @return this for chaining + */ + public Builder setCreateZkWatches(boolean createZkWatches) + { + this.createZkWatches = createZkWatches; + return this; + } + + /** * By default, {@link DefaultTreeCacheSelector} is used. Change the selector here. * * @param selector new selector @@ -253,7 +267,11 @@ public class TreeCache implements Closeable { if ( treeState.get() == TreeState.STARTED ) { - client.getChildren().usingWatcher(this).inBackground(this).forPath(path); + if (createZkWatches) { + client.getChildren().usingWatcher(this).inBackground(this).forPath(path); + } else { + client.getChildren().inBackground(this).forPath(path); + } } } @@ -263,11 +281,20 @@ public class TreeCache implements Closeable { if ( dataIsCompressed ) { - client.getData().decompressed().usingWatcher(this).inBackground(this).forPath(path); + if (createZkWatches) { + client.getData().decompressed().usingWatcher(this).inBackground(this).forPath(path); + } else { + client.getData().decompressed().inBackground(this).forPath(path); + } } else { - client.getData().usingWatcher(this).inBackground(this).forPath(path); + if (createZkWatches) { + client.getData().usingWatcher(this).inBackground(this).forPath(path); + } else { + client.getData().inBackground(this).forPath(path); + + } } } } @@ -535,7 +562,7 @@ public class TreeCache implements Closeable */ public TreeCache(CuratorFramework client, String path) { - this(client, path, true, false, Integer.MAX_VALUE, Executors.newSingleThreadExecutor(defaultThreadFactory), false, new DefaultTreeCacheSelector()); + this(client, path, true, false, Integer.MAX_VALUE, Executors.newSingleThreadExecutor(defaultThreadFactory), false, true, new DefaultTreeCacheSelector()); } /** @@ -545,9 +572,10 @@ public class TreeCache implements Closeable * @param dataIsCompressed if true, data in the path is compressed * @param executorService Closeable ExecutorService to use for the TreeCache's background thread * @param createParentNodes true to create parent nodes as containers + * @param createZkWatches true to create Zookeeper watches * @param selector the selector to use */ - TreeCache(CuratorFramework client, String path, boolean cacheData, boolean dataIsCompressed, int maxDepth, final ExecutorService executorService, boolean createParentNodes, TreeCacheSelector selector) + TreeCache(CuratorFramework client, String path, boolean cacheData, boolean dataIsCompressed, int maxDepth, final ExecutorService executorService, boolean createParentNodes, boolean createZkWatches, TreeCacheSelector selector) { this.createParentNodes = createParentNodes; this.selector = Preconditions.checkNotNull(selector, "selector cannot be null"); @@ -557,6 +585,7 @@ public class TreeCache implements Closeable this.cacheData = cacheData; this.dataIsCompressed = dataIsCompressed; this.maxDepth = maxDepth; + this.createZkWatches = createZkWatches; this.executorService = Preconditions.checkNotNull(executorService, "executorService cannot be null"); } http://git-wip-us.apache.org/repos/asf/curator/blob/d4a0d954/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java index ebaf43e..ae15314 100644 --- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java +++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java @@ -468,6 +468,31 @@ public class TestTreeCache extends BaseTestTreeCache } @Test + public void testBasicsWithNoZkWatches() throws Exception + { + client.create().forPath("/test"); + client.create().forPath("/test/one", "hey there".getBytes()); + + + cache = buildWithListeners(TreeCache.newBuilder(client, "/test").setCreateZkWatches(false)); + + cache.start(); + assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test"); + assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one"); + + assertEvent(TreeCacheEvent.Type.INITIALIZED); + Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one")); + Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there"); + Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of()); + Assert.assertNull(cache.getCurrentChildren("/test/o")); + Assert.assertNull(cache.getCurrentChildren("/test/onely")); + Assert.assertNull(cache.getCurrentChildren("/t")); + Assert.assertNull(cache.getCurrentChildren("/testing")); + + assertNoMoreEvents(); + } + + @Test public void testBasicsOnTwoCaches() throws Exception { TreeCache cache2 = newTreeCacheWithListeners(client, "/test");
