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 mr...@apache.org on 2013/04/25 13:32:39 UTC

svn commit: r1475711 - /jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoDocumentStore.java

Author: mreutegg
Date: Thu Apr 25 11:32:39 2013
New Revision: 1475711

URL: http://svn.apache.org/r1475711
Log:
OAK-619 Lock-free MongoMK implementation
- MongoDocumentStore.findAndUpdate() must not perform an upsert, otherwise it may happen that a unique key constraint is violated.

Modified:
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoDocumentStore.java

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoDocumentStore.java?rev=1475711&r1=1475710&r2=1475711&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoDocumentStore.java Thu Apr 25 11:32:39 2013
@@ -208,9 +208,10 @@ public class MongoDocumentStore implemen
     }
 
     @CheckForNull
-    private Map<String, Object> internalCreateOrUpdate(Collection collection,
-                                                       UpdateOp updateOp,
-                                                       boolean checkConditions) {
+    private Map<String, Object> findAndModifiy(Collection collection,
+                                               UpdateOp updateOp,
+                                               boolean upsert,
+                                               boolean checkConditions) {
         DBCollection dbCollection = getDBCollection(collection);
         QueryBuilder query = getByKeyQuery(updateOp.key);
 
@@ -277,7 +278,7 @@ public class MongoDocumentStore implemen
         try {
             DBObject oldNode = dbCollection.findAndModify(query.get(), null /*fields*/,
                     null /*sort*/, false /*remove*/, update, false /*returnNew*/,
-                    true /*upsert*/);
+                    upsert /*upsert*/);
             if (checkConditions && oldNode == null) {
                 return null;
             }
@@ -306,7 +307,7 @@ public class MongoDocumentStore implemen
                                               UpdateOp update)
             throws MicroKernelException {
         log("createOrUpdate", update);
-        Map<String, Object> map = internalCreateOrUpdate(collection, update, false);
+        Map<String, Object> map = findAndModifiy(collection, update, true, false);
         log("createOrUpdate returns ", map);
         return map;
     }
@@ -316,7 +317,7 @@ public class MongoDocumentStore implemen
                                              UpdateOp update)
             throws MicroKernelException {
         log("findAndUpdate", update);
-        Map<String, Object> map = internalCreateOrUpdate(collection, update, true);
+        Map<String, Object> map = findAndModifiy(collection, update, false, true);
         log("findAndUpdate returns ", map);
         return map;
     }