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/01 15:41:37 UTC
svn commit: r1451604 - in /jackrabbit/oak/trunk/oak-mongomk/src:
main/java/org/apache/jackrabbit/mongomk/prototype/
test/java/org/apache/jackrabbit/mongomk/prototype/
Author: thomasm
Date: Fri Mar 1 14:41:37 2013
New Revision: 1451604
URL: http://svn.apache.org/r1451604
Log:
OAK-619 Lock-free MongoMK implementation (property name escaping, bigger cache)
Modified:
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/main/java/org/apache/jackrabbit/mongomk/prototype/Node.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Utils.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/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java?rev=1451604&r1=1451603&r2=1451604&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 Fri Mar 1 14:41:37 2013
@@ -52,7 +52,7 @@ public class MongoDocumentStore implemen
private long time;
private Cache<String, Map<String, Object>> cache =
- new Cache<String, Map<String, Object>>(1024);
+ new Cache<String, Map<String, Object>>(1024 * 20);
public MongoDocumentStore(DB db) {
nodesCollection = db.getCollection(Collection.NODES.toString());
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=1451604&r1=1451603&r2=1451604&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 Fri Mar 1 14:41:37 2013
@@ -260,8 +260,7 @@ public class MongoMK implements MicroKer
if (key.equals(UpdateOp.WRITE_COUNT)) {
writeCount += (Long) map.get(key);
}
- if (key.startsWith("_")) {
- // TODO property name escaping
+ if (!Utils.isPropertyName(key)) {
continue;
}
Object v = map.get(key);
@@ -269,7 +268,8 @@ public class MongoMK implements MicroKer
Map<String, String> valueMap = (Map<String, String>) v;
if (valueMap != null) {
String value = getLatestValue(valueMap, rev);
- n.setProperty(key, value);
+ String propertyName = Utils.unescapePropertyName(key);
+ n.setProperty(propertyName, value);
}
}
n.setWriteCount(writeCount);
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Node.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Node.java?rev=1451604&r1=1451603&r2=1451604&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Node.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Node.java Fri Mar 1 14:41:37 2013
@@ -49,11 +49,7 @@ public class Node {
}
public void copyTo(Node newNode) {
- for (Map.Entry<String, String> e : properties.entrySet()) {
- if (!filter(e.getKey())) {
- newNode.setProperty(e.getKey(), e.getValue());
- }
- }
+ newNode.properties.putAll(properties);
}
public String toString() {
@@ -74,7 +70,8 @@ public class Node {
UpdateOp op = new UpdateOp(path, id, isNew);
op.set(UpdateOp.ID, id);
for (String p : properties.keySet()) {
- op.addMapEntry(p + "." + rev.toString(), properties.get(p));
+ String key = Utils.escapePropertyName(p);
+ op.addMapEntry(key + "." + rev.toString(), properties.get(p));
}
return op;
}
@@ -96,17 +93,6 @@ public class Node {
json.key(p).encodedValue(properties.get(p));
}
}
-
- /**
- * Determines if the key is system generated
- */
- private static boolean filter(String key) {
- //TODO We need to move node properties to a sub key
- // so that all other top level props can be considered as
- // system generated and handled in a better way,
- // or escape properties that start with a _
- return key.startsWith("_");
- }
/**
* A list of children for a node.
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Utils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Utils.java?rev=1451604&r1=1451603&r2=1451604&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Utils.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Utils.java Fri Mar 1 14:41:37 2013
@@ -61,5 +61,28 @@ public class Utils {
ObjectId objId = new ObjectId();
return objId._machine();
}
+
+ public static String escapePropertyName(String propertyName) {
+ String key = propertyName;
+ if (key.startsWith("$") || key.startsWith("_")) {
+ key = "_" + key;
+ }
+ // '*' in a property name is illegal in JCR I believe
+ // TODO find a better solution
+ key = key.replace('.', '*');
+ return key;
+ }
+
+ public static String unescapePropertyName(String key) {
+ if (key.startsWith("__") || key.startsWith("_$")) {
+ key = key.substring(1);
+ }
+ key = key.replace('*', '.');
+ return key;
+ }
+
+ public static boolean isPropertyName(String key) {
+ return !key.startsWith("_") || key.startsWith("__") || key.startsWith("_$");
+ }
}
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=1451604&r1=1451603&r2=1451604&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 Fri Mar 1 14:41:37 2013
@@ -80,6 +80,16 @@ public class SimpleTest {
}
@Test
+ public void escapePropertyName() {
+ MongoMK mk = createMK();
+ String rev = mk.commit(
+ "/", "+\"test\":{\"name.first\": \"Hello\", \"_id\": \"a\", \"$x\": \"1\"}", null, null);
+ String test = mk.getNodes("/test", rev, 0, 0, Integer.MAX_VALUE, null);
+ assertEquals("{\"$x\":\"1\",\"_id\":\"a\",\"name.first\":\"Hello\",\":childNodeCount\":0}", test);
+ mk.dispose();
+ }
+
+ @Test
public void commit() {
MongoMK mk = createMK();