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/30 08:44:55 UTC
svn commit: r1789460 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStore.java
Author: tomekr
Date: Thu Mar 30 08:44:54 2017
New Revision: 1789460
URL: http://svn.apache.org/viewvc?rev=1789460&view=rev
Log:
OAK-6006: MultiplexingNodeStore sometimes fails to release checkpoint
Use NodeStore#checkpoints() to test whether a checkpoint exists.
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=1789460&r1=1789459&r2=1789460&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 Thu Mar 30 08:44:54 2017
@@ -17,6 +17,8 @@
package org.apache.jackrabbit.oak.plugins.multiplex;
import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+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;
@@ -257,6 +259,9 @@ public class MultiplexingNodeStore imple
@Override
public Map<String, String> checkpointInfo(String checkpoint) {
+ if (!checkpointExists(ctx.getGlobalStore().getNodeStore(), checkpoint)) {
+ return Collections.emptyMap();
+ }
return copyOf(filterKeys(ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint), new Predicate<String>() {
@Override
public boolean apply(String input) {
@@ -267,6 +272,9 @@ public class MultiplexingNodeStore imple
@Override
public NodeState retrieve(String checkpoint) {
+ if (!checkpointExists(ctx.getGlobalStore().getNodeStore(), checkpoint)) {
+ return null;
+ }
Map<String, String> props = ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint);
if (props == null) {
return null;
@@ -275,7 +283,7 @@ public class MultiplexingNodeStore imple
nodeStates.put(ctx.getGlobalStore(), ctx.getGlobalStore().getNodeStore().retrieve(checkpoint));
for (MountedNodeStore nodeStore : ctx.getNonDefaultStores()) {
NodeState nodeState = null;
- if (!nodeStore.getNodeStore().checkpointInfo(checkpoint).isEmpty()) {
+ if (checkpointExists(nodeStore.getNodeStore(), checkpoint)) {
nodeState = nodeStore.getNodeStore().retrieve(checkpoint);
}
if (nodeState == null) {
@@ -294,14 +302,18 @@ public class MultiplexingNodeStore imple
@Override
public boolean release(String checkpoint) {
- Map<String, String> props = ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint);
- if (props == null) {
- return false;
+ Map<String, String> props;
+ boolean result;
+ if (checkpointExists(ctx.getGlobalStore().getNodeStore(), checkpoint)) {
+ props = ctx.getGlobalStore().getNodeStore().checkpointInfo(checkpoint);
+ result = ctx.getGlobalStore().getNodeStore().release(checkpoint);
+ } else {
+ props = Collections.emptyMap();
+ result = true;
}
- boolean result = ctx.getGlobalStore().getNodeStore().release(checkpoint);
for (MountedNodeStore nodeStore : ctx.getNonDefaultStores()) {
boolean released = false;
- if (!nodeStore.getNodeStore().checkpointInfo(checkpoint).isEmpty()) {
+ if (checkpointExists(nodeStore.getNodeStore(), checkpoint)) {
released = nodeStore.getNodeStore().release(checkpoint);
}
if (!released) {
@@ -315,6 +327,10 @@ public class MultiplexingNodeStore imple
return result;
}
+ private static boolean checkpointExists(NodeStore nodeStore, String checkpoint) {
+ return Iterables.any(nodeStore.checkpoints(), Predicates.equalTo(checkpoint));
+ }
+
@Override
public Closeable addObserver(final Observer observer) {
observer.contentChanged(getRoot(), CommitInfo.EMPTY_EXTERNAL);