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);
 }