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


Reply via email to