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/03/31 10:55:48 UTC

svn commit: r1789657 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java

Author: tomekr
Date: Fri Mar 31 10:55:48 2017
New Revision: 1789657

URL: http://svn.apache.org/viewvc?rev=1789657&view=rev
Log:
OAK-5941: Improve the checkpoint release & retrieve for multiplexing node store

Find the checkpoint by its 'name' property. Don't create/release checkpoints
for read-only mounts.

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java?rev=1789657&r1=1789656&r2=1789657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java Fri Mar 31 10:55:48 2017
@@ -18,9 +18,9 @@ package org.apache.jackrabbit.oak.plugin
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -246,6 +246,9 @@ public class MultiplexingNodeStore imple
     public String checkpoint(long lifetime, Map<String, String> properties) {
         Map<String, String> globalProperties = newHashMap(properties);
         for (MountedNodeStore mns : ctx.getNonDefaultStores()) {
+            if (mns.getMount().isReadOnly()) {
+                continue;
+            }
             String checkpoint = mns.getNodeStore().checkpoint(lifetime, properties);
             globalProperties.put(CHECKPOINT_ID_PREFIX + mns.getMount().getName(), checkpoint);
         }
@@ -283,14 +286,11 @@ public class MultiplexingNodeStore imple
         nodeStates.put(ctx.getGlobalStore(), ctx.getGlobalStore().getNodeStore().retrieve(checkpoint));
         for (MountedNodeStore nodeStore : ctx.getNonDefaultStores()) {
             NodeState nodeState = null;
-            if (checkpointExists(nodeStore.getNodeStore(), checkpoint)) {
-                nodeState = nodeStore.getNodeStore().retrieve(checkpoint);
-            }
-            if (nodeState == null) {
-                String partialCheckpoint = props.get(CHECKPOINT_ID_PREFIX + nodeStore.getMount().getName());
-                if (partialCheckpoint != null) {
-                    nodeState = nodeStore.getNodeStore().retrieve(partialCheckpoint);
-                }
+            String partialCheckpoint = getPartialCheckpointName(nodeStore, checkpoint, props);
+            if (partialCheckpoint == null && nodeStore.getMount().isReadOnly()) {
+                nodeState = nodeStore.getNodeStore().getRoot();
+            } else if (partialCheckpoint != null) {
+                nodeState = nodeStore.getNodeStore().retrieve(partialCheckpoint);
             }
             nodeStates.put(nodeStore, nodeState);
         }
@@ -312,21 +312,42 @@ public class MultiplexingNodeStore imple
             result = true;
         }
         for (MountedNodeStore nodeStore : ctx.getNonDefaultStores()) {
-            boolean released = false;
-            if (checkpointExists(nodeStore.getNodeStore(), checkpoint)) {
-                released = nodeStore.getNodeStore().release(checkpoint);
+            if (nodeStore.getMount().isReadOnly()) {
+                continue;
             }
-            if (!released) {
-                String partialCheckpoint = props.get(CHECKPOINT_ID_PREFIX + nodeStore.getMount().getName());
-                if (partialCheckpoint != null) {
-                    released = nodeStore.getNodeStore().release(partialCheckpoint);
-                }
+            boolean released = false;
+            String partialCheckpoint = getPartialCheckpointName(nodeStore, checkpoint, props);
+            if (partialCheckpoint != null) {
+                released = nodeStore.getNodeStore().release(partialCheckpoint);
             }
             result &= released;
         }
         return result;
     }
 
+    private String getPartialCheckpointName(MountedNodeStore nodeStore, String globalCheckpoint, Map<String, String> globalCheckpointProperties) {
+        Set<String> validCheckpointNames = ImmutableSet.copyOf(nodeStore.getNodeStore().checkpoints());
+        String result = globalCheckpointProperties.get(CHECKPOINT_ID_PREFIX + nodeStore.getMount().getName());
+        if (result != null && validCheckpointNames.contains(result)) {
+            return result;
+        }
+        if (globalCheckpoint != null && validCheckpointNames.contains(globalCheckpoint)) {
+            return globalCheckpoint;
+        }
+
+        String nameProp = globalCheckpointProperties.get("name");
+        if (nameProp == null) {
+            return null;
+        }
+        for (String c : validCheckpointNames) {
+            Map<String, String> partialCheckpointProperties = nodeStore.getNodeStore().checkpointInfo(c);
+            if (nameProp.equals(partialCheckpointProperties.get("name"))) {
+                return c;
+            }
+        }
+        return null;
+    }
+
     private static boolean checkpointExists(NodeStore nodeStore, String checkpoint) {
         return Iterables.any(nodeStore.checkpoints(), Predicates.equalTo(checkpoint));
     }