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 th...@apache.org on 2013/02/27 16:30:13 UTC

svn commit: r1450808 - in /jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype: Commit.java MongoMK.java

Author: thomasm
Date: Wed Feb 27 15:30:12 2013
New Revision: 1450808

URL: http://svn.apache.org/r1450808
Log:
OAK-619 Lock-free MongoMK implementation (support multiple MongoMK connecting to the same MongoDB)

Modified:
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java?rev=1450808&r1=1450807&r2=1450808&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java Wed Feb 27 15:30:12 2013
@@ -33,8 +33,18 @@ import org.apache.jackrabbit.oak.commons
  */
 public class Commit {
     
-    // TODO too small
-    private static final int MAX_MAP_SIZE = 16 * 1024;
+    /**
+     * The maximum size of a document. If it is larger, it is split.
+     */
+    // TODO check which value is the best one
+    private static final int MAX_DOCUMENT_SIZE = 16 * 1024;
+    
+    /**
+     * Whether to purge old revisions if a node gets too large. If false, old
+     * revisions are stored in a separate document. If true, old revisions are
+     * removed (purged).
+     */
+    private static final boolean PURGE_OLD_REVISIONS = true;
     
     private final MongoMK mk;
     private final Revision revision;
@@ -133,34 +143,45 @@ public class Commit {
             newNodes.add(root);
             root = null;
         }
-        if (newNodes.size() > 0) {
-            store.create(Collection.NODES, newNodes);
-        }
-        for (UpdateOp op : changedNodes) {
-            createOrUpdateNode(store, op);
-        }
-        if (root != null) {
-            long increment = mk.getWriteCountIncrement(commitRoot);
-            root.increment(UpdateOp.WRITE_COUNT, 1 + increment);
-            root.addMapEntry(UpdateOp.REVISIONS + "." + revision.toString(), "true");
-            createOrUpdateNode(store, root);
-            operations.put(commitRoot, root);
+        try {
+            if (newNodes.size() > 0) {
+                store.create(Collection.NODES, newNodes);
+            }
+            for (UpdateOp op : changedNodes) {
+                createOrUpdateNode(store, op);
+            }
+            if (root != null) {
+                long increment = mk.getWriteCountIncrement(commitRoot);
+                root.increment(UpdateOp.WRITE_COUNT, 1 + increment);
+                root.addMapEntry(UpdateOp.REVISIONS + "." + revision.toString(), "true");
+                createOrUpdateNode(store, root);
+                operations.put(commitRoot, root);
+            }
+        } catch (MicroKernelException e) {
+            throw new MicroKernelException("Exception committing " + diff.toString(), e);
         }
     }
     
     private void createOrUpdateNode(DocumentStore store, UpdateOp op) {
         Map<String, Object> map = store.createOrUpdate(Collection.NODES, op);
         int size = Utils.getMapSize(map);
-        if (size > MAX_MAP_SIZE) {
+        if (size > MAX_DOCUMENT_SIZE) {
             UpdateOp[] split = splitDocument(map);
             
             // TODO check if the new main document is actually smaller;
             // otherwise, splitting doesn't make sense
             
             // the old version
-            store.createOrUpdate(Collection.NODES, split[0]);
+            UpdateOp old = split[0];
+            if (old != null) {
+                store.createOrUpdate(Collection.NODES, old);
+            }
+            
             // the (shrunken) main document
-            store.createOrUpdate(Collection.NODES, split[1]);
+            UpdateOp main = split[1];
+            if (main != null) {
+                store.createOrUpdate(Collection.NODES, main);
+            }
         }
         // TODO detect conflicts here
         Long count = (Long) map.get(UpdateOp.WRITE_COUNT);
@@ -218,6 +239,9 @@ public class Commit {
                 }
             }
         }
+        if (PURGE_OLD_REVISIONS) {
+            old = null;
+        }
         return new UpdateOp[]{old, main};
     }
 

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java?rev=1450808&r1=1450807&r2=1450808&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java Wed Feb 27 15:30:12 2013
@@ -208,7 +208,7 @@ public class MongoMK implements MicroKer
             return requestRevision.compareRevisionTime(x) >= 0;
         }
         // TODO currently we only compare the timestamps
-        return x.compareRevisionTime(requestRevision) >= 0;
+        return requestRevision.compareRevisionTime(x) >= 0;
     }
     
     boolean isRevisionNewer(Revision x, Revision previous) {
@@ -526,7 +526,7 @@ public class MongoMK implements MicroKer
     }
     
     private static String stripBranchRevMarker(String revisionId){
-        if(revisionId.startsWith("b")){
+        if (revisionId.startsWith("b")) {
             return revisionId.substring(1);
         }
         return revisionId;