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 ch...@apache.org on 2014/04/02 08:13:22 UTC

svn commit: r1583890 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document: MissingLastRevSeeker.java mongo/MongoMissingLastRevSeeker.java

Author: chetanm
Date: Wed Apr  2 06:13:22 2014
New Revision: 1583890

URL: http://svn.apache.org/r1583890
Log:
OAK-1295 - Recovery for missing _lastRev updates (WIP)

Added specific method for acquiring recovery lock and releasing recovery lock. For Mongo the acquire logic use a conditional update

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java?rev=1583890&r1=1583889&r2=1583890&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/MissingLastRevSeeker.java Wed Apr  2 06:13:22 2014
@@ -27,6 +27,8 @@ import com.google.common.collect.Iterabl
 
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 
+import static org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo.RecoverLockState;
+
 /**
  * Utils to retrieve _lastRev missing update candidates.
  */
@@ -88,6 +90,21 @@ public class MissingLastRevSeeker {
         });
     }
 
+    public boolean acquireRecoveryLock(int clusterId){
+        //This approach has a race condition where two different cluster nodes
+        //can acquire the lock simultaneously.
+        UpdateOp update = new UpdateOp(Integer.toString(clusterId), true);
+        update.set(ClusterNodeInfo.REV_RECOVERY_LOCK, RecoverLockState.ACQUIRED);
+        store.createOrUpdate(Collection.CLUSTER_NODES, update);
+        return true;
+    }
+
+    public void releaseRecoveryLock(int clusterId){
+        UpdateOp update = new UpdateOp(Integer.toString(clusterId), true);
+        update.set(ClusterNodeInfo.REV_RECOVERY_LOCK, null);
+        store.createOrUpdate(Collection.CLUSTER_NODES, update);
+    }
+
     public NodeDocument getRoot() {
         return store.find(Collection.NODES, Utils.getIdFromPath(ROOT_PATH));
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java?rev=1583890&r1=1583889&r2=1583890&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoMissingLastRevSeeker.java Wed Apr  2 06:13:22 2014
@@ -20,6 +20,7 @@
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
 import static com.google.common.collect.Iterables.transform;
+import static org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo.RecoverLockState;
 
 import com.google.common.base.Function;
 import com.mongodb.BasicDBObject;
@@ -29,9 +30,11 @@ import com.mongodb.DBObject;
 import com.mongodb.QueryBuilder;
 import com.mongodb.ReadPreference;
 
+import org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo;
 import org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfoDocument;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.Commit;
+import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.MissingLastRevSeeker;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
 import org.apache.jackrabbit.oak.plugins.document.util.CloseableIterable;
@@ -94,6 +97,28 @@ public class MongoMissingLastRevSeeker e
         }), cursor);
     }
 
+    @Override
+    public boolean acquireRecoveryLock(int clusterId) {
+        QueryBuilder query = QueryBuilder.start(Document.ID)
+                .is(Integer.toString(clusterId))
+                .put(ClusterNodeInfo.REV_RECOVERY_LOCK).is(RecoverLockState.ACQUIRED.name());
+
+        DBObject returnFields = new BasicDBObject();
+        returnFields.put("_id", 1);
+
+        BasicDBObject setUpdates = new BasicDBObject();
+        setUpdates.append(ClusterNodeInfo.REV_RECOVERY_LOCK, RecoverLockState.ACQUIRED.name());
+
+        BasicDBObject update = new BasicDBObject();
+        update.append("$set", setUpdates);
+
+        DBObject oldNode = getClusterNodeCollection().findAndModify(query.get(), returnFields,
+                null /*sort*/, false /*remove*/, update, false /*returnNew*/,
+                false /*upsert*/);
+
+        return oldNode != null;
+    }
+
     private DBCollection getNodeCollection() {
         return store.getDBCollection(Collection.NODES);
     }