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