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/06/18 11:15:24 UTC

svn commit: r1494076 - in /jackrabbit/oak/trunk/oak-mongomk/src: main/java/org/apache/jackrabbit/mongomk/ main/java/org/apache/jackrabbit/mongomk/util/ test/java/org/apache/jackrabbit/mongomk/

Author: mreutegg
Date: Tue Jun 18 09:15:24 2013
New Revision: 1494076

URL: http://svn.apache.org/r1494076
Log:
OAK-619 Lock-free MongoMK implementation
- Add more DocumentStore tests

Modified:
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MemoryDocumentStore.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/Utils.java
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/MongoDocumentStoreTest.java

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MemoryDocumentStore.java?rev=1494076&r1=1494075&r2=1494076&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MemoryDocumentStore.java Tue Jun 18 09:15:24 2013
@@ -92,7 +92,7 @@ public class MemoryDocumentStore impleme
                 Utils.deepCopyMap(n, copy);
             }
             list.add(copy);
-            if (list.size() > limit) {
+            if (list.size() >= limit) {
                 break;
             }
         }

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java?rev=1494076&r1=1494075&r2=1494076&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java Tue Jun 18 09:15:24 2013
@@ -94,7 +94,7 @@ public class MongoMK implements MicroKer
     /**
      * The threshold where special handling for many child node starts.
      */
-    private static final int MANY_CHILDREN_THRESHOLD = Integer.getInteger(
+    static final int MANY_CHILDREN_THRESHOLD = Integer.getInteger(
             "oak.mongoMK.manyChildren", 50);
 
     /**
@@ -620,8 +620,8 @@ public class MongoMK implements MicroKer
         // TODO use offset, to avoid O(n^2) and running out of memory
         // to do that, use the *name* of the last entry of the previous batch of children
         // as the starting point
-        String from = getPathLowerLimit(path);
-        String to = getPathUpperLimit(path);
+        String from = Utils.getKeyLowerLimit(path);
+        String to = Utils.getKeyUpperLimit(path);
         List<Map<String, Object>> list = store.query(DocumentStore.Collection.NODES, 
                 from, to, limit);
         Children c = new Children(path, rev);
@@ -641,20 +641,6 @@ public class MongoMK implements MicroKer
         }
         return c;
     }
-    
-    private static String getPathLowerLimit(String path) {
-        String from = PathUtils.concat(path, "a");
-        from = Utils.getIdFromPath(from);
-        from = from.substring(0, from.length() - 1);
-        return from;
-    }
-    
-    private static String getPathUpperLimit(String path) {
-        String to = PathUtils.concat(path, "z");
-        to = Utils.getIdFromPath(to);
-        to = to.substring(0, to.length() - 2) + "0";
-        return to;
-    }
 
     private Node readNode(String path, Revision rev) {
         String id = Utils.getIdFromPath(path);
@@ -856,8 +842,8 @@ public class MongoMK implements MicroKer
         long minTimestamp = Math.min(fromRev.getTimestamp(), toRev.getTimestamp());
         Revision rev = isRevisionNewer(fromRev, toRev) ? toRev : fromRev;
         long minValue = Commit.getModified(minTimestamp);
-        String fromKey = getPathLowerLimit(path);
-        String toKey = getPathUpperLimit(path);
+        String fromKey = Utils.getKeyLowerLimit(path);
+        String toKey = Utils.getKeyUpperLimit(path);
         List<Map<String, Object>> list = store.query(DocumentStore.Collection.NODES, fromKey, toKey, 
                 UpdateOp.MODIFIED, minValue, Integer.MAX_VALUE);
         for (Map<String, Object> e : list) {

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/Utils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/Utils.java?rev=1494076&r1=1494075&r2=1494076&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/Utils.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/util/Utils.java Tue Jun 18 09:15:24 2013
@@ -23,6 +23,8 @@ import java.util.Set;
 import java.util.TreeMap;
 
 import com.mongodb.BasicDBObject;
+
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.bson.types.ObjectId;
 
 /**
@@ -202,4 +204,31 @@ public class Utils {
         return document.toString().replaceAll(", _", ",\n_").replaceAll("}, ", "},\n");
     }
 
+    /**
+     * Returns the lower key limit to retrieve the children of the given
+     * <code>path</code>.
+     *
+     * @param path a path.
+     * @return the lower key limit.
+     */
+    public static String getKeyLowerLimit(String path) {
+        String from = PathUtils.concat(path, "a");
+        from = getIdFromPath(from);
+        from = from.substring(0, from.length() - 1);
+        return from;
+    }
+
+    /**
+     * Returns the upper key limit to retrieve the children of the given
+     * <code>path</code>.
+     *
+     * @param path a path.
+     * @return the upper key limit.
+     */
+    public static String getKeyUpperLimit(String path) {
+        String to = PathUtils.concat(path, "z");
+        to = getIdFromPath(to);
+        to = to.substring(0, to.length() - 2) + "0";
+        return to;
+    }
 }

Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/MongoDocumentStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/MongoDocumentStoreTest.java?rev=1494076&r1=1494075&r2=1494076&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/MongoDocumentStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/MongoDocumentStoreTest.java Tue Jun 18 09:15:24 2013
@@ -29,6 +29,9 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.jackrabbit.mongomk.DocumentStore.Collection;
+import org.apache.jackrabbit.mongomk.util.Utils;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -65,9 +68,14 @@ public class MongoDocumentStoreTest {
         }
     }
 
+    @Before
+    @After
+    public void cleanUp() {
+        dropCollections();
+    }
+
     @Test
     public void addGetAndRemove() throws Exception {
-        dropCollections();
         DocumentStore docStore = openDocumentStore();
 
         UpdateOp updateOp = new UpdateOp("/", "/", true);
@@ -90,13 +98,10 @@ public class MongoDocumentStoreTest {
         docStore.remove(Collection.NODES, "/");
         obj = docStore.find(Collection.NODES, "/");
         assertTrue(obj == null);
-        dropCollections();
     }
 
     @Test
     public void batchAdd() throws Exception {
-        dropCollections();
-
         DocumentStore docStore = openDocumentStore();
         int nUpdates = 10;
         List<UpdateOp> updateOps = new ArrayList<UpdateOp>();
@@ -110,13 +115,10 @@ public class MongoDocumentStoreTest {
             updateOps.add(updateOp);
         }
         docStore.create(Collection.NODES, updateOps);
-
-        dropCollections();
     }
 
     @Test
     public void addLotsOfNodes() throws Exception {
-
         char[] nPrefix = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
         int nNodes = NODE_COUNT;
 
@@ -138,14 +140,10 @@ public class MongoDocumentStoreTest {
             log("Done: " + (end - start) + "ms");
 
         }
-        dropCollections();
-
     }
 
     @Test
     public void containsMapEntry() {
-        dropCollections();
-
         DocumentStore docStore = openDocumentStore();
         UpdateOp op = new UpdateOp("/node", "/node", true);
         op.setMapEntry("map", "key", "value");
@@ -178,8 +176,22 @@ public class MongoDocumentStoreTest {
         doc = docStore.find(Collection.NODES, "/node");
         assertTrue(doc.containsKey("prop"));
         assertEquals("value", doc.get("prop"));
+    }
 
-        dropCollections();
+    @Test
+    public void queryWithLimit() throws Exception {
+        DocumentStore docStore = openDocumentStore();
+        Revision rev = Revision.newRevision(0);
+        List<UpdateOp> inserts = new ArrayList<UpdateOp>();
+        for (int i = 0; i < MongoMK.MANY_CHILDREN_THRESHOLD * 2; i++) {
+            Node n = new Node("/node-" + i, rev);
+            inserts.add(n.asOperation(true));
+        }
+        docStore.create(Collection.NODES, inserts);
+        List<Map<String, Object>> docs = docStore.query(Collection.NODES,
+                Utils.getKeyLowerLimit("/"),  Utils.getKeyUpperLimit("/"),
+                MongoMK.MANY_CHILDREN_THRESHOLD);
+        assertEquals(MongoMK.MANY_CHILDREN_THRESHOLD, docs.size());
     }
 
     @Test