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 mr...@apache.org on 2013/07/10 11:02:25 UTC

svn commit: r1501680 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/mongomk/ test/java/org/apache/jackrabbit/oak/plugins/mongomk/

Author: mreutegg
Date: Wed Jul 10 09:02:24 2013
New Revision: 1501680

URL: http://svn.apache.org/r1501680
Log:
OAK-619 Lock-free MongoMK implementation
- Extend diff test and fix minor issue with many child nodes

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Node.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKDiffTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java?rev=1501680&r1=1501679&r2=1501680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java Wed Jul 10 09:02:24 2013
@@ -895,23 +895,25 @@ public class MongoMK implements MicroKer
         List<Map<String, Object>> list = store.query(DocumentStore.Collection.NODES, fromKey, toKey, 
                 UpdateOp.MODIFIED, minValue, Integer.MAX_VALUE);
         for (Map<String, Object> e : list) {
-            if (isOlder(e, rev)) {
-                continue;
-            }
             String id = e.get(UpdateOp.ID).toString();
             String p = Utils.getPathFromId(id);
-            if (getNode(p, fromRev) != null) {
+            Node fromNode = getNode(p, fromRev);
+            Node toNode = getNode(p, toRev);
+            if (fromNode != null) {
                 // exists in fromRev
-                if (getNode(p, toRev) != null) {
+                if (toNode != null) {
                     // exists in both revisions
-                    w.tag('^').key(p).object().endObject().newline();
+                    // check if different
+                    if (!fromNode.getLastRevision().equals(toNode.getLastRevision())) {
+                        w.tag('^').key(p).object().endObject().newline();
+                    }
                 } else {
                     // does not exist in toRev -> was removed
                     w.tag('-').value(p).newline();
                 }
             } else {
                 // does not exist in fromRev
-                if (getNode(p, toRev) != null) {
+                if (toNode != null) {
                     // exists in toRev
                     w.tag('+').key(p).object().endObject().newline();
                 } else {
@@ -1276,34 +1278,6 @@ public class MongoMK implements MicroKer
         return liveRev;
     }
     
-    boolean isOlder(Map<String, Object> map, Revision rev) {
-        Revision revision;
-        for (String key : map.keySet()) {
-            if (!Utils.isPropertyName(key)) {
-                if (key.equals(UpdateOp.ID)) {
-                    continue;
-                } else if (key.equals(UpdateOp.LAST_REV)) {
-                    // TODO could use just this property? it would be faster
-                    continue;
-                } else if (key.equals(UpdateOp.PREVIOUS)) {
-                    continue;
-                } else if (key.equals(UpdateOp.MODIFIED)) {
-                    continue;
-                }                    
-            }
-            Object v = map.get(key);
-            @SuppressWarnings("unchecked")
-            Map<String, String> valueMap = (Map<String, String>) v;
-            for (String r : valueMap.keySet()) {
-                revision = Revision.fromString(r);
-                if (!isRevisionNewer(rev, revision)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-    
     /**
      * Get the revision of the latest change made to this node.
      * 

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Node.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Node.java?rev=1501680&r1=1501679&r2=1501680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Node.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Node.java Wed Jul 10 09:02:24 2013
@@ -102,6 +102,10 @@ public class Node implements CacheValue 
     public void setLastRevision(Revision lastRevision) {
         this.lastRevision = lastRevision;
     }
+
+    public Revision getLastRevision() {
+        return lastRevision;
+    }
     
     @Override
     public int getMemory() {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKDiffTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKDiffTest.java?rev=1501680&r1=1501679&r2=1501680&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKDiffTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKDiffTest.java Wed Jul 10 09:02:24 2013
@@ -249,6 +249,15 @@ public class MongoMKDiffTest extends Abs
 
     @Test
     public void diffManyChildren() {
+        diffManyChildren(false);
+    }
+
+    @Test
+    public void diffManyChildrenOnBranch() {
+        diffManyChildren(true);
+    }
+
+    private void diffManyChildren(boolean onBranch) {
         String baseRev = mk.getHeadRevision();
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < MongoMK.MANY_CHILDREN_THRESHOLD * 2; i++) {
@@ -263,5 +272,28 @@ public class MongoMKDiffTest extends Abs
         for (int i = 0; i < MongoMK.MANY_CHILDREN_THRESHOLD * 2; i++) {
             assertTrue(jsop.contains("-\"/node-" + i + "\""));
         }
+
+        if (onBranch) {
+            rev = mk.branch(rev);
+        }
+        String rev2 = mk.commit("/", "+\"node-new\":{}", rev, null);
+        jsop = mk.diff(rev, rev2, "/", 0);
+        assertTrue(jsop.contains("+\"/node-new\""));
+
+        String rev3 = mk.commit("/", "^\"node-new/prop\":\"value\"", rev2, null);
+        jsop = mk.diff(rev2, rev3, "/", 0);
+        assertTrue(jsop.contains("^\"/node-new\""));
+
+        String rev4 = mk.commit("/", "+\"node-new/foo\":{}", rev3, null);
+        jsop = mk.diff(rev3, rev4, "/", 0);
+        assertTrue(jsop.contains("^\"/node-new\""));
+
+        String rev5 = mk.commit("/", "^\"node-new/foo/prop\":\"value\"", rev4, null);
+        jsop = mk.diff(rev4, rev5, "/", 0);
+        assertTrue(jsop.contains("^\"/node-new\""));
+
+        String rev6 = mk.commit("/", "-\"node-new/foo\"", rev5, null);
+        jsop = mk.diff(rev5, rev6, "/", 0);
+        assertTrue(jsop.contains("^\"/node-new\""));
     }
 }
\ No newline at end of file