You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2017/01/28 10:43:56 UTC

svn commit: r1780657 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/multiplex/ test/java/org/apache/jackrabbit/oak/plugins/multiplex/

Author: tomekr
Date: Sat Jan 28 10:43:55 2017
New Revision: 1780657

URL: http://svn.apache.org/viewvc?rev=1780657&view=rev
Log:
OAK-5222: Optimize the multiplexing node store

Use native node states/builders if there are no mounts under current path

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeBuilder.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeState.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingCompareTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java?rev=1780657&r1=1780656&r2=1780657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingContext.java Sat Jan 28 10:43:55 2017
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.spi.mount.Mount;
@@ -26,6 +27,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
+import javax.annotation.Nullable;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collection;
@@ -50,6 +52,8 @@ class MultiplexingContext {
 
     private final Map<Mount, MountedNodeStore> nodeStoresByMount;
 
+    private final boolean pathFragmentSupport;
+
     MultiplexingContext(MountInfoProvider mip, NodeStore globalStore, List<MountedNodeStore> nonDefaultStores) {
         this.mip = mip;
         this.globalStore = new MountedNodeStore(mip.getDefaultMount(), globalStore);
@@ -60,6 +64,12 @@ class MultiplexingContext {
                 return input.getMount();
             }
         }));
+        pathFragmentSupport = Iterables.tryFind(nonDefaultStores, new Predicate<MountedNodeStore>() {
+            @Override
+            public boolean apply(MountedNodeStore input) {
+                return input.getMount().isSupportFragment();
+            }
+        }).isPresent();
     }
 
     MountedNodeStore getGlobalStore() {
@@ -97,6 +107,13 @@ class MultiplexingContext {
         });
     }
 
+    boolean shouldBeMultiplexed(String path) {
+        if (pathFragmentSupport) {
+            return true;
+        }
+        return !mip.getMountsPlacedUnder(path).isEmpty();
+    }
+
     private List<MountedNodeStore> getContributingStores(String path, Function<MountedNodeStore, Iterable<String>> childrenProvider) {
         Mount owningMount = mip.getMountByPath(path);
         if (!owningMount.isDefault() && nodeStoresByMount.containsKey(owningMount)) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeBuilder.java?rev=1780657&r1=1780656&r2=1780657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeBuilder.java Sat Jan 28 10:43:55 2017
@@ -275,6 +275,9 @@ class MultiplexingNodeBuilder implements
     @Override
     public NodeBuilder getChildNode(final String name) {
         String childPath = simpleConcat(path, name);
+        if (!ctx.shouldBeMultiplexed(childPath)) {
+            return nodeBuilders.get(ctx.getOwningStore(childPath)).getChildNode(name);
+        }
         Map<MountedNodeStore, NodeBuilder> newNodeBuilders = Maps.transformValues(nodeBuilders, new Function<NodeBuilder, NodeBuilder>() {
             @Override
             public NodeBuilder apply(NodeBuilder input) {
@@ -298,6 +301,9 @@ class MultiplexingNodeBuilder implements
             createAncestors(childStore);
         }
         final NodeBuilder childBuilder = nodeBuilders.get(childStore).setChildNode(name, nodeState);
+        if (!ctx.shouldBeMultiplexed(childPath)) {
+            return childBuilder;
+        }
 
         Map<MountedNodeStore, NodeBuilder> newNodeBuilders = Maps.transformEntries(nodeBuilders, new Maps.EntryTransformer<MountedNodeStore, NodeBuilder, NodeBuilder>() {
             @Override

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeState.java?rev=1780657&r1=1780656&r2=1780657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeState.java Sat Jan 28 10:43:55 2017
@@ -113,6 +113,9 @@ class MultiplexingNodeState extends Abst
     @Override
     public NodeState getChildNode(final String name) {
         String childPath = simpleConcat(path, name);
+        if (!ctx.shouldBeMultiplexed(childPath)) {
+            return nodeStates.get(ctx.getOwningStore(childPath)).getChildNode(name);
+        }
         Map<MountedNodeStore, NodeState> newNodeStates = Maps.transformValues(nodeStates, new Function<NodeState, NodeState>() {
             @Override
             public NodeState apply(NodeState input) {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingCompareTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingCompareTest.java?rev=1780657&r1=1780656&r2=1780657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingCompareTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingCompareTest.java Sat Jan 28 10:43:55 2017
@@ -45,9 +45,14 @@ public class MultiplexingCompareTest {
 
     @Test
     public void reportedNodesAreWrapped() {
-        MountInfoProvider mip = new SimpleMountInfoProvider.Builder().build();
+        SimpleMountInfoProvider.Builder mipBuilder = new SimpleMountInfoProvider.Builder();
+        mipBuilder.readOnlyMount("libs", "/libs");
+        MountInfoProvider mip = mipBuilder.build();
+
         NodeStore globalStore = new MemoryNodeStore();
-        MultiplexingNodeStore multiplexingNodeStore = new MultiplexingNodeStore.Builder(mip, globalStore).build();
+        MultiplexingNodeStore.Builder nsBuilder = new MultiplexingNodeStore.Builder(mip, globalStore);
+        nsBuilder.addMount("libs", new MemoryNodeStore());
+        MultiplexingNodeStore multiplexingNodeStore = nsBuilder.build();
 
         NodeBuilder builder = multiplexingNodeStore.getRoot().builder();
         builder.child("changed");