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 me...@apache.org on 2013/02/13 10:00:21 UTC
svn commit: r1445509 -
/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
Author: meteatamel
Date: Wed Feb 13 09:00:20 2013
New Revision: 1445509
URL: http://svn.apache.org/r1445509
Log:
OAK-619 Lock-free MongoMK implementation
Hooked up BlobStore
Modified:
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/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java?rev=1445509&r1=1445508&r2=1445509&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 13 09:00:20 2013
@@ -24,28 +24,34 @@ import javax.annotation.Nonnull;
import org.apache.jackrabbit.mk.api.MicroKernel;
import org.apache.jackrabbit.mk.api.MicroKernelException;
+import org.apache.jackrabbit.mk.blobs.BlobStore;
public class MongoMK implements MicroKernel {
-
+
/**
* The MongoDB store (might be used by multiple MongoMKs).
*/
private final DocumentStore store;
-
+
+ /**
+ * The MongoDB blob store.
+ */
+ private final BlobStore blobStore;
+
/**
* The unique cluster id, similar to the unique machine id in MongoDB.
*/
private final int clusterId;
-
+
/**
* The node cache.
- *
+ *
* Key: path@rev
* Value: node
*/
// TODO: should be path@id
private final Map<String, Node> nodeCache = new Cache<String, Node>(1024);
-
+
/**
* For revisions that are older than this many seconds, the MongoMK will
* assume the revision is valid. For more recent changes, the MongoMK needs
@@ -54,7 +60,7 @@ public class MongoMK implements MicroKer
* collector removes old revisions, this value is changed.
*/
private static final int trustedRevisionAge = Integer.MAX_VALUE;
-
+
/**
* The set of known valid revision.
* The key is the revision id, the value is 1 (because a cache can't be a set).
@@ -63,23 +69,24 @@ public class MongoMK implements MicroKer
/**
* Create a new MongoMK.
- *
+ *
* @param store the store (might be shared)
* @param clusterId the cluster id (must be unique)
*/
- public MongoMK(MemoryDocumentStore store, int clusterId) {
+ public MongoMK(DocumentStore store, BlobStore blobStore, int clusterId) {
this.store = store;
+ this.blobStore = blobStore;
this.clusterId = clusterId;
}
-
+
String getNewRevision() {
return Utils.createRevision(clusterId);
}
-
+
/**
* Get the node for the given path and revision. The returned object might
* not be modified directly.
- *
+ *
* @param path
* @param rev
* @return the node
@@ -95,10 +102,10 @@ public class MongoMK implements MicroKer
}
return node;
}
-
+
/**
* Try to add a node.
- *
+ *
* @param rev the revision
* @param n the node
* @throw IllegalStateException if the node already existed
@@ -110,10 +117,10 @@ public class MongoMK implements MicroKer
node.set("_pathDepth", depth);
int commitDepth = depth - Utils.pathDepth(commitRoot);
node.addMapEntry("_commitDepth", rev, commitDepth);
-
+
// the affected (direct) children of this revision
node.addMapEntry("_affectedChildren", rev, "");
-
+
node.increment("_changeCount", 1L);
// setCommitRoot(path);
@@ -121,26 +128,26 @@ public class MongoMK implements MicroKer
for (String p : n.properties.keySet()) {
node.addMapEntry(p, rev, n.properties.get(p));
}
- Map<String, Object> map = store.createOrUpdate(DocumentStore.Collection.NODES, node);
+ Map<String, Object> map = store.createOrUpdate(DocumentStore.Collection.NODES, node);
if (map != null) {
// TODO rollback changes
throw new IllegalStateException("Node already exists: " + n.path);
}
}
-
+
private Node readNode(String path, String rev) {
- Map<String, Object> map = store.find(DocumentStore.Collection.NODES, path);
+ Map<String, Object> map = store.find(DocumentStore.Collection.NODES, path);
if (map == null) {
return null;
}
Node n = new Node(path, rev);
for(String key : map.keySet()) {
Object v = map.get(key);
-
+
}
return n;
}
-
+
@Override
public String getHeadRevision() throws MicroKernelException {
// TODO Auto-generated method stub
@@ -227,21 +234,30 @@ public class MongoMK implements MicroKer
@Override
public long getLength(String blobId) throws MicroKernelException {
- // TODO Auto-generated method stub
- return 0;
+ try {
+ return blobStore.getBlobLength(blobId);
+ } catch (Exception e) {
+ throw new MicroKernelException(e);
+ }
}
@Override
public int read(String blobId, long pos, byte[] buff, int off, int length)
throws MicroKernelException {
- // TODO Auto-generated method stub
- return 0;
+ try {
+ return blobStore.readBlob(blobId, pos, buff, off, length);
+ } catch (Exception e) {
+ throw new MicroKernelException(e);
+ }
}
@Override
public String write(InputStream in) throws MicroKernelException {
- // TODO Auto-generated method stub
- return null;
+ try {
+ return blobStore.writeBlob(in);
+ } catch (Exception e) {
+ throw new MicroKernelException(e);
+ }
}
static class Cache<K, V> extends LinkedHashMap<K, V> {