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/07 13:28:43 UTC
svn commit: r1453808 - in /jackrabbit/oak/trunk/oak-mongomk/src:
main/java/org/apache/jackrabbit/mongomk/prototype/
test/java/org/apache/jackrabbit/mongomk/prototype/
Author: thomasm
Date: Thu Mar 7 12:28:43 2013
New Revision: 1453808
URL: http://svn.apache.org/r1453808
Log:
OAK-619 Lock-free MongoMK implementation (nodeExists returned true before the node was created; warning for reading very old revisions)
Modified:
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/Revision.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/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java?rev=1453808&r1=1453807&r2=1453808&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 Thu Mar 7 12:28:43 2013
@@ -64,6 +64,8 @@ public class MongoMK implements MicroKer
*/
private static final int CACHE_NODES = Integer.getInteger("oak.mongoMK.cacheNodes", 1024);
+ private static final int WARN_REVISION_AGE = Integer.getInteger("oak.mongoMK.revisionAge", 10000);
+
private static final Logger LOG = LoggerFactory.getLogger(MongoMK.class);
/**
@@ -214,6 +216,7 @@ public class MongoMK implements MicroKer
* @return the node
*/
Node getNode(String path, Revision rev) {
+ checkRevisionAge(rev, path);
String key = path + "@" + rev;
Node node = nodeCache.get(key);
if (node == null) {
@@ -225,6 +228,16 @@ public class MongoMK implements MicroKer
return node;
}
+ private void checkRevisionAge(Revision r, String path) {
+ if (headRevision.getTimestamp() - r.getTimestamp() > WARN_REVISION_AGE) {
+ LOG.warn("Requesting an old revision for path " + path + ", " +
+ ((headRevision.getTimestamp() - r.getTimestamp()) / 1000) + " seconds old");
+ if (LOG.isDebugEnabled()) {
+ LOG.warn("Requesting an old revision", new Exception());
+ }
+ }
+ }
+
private boolean includeRevision(Revision x, Revision requestRevision) {
if (x.getClusterId() == this.clusterId &&
requestRevision.getClusterId() == this.clusterId) {
@@ -412,7 +425,7 @@ public class MongoMK implements MicroKer
}
@Override
- public String commit(String rootPath, String json, String revisionId,
+ public synchronized String commit(String rootPath, String json, String revisionId,
String message) throws MicroKernelException {
revisionId = revisionId == null ? headRevision.toString() : revisionId;
JsopReader t = new JsopTokenizer(json);
@@ -556,7 +569,7 @@ public class MongoMK implements MicroKer
.get(UpdateOp.DELETED);
if (valueMap != null) {
String value = getLatestValue(valueMap, rev);
- if ("true".equals(value)) {
+ if (value == null || "true".equals(value)) {
return true;
}
}
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=1453808&r1=1453807&r2=1453808&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 Thu Mar 7 12:28:43 2013
@@ -69,6 +69,7 @@ public class Node {
String id = Utils.getIdFromPath(path);
UpdateOp op = new UpdateOp(path, id, isNew);
op.set(UpdateOp.ID, id);
+ op.addMapEntry(UpdateOp.DELETED + "." + rev.toString(), "false");
for (String p : properties.keySet()) {
String key = Utils.escapePropertyName(p);
op.addMapEntry(key + "." + rev.toString(), properties.get(p));
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Revision.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Revision.java?rev=1453808&r1=1453807&r2=1453808&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Revision.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Revision.java Thu Mar 7 12:28:43 2013
@@ -116,6 +116,10 @@ public class Revision {
return buff.toString();
}
+ public long getTimestamp() {
+ return timestamp;
+ }
+
public int hashCode() {
return (int) (timestamp >>> 32) ^ (int) timestamp ^ counter ^ clusterId;
}
@@ -135,5 +139,5 @@ public class Revision {
public int getClusterId() {
return clusterId;
}
-
+
}
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=1453808&r1=1453807&r2=1453808&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 Thu Mar 7 12:28:43 2013
@@ -91,11 +91,18 @@ public class SimpleTest {
@Test
public void reAddDeleted() {
MongoMK mk = createMK();
- String rev = mk.commit("/", "+\"test\":{\"name\": \"Hello\"}", null, null);
- rev = mk.commit("/", "-\"test\"", rev, null);
- rev = mk.commit("/", "+\"test\":{\"name\": \"Hallo\"}", null, null);
- String test = mk.getNodes("/test", rev, 0, 0, Integer.MAX_VALUE, null);
- assertEquals("{\"name\":\"Hallo\",\":childNodeCount\":0}", test);
+ String rev0 = mk.getHeadRevision();
+ String rev1 = mk.commit("/", "+\"test\":{\"name\": \"Hello\"}", null, null);
+ String rev2 = mk.commit("/", "-\"test\"", null, null);
+ String rev3 = mk.commit("/", "+\"test\":{\"name\": \"Hallo\"}", null, null);
+ String test0 = mk.getNodes("/test", rev0, 0, 0, Integer.MAX_VALUE, null);
+ assertNull(null, test0);
+ String test1 = mk.getNodes("/test", rev1, 0, 0, Integer.MAX_VALUE, null);
+ assertEquals("{\"name\":\"Hello\",\":childNodeCount\":0}", test1);
+ String test2 = mk.getNodes("/test", rev2, 0, 0, Integer.MAX_VALUE, null);
+ assertNull(null, test2);
+ String test3 = mk.getNodes("/test", rev3, 0, 0, Integer.MAX_VALUE, null);
+ assertEquals("{\"name\":\"Hallo\",\":childNodeCount\":0}", test3);
mk.dispose();
}