Repository: curator Updated Branches: refs/heads/CURATOR-397 b58d1ccba -> 3d593105d
more work on new caching apis Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/3d593105 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/3d593105 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/3d593105 Branch: refs/heads/CURATOR-397 Commit: 3d593105d852ece596f7a55f312528ed23ccb69f Parents: b58d1cc Author: randgalt <[email protected]> Authored: Sun Apr 30 19:09:28 2017 -0500 Committer: randgalt <[email protected]> Committed: Sun Apr 30 19:09:28 2017 -0500 ---------------------------------------------------------------------- .../async/modeled/ModeledCuratorFramework.java | 10 +++--- .../apache/curator/x/async/modeled/ZPath.java | 28 +++++++++++++++++ .../CachedModeledCuratorFrameworkImpl.java | 26 +++++++++++++++ .../x/async/modeled/details/ZPathImpl.java | 33 +++++++++++++++++--- .../recipes/ModeledPathChildrenCacheImpl.java | 14 +++++++++ .../details/recipes/ModeledTreeCacheImpl.java | 3 +- .../x/async/modeled/recipes/ModeledCache.java | 16 ++++++++++ .../async/modeled/recipes/ModeledTreeCache.java | 9 ------ 8 files changed, 118 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java index 2a214b7..ac4fd8d 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ModeledCuratorFramework.java @@ -55,9 +55,7 @@ public interface ModeledCuratorFramework<T> /** * Use the given cache as a front for this modeled instance. All read APIs check the cache - * first and, if available, return the values from the cache. Note: you must call - * {@link org.apache.curator.x.async.modeled.CachedModeledCuratorFramework#start()} and - * {@link CachedModeledCuratorFramework#close()} to start/stop + * first and, if available, return the values from the cache. * the cache * * @param cache cache to use @@ -66,8 +64,10 @@ public interface ModeledCuratorFramework<T> CachedModeledCuratorFramework<T> cached(ModeledCache<T> cache); /** - * Use the an internally created cache as a front for this modeled instance. All read APIs check the cache - * first and, if available, return the values from the cache + * Use an internally created cache as a front for this modeled instance. All read APIs check the cache + * first and, if available, return the values from the cache. Note: you must call + * {@link org.apache.curator.x.async.modeled.CachedModeledCuratorFramework#start()} and + * {@link CachedModeledCuratorFramework#close()} to start/stop * * @return wrapped instance */ http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java index f68679d..78cd40f 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/ZPath.java @@ -77,6 +77,34 @@ public interface ZPath } /** + * Convert individual path names into a ZPath starting at the given base. E.g. + * if base is "/home/base" <code>ZPath.from(base, "my", "full", "path")</code> + * would be "/home/base/my/full/path" + * + * @param base base/starting path + * @param names path names + * @return ZPath + * @throws IllegalArgumentException if any of the names is invalid + */ + static ZPath from(ZPath base, String... names) + { + return ZPathImpl.from(base, names); + } + + /** + * Convert individual path names into a ZPath starting at the given base + * + * @param base base/starting path + * @param names path names + * @return ZPath + * @throws IllegalArgumentException if any of the names is invalid + */ + static ZPath from(ZPath base, List<String> names) + { + return ZPathImpl.from(base, names); + } + + /** * Return the special node name that can be used for replacements at runtime * via {@link #resolved(Object...)} * http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledCuratorFrameworkImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledCuratorFrameworkImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledCuratorFrameworkImpl.java index 47ad72d..6192f3a 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledCuratorFrameworkImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/CachedModeledCuratorFrameworkImpl.java @@ -19,6 +19,7 @@ package org.apache.curator.x.async.modeled.details; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Lists; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.api.transaction.CuratorOp; import org.apache.curator.framework.api.transaction.CuratorTransactionResult; @@ -31,6 +32,7 @@ import org.apache.curator.x.async.modeled.recipes.ModeledCache; import org.apache.curator.x.async.modeled.recipes.ModeledCachedNode; import org.apache.zookeeper.data.Stat; import org.apache.zookeeper.server.DataTree; +import java.util.AbstractMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -186,12 +188,36 @@ class CachedModeledCuratorFrameworkImpl<T> implements CachedModeledCuratorFramew @Override public AsyncStage<List<ZPath>> getChildren() { + Map<ZPath, ModeledCachedNode<T>> currentChildren = cache.getCurrentChildren(path); + if ( currentChildren != cache.noChildrenValue() ) + { + if ( debugCachedReadCount != null ) + { + debugCachedReadCount.incrementAndGet(); + } + return new ModelStage<>(Lists.newArrayList(currentChildren.keySet())); + } return client.getChildren(); } @Override public AsyncStage<Map<ZPath, AsyncStage<T>>> readChildren() { + Map<ZPath, ModeledCachedNode<T>> currentChildren = cache.getCurrentChildren(path); + if ( currentChildren != cache.noChildrenValue() ) + { + if ( debugCachedReadCount != null ) + { + debugCachedReadCount.incrementAndGet(); + } + Map<ZPath, AsyncStage<T>> children = currentChildren.entrySet() + .stream() + .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue().getModel())) + .filter(e -> e.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, e -> new ModelStage<>(e.getValue()))); + return new ModelStage<>(children); + } + ModelStage<Map<ZPath, AsyncStage<T>>> modelStage = new ModelStage<>(); client.getChildren().whenComplete((children, e) -> { if ( e != null ) http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java index 3880649..8072785 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/ZPathImpl.java @@ -56,17 +56,40 @@ public class ZPathImpl implements ZPath public static ZPath from(String[] names) { - return from(Arrays.asList(names)); + return from(null, Arrays.asList(names)); } public static ZPath from(List<String> names) { + return from(null, names); + } + + public static ZPath from(ZPath base, String[] names) + { + return from(base, Arrays.asList(names)); + } + + public static ZPath from(ZPath base, List<String> names) + { names = Objects.requireNonNull(names, "names cannot be null"); names.forEach(ZPathImpl::validate); - List<String> nodes = ImmutableList.<String>builder() - .add(ZKPaths.PATH_SEPARATOR) - .addAll(names) - .build(); + ImmutableList.Builder<String> builder = ImmutableList.<String>builder(); + if ( base != null ) + { + if ( base instanceof ZPathImpl ) + { + builder.addAll(((ZPathImpl)base).nodes); + } + else + { + builder.addAll(Splitter.on(ZKPaths.PATH_SEPARATOR).omitEmptyStrings().splitToList(base.fullPath())); + } + } + else + { + builder.add(ZKPaths.PATH_SEPARATOR); + } + List<String> nodes = builder.addAll(names).build(); return new ZPathImpl(nodes, null, null); } http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java index a82737e..ed86404 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledPathChildrenCacheImpl.java @@ -19,6 +19,7 @@ package org.apache.curator.x.async.modeled.details.recipes; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Maps; import com.google.common.util.concurrent.MoreExecutors; import org.apache.curator.framework.listen.Listenable; import org.apache.curator.framework.recipes.cache.ChildData; @@ -169,6 +170,19 @@ public class ModeledPathChildrenCacheImpl<T> implements ModeledPathChildrenCache } @Override + public Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath) + { + ChildData currentData = cache.getCurrentData(fullPath.fullPath()); + if ( currentData == null ) + { + return noChildrenValue(); + } + Map<ZPath, ModeledCachedNode<T>> map = Maps.newHashMap(); + map.put(fullPath, from(serializer, currentData)); + return map; + } + + @Override public Optional<ModeledCachedNode<T>> getCurrentData(ZPath fullPath) { return Optional.ofNullable(from(serializer, cache.getCurrentData(fullPath.fullPath()))); http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java index bf8899b..7f0aecc 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/details/recipes/ModeledTreeCacheImpl.java @@ -34,7 +34,6 @@ import org.apache.curator.x.async.modeled.recipes.ModeledCacheListener; import org.apache.curator.x.async.modeled.recipes.ModeledCachedNode; import org.apache.curator.x.async.modeled.recipes.ModeledTreeCache; import java.util.AbstractMap; -import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -136,7 +135,7 @@ public class ModeledTreeCacheImpl<T> implements ModeledTreeCache<T> Map<String, ChildData> currentChildren = cache.getCurrentChildren(fullPath.fullPath()); if ( currentChildren == null ) { - return Collections.emptyMap(); + return noChildrenValue(); } return currentChildren.entrySet().stream() .map(entry -> new AbstractMap.SimpleEntry<>(ZPath.parse(entry.getKey()), from(serializer, entry.getValue()))) http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCache.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCache.java index 270adaf..b810512 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCache.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledCache.java @@ -19,10 +19,17 @@ package org.apache.curator.x.async.modeled.recipes; import org.apache.curator.x.async.modeled.ZPath; +import java.util.Collections; +import java.util.Map; import java.util.Optional; public interface ModeledCache<T> { + default Map<ZPath, ModeledCachedNode<T>> noChildrenValue() + { + return Collections.emptyMap(); + } + /** * Return the modeled current data for the given path. There are no guarantees of accuracy. This is * merely the most recent view of the data. If there is no node at the given path, @@ -32,4 +39,13 @@ public interface ModeledCache<T> * @return data if the node is alive, or null */ Optional<ModeledCachedNode<T>> getCurrentData(ZPath fullPath); + + /** + * Return the modeled current set of children at the given path, mapped by child name. There are no + * guarantees of accuracy; this is merely the most recent view of the data. + * + * @param fullPath full path to the node to check + * @return a possibly-empty list of children if the node is alive, or null + */ + Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath); } http://git-wip-us.apache.org/repos/asf/curator/blob/3d593105/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java index a481a0d..07eb191 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledTreeCache.java @@ -67,13 +67,4 @@ public interface ModeledTreeCache<T> extends ModeledCache<T>, Closeable * @return listener container */ Listenable<ModeledCacheListener<T>> getListenable(); - - /** - * Return the modeled current set of children at the given path, mapped by child name. There are no - * guarantees of accuracy; this is merely the most recent view of the data. - * - * @param fullPath full path to the node to check - * @return a possibly-empty list of children if the node is alive, or null - */ - Map<ZPath, ModeledCachedNode<T>> getCurrentChildren(ZPath fullPath); }
