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/19 09:07:34 UTC
svn commit: r1447617 - in /jackrabbit/oak/trunk/oak-mongomk/src:
main/java/org/apache/jackrabbit/mongomk/prototype/
test/java/org/apache/jackrabbit/mongomk/prototype/
Author: thomasm
Date: Tue Feb 19 08:07:33 2013
New Revision: 1447617
URL: http://svn.apache.org/r1447617
Log:
OAK-619 Lock-free MongoMK implementation (WIP)
Modified:
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java?rev=1447617&r1=1447616&r2=1447617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java Tue Feb 19 08:07:33 2013
@@ -28,7 +28,7 @@ public interface DocumentStore {
Map<String, Object> find(Collection collection, String key);
- List<Map<String, Object>> query(Collection collection, String fromKey, String toKey);
+ List<Map<String, Object>> query(Collection collection, String fromKey, String toKey, int limit);
void remove(Collection collection, String key);
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java?rev=1447617&r1=1447616&r2=1447617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java Tue Feb 19 08:07:33 2013
@@ -66,7 +66,7 @@ public class MemoryDocumentStore impleme
return copy;
}
- public List<Map<String, Object>> query(Collection collection, String fromKey, String toKey) {
+ public List<Map<String, Object>> query(Collection collection, String fromKey, String toKey, int limit) {
ConcurrentSkipListMap<String, Map<String, Object>> map = getMap(collection);
ConcurrentNavigableMap<String, Map<String, Object>> sub = map.subMap(fromKey, toKey);
ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
@@ -76,6 +76,9 @@ public class MemoryDocumentStore impleme
copy.putAll(n);
}
list.add(copy);
+ if (list.size() > limit) {
+ break;
+ }
}
return list;
}
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java?rev=1447617&r1=1447616&r2=1447617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java Tue Feb 19 08:07:33 2013
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.mongomk.prototype;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -27,6 +28,7 @@ import org.slf4j.LoggerFactory;
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;
@@ -47,18 +49,30 @@ public class MongoDocumentStore implemen
@Override
public Map<String, Object> find(Collection collection, String path) {
- DBObject n = getNode(collection, path);
- if (n == null) {
+ DBCollection dbCollection = getDBCollection(collection);
+ DBObject doc = dbCollection.findOne(getByPathQuery(path));
+ if (doc == null) {
return null;
}
- return convertFromDBObject(n);
+ return convertFromDBObject(doc);
}
@Override
public List<Map<String, Object>> query(Collection collection,
- String fromKey, String toKey) {
- // TODO retrieve children
- return null;
+ String fromKey, String toKey, int limit) {
+ DBCollection dbCollection = getDBCollection(collection);
+ QueryBuilder queryBuilder = QueryBuilder.start(KEY_PATH);
+ queryBuilder.greaterThanEquals(fromKey);
+ queryBuilder.lessThan(toKey);
+ DBObject query = queryBuilder.get();
+ DBCursor cursor = dbCollection.find(query);
+ List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+ for (int i=0; i<limit && cursor.hasNext(); i++) {
+ DBObject o = cursor.next();
+ Map<String, Object> map = convertFromDBObject(o);
+ list.add(map);
+ }
+ return list;
}
@Override
@@ -188,11 +202,6 @@ public class MongoDocumentStore implemen
}
}
- private DBObject getNode(Collection collection, String path) {
- DBCollection dbCollection = getDBCollection(collection);
- return dbCollection.findOne(getByPathQuery(path));
- }
-
private static DBObject getByPathQuery(String path) {
return QueryBuilder.start(KEY_PATH).is(path).get();
}
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=1447617&r1=1447616&r2=1447617&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 Tue Feb 19 08:07:33 2013
@@ -131,9 +131,9 @@ public class MongoMK implements MicroKer
backgroundThread = new Thread(new Runnable() {
public void run() {
while (!isDisposed.get()) {
- synchronized (this) {
+ synchronized (isDisposed) {
try {
- wait(ASYNC_DELAY);
+ isDisposed.wait(ASYNC_DELAY);
} catch (InterruptedException e) {
// ignore
}
@@ -165,8 +165,8 @@ public class MongoMK implements MicroKer
public void dispose() {
if (!isDisposed.getAndSet(true)) {
- synchronized (backgroundThread) {
- backgroundThread.notifyAll();
+ synchronized (isDisposed) {
+ isDisposed.notifyAll();
}
try {
backgroundThread.join();
@@ -208,14 +208,19 @@ public class MongoMK implements MicroKer
return x.compareRevisionTime(requestRevision) >= 0;
}
- public Node.Children readChildren(String path, Revision rev) {
- String from = Node.convertPathToDocumentId(path + "/");
- String to = from.substring(0, from.length() - 1) + "0";
- List<Map<String, Object>> list = store.query(DocumentStore.Collection.NODES, from, to);
+ public Node.Children readChildren(String path, Revision rev, int limit) {
+ String from = PathUtils.concat(path, "a");
+ from = Node.convertPathToDocumentId(from);
+ from = from.substring(0, from.length() - 1);
+ String to = PathUtils.concat(path, "z/z");
+ to = Node.convertPathToDocumentId(to);
+ to = to.substring(0, to.length() - 3);
+ List<Map<String, Object>> list = store.query(DocumentStore.Collection.NODES, from, to, limit);
Node.Children c = new Node.Children(path, rev);
for (Map<String, Object> e : list) {
+ // TODO put the whole node in the cache
String id = e.get("_id").toString();
- String p = id.substring(1);
+ String p = id.substring(2);
c.children.add(p);
}
return c;
Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java?rev=1447617&r1=1447616&r2=1447617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/SimpleTest.java Tue Feb 19 08:07:33 2013
@@ -71,10 +71,15 @@ public class SimpleTest {
assertEquals("{\"name\":\"Hello\"}", test);
rev = mk.commit("/test", "+\"a\":{\"name\": \"World\"}", null, null);
+ rev = mk.commit("/test", "+\"b\":{\"name\": \"!\"}", null, null);
test = mk.getNodes("/test", rev, 0, 0, Integer.MAX_VALUE, null);
- Children c = mk.readChildren("/", Revision.fromString(rev));
- assertEquals("/: []", c.toString());
- // assertEquals("{\"name\":\"Hello\",{\"a\":\"name\":\"World\"}}", test);
+ Children c;
+ c = mk.readChildren("/",
+ Revision.fromString(rev), Integer.MAX_VALUE);
+ assertEquals("/: [/test]", c.toString());
+ c = mk.readChildren("/test",
+ Revision.fromString(rev), Integer.MAX_VALUE);
+ assertEquals("/test: [/test/a, /test/b]", c.toString());
// System.out.println(test);
mk.dispose();