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 2017/05/01 00:09:39 UTC
curator git commit: more work on new caching apis
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 <ra...@apache.org>
Authored: Sun Apr 30 19:09:28 2017 -0500
Committer: randgalt <ra...@apache.org>
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);
}