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/03/13 14:44:18 UTC
svn commit: r1455938 -
/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoDbTest.java
Author: thomasm
Date: Wed Mar 13 13:44:17 2013
New Revision: 1455938
URL: http://svn.apache.org/r1455938
Log:
OAK-619 Lock-free MongoMK implementation (MongoDB test case to support efficient diff if there are many child nodes)
Added:
jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoDbTest.java
Added: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoDbTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoDbTest.java?rev=1455938&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoDbTest.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoDbTest.java Wed Mar 13 13:44:17 2013
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.prototype;
+
+import org.apache.jackrabbit.mongomk.prototype.DocumentStore.Collection;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.QueryBuilder;
+import com.mongodb.WriteConcern;
+
+/**
+ * Test directly ran against MongoDB.
+ */
+public class MongoDbTest {
+
+ @Test
+ @Ignore
+ public void manyChildNodes() {
+ DB db = MongoUtils.getConnection().getDB();
+ MongoUtils.dropCollections(db);
+ DBCollection nodes = db.getCollection(Collection.NODES.toString());
+ DBObject index = new BasicDBObject();
+ // modification time (descending)
+ index.put("_mod", -1L);
+ // and then id (ascending)
+ index.put("_id", 1L);
+ DBObject options = new BasicDBObject();
+ // options.put("unique", Boolean.TRUE);
+ nodes.ensureIndex(index, options);
+
+ // index on (_id, _mod):
+ // Query plan: { "cursor" : "BtreeCursor _id_1__mod_-1" ,
+ // "isMultiKey" : false , "n" : 2000 , "nscannedObjects" : 2000 ,
+ // "nscanned" : 954647 , "nscannedObjectsAllPlans" : 1907080 ,
+ // "nscannedAllPlans" : 2859727 , "scanAndOrder" : false ,
+ // "indexOnly" : true , "nYields" : 5 , "nChunkSkips" : 0 ,
+ // "millis" : 5112 ,...
+ // Time: 2229 ms
+ // Count: 2000
+
+ // index on (_mod, _id)
+ // Query plan: { "cursor" : "BtreeCursor _mod_-1__id_1" ,
+ // "isMultiKey" : false , "n" : 2000 , "nscannedObjects" : 2000 ,
+ // "nscanned" : 2000 , "nscannedObjectsAllPlans" : 2203 ,
+ // "nscannedAllPlans" : 2203 , "scanAndOrder" : false ,
+ // "indexOnly" : true , "nYields" : 0 , "nChunkSkips" : 0 ,
+ // "millis" : 3 ,...
+ // Time: 43 ms
+ // Count: 2000
+
+ int children = 1000000;
+ int perInsert = 1000;
+ int group = 0;
+ String parent = "/parent/node/abc";
+ for (int i = 0; i < children;) {
+ DBObject[] inserts = new DBObject[perInsert];
+ group++;
+ for (int j = 0; j < perInsert; j++, i++) {
+ BasicDBObject doc = new BasicDBObject();
+ inserts[j] = doc;
+ doc.put("_id", parent + "/node" + i);
+ doc.put("_mod", group);
+ }
+ nodes.insert(inserts, WriteConcern.SAFE);
+ log("inserted " + i + "/" + children);
+ }
+ QueryBuilder queryBuilder = QueryBuilder.start("_mod");
+ queryBuilder.greaterThanEquals(group - 1);
+ queryBuilder.and("_id").greaterThan(parent + "/");
+ queryBuilder.and("_id").lessThanEquals(parent + "0");
+ DBObject query = queryBuilder.get();
+ BasicDBObject keys = new BasicDBObject();
+ keys.put("_id", 1);
+ DBCursor cursor = nodes.find(query, keys);
+ int count = 0;
+ log("Query plan: " + cursor.explain());
+ long time = System.currentTimeMillis();
+ while (cursor.hasNext()) {
+ DBObject obj = cursor.next();
+ // dummy read operation (to ensure we did get the data)
+ obj.get("_id");
+ count++;
+ // log(" read " + obj);
+ }
+ time = System.currentTimeMillis() - time;
+ log("Time: " + time + " ms");
+ log("Count: " + count);
+ db.getMongo().close();
+ }
+
+ private static void log(String msg) {
+ System.out.println(msg);
+ }
+
+}