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