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/10/23 14:45:05 UTC

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

Author: mreutegg
Date: Wed Oct 23 12:45:04 2013
New Revision: 1535004

URL: http://svn.apache.org/r1535004
Log:
OAK-1107: MongoMK may not detect changes with diffManyChildren()

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/UnsavedModifications.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKDiffTest.java
    jackrabbit/oak/trunk/oak-jcr/pom.xml

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=1535004&r1=1535003&r2=1535004&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 Oct 23 12:45:04 2013
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.InputStream;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
@@ -250,11 +249,23 @@ public class MongoMK implements MicroKer
         long minValue = Commit.getModified(minTimestamp);
         String fromKey = Utils.getKeyLowerLimit(path);
         String toKey = Utils.getKeyUpperLimit(path);
-        List<NodeDocument> list = store.query(Collection.NODES, fromKey, toKey,
-                NodeDocument.MODIFIED, minValue, Integer.MAX_VALUE);
-        for (NodeDocument doc : list) {
-            String id = doc.getId();
-            String p = Utils.getPathFromId(id);
+        Set<String> paths = new HashSet<String>();
+        for (NodeDocument doc : store.query(Collection.NODES, fromKey, toKey,
+                NodeDocument.MODIFIED, minValue, Integer.MAX_VALUE)) {
+            paths.add(Utils.getPathFromId(doc.getId()));
+        }
+        // also consider nodes with not yet stored modifications (OAK-1107)
+        Revision minRev = new Revision(minTimestamp, 0, nodeStore.getClusterId());
+        for (String p : nodeStore.getPendingModifications().getPaths(minRev)) {
+            if (PathUtils.denotesRoot(p)) {
+                continue;
+            }
+            String parent = PathUtils.getParentPath(p);
+            if (path.equals(parent)) {
+                paths.add(p);
+            }
+        }
+        for (String p : paths) {
             Node fromNode = nodeStore.getNode(p, fromRev);
             Node toNode = nodeStore.getNode(p, toRev);
             if (fromNode != null) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UnsavedModifications.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UnsavedModifications.java?rev=1535004&r1=1535003&r2=1535004&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UnsavedModifications.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/UnsavedModifications.java Wed Oct 23 12:45:04 2013
@@ -17,11 +17,17 @@
 package org.apache.jackrabbit.oak.plugins.mongomk;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -95,4 +101,31 @@ class UnsavedModifications {
             other.put(entry.getKey(), mergeCommit);
         }
     }
+
+    /**
+     * Returns all paths of nodes with modifications at the start revision
+     * (inclusive) or later.
+     *
+     * @param start the start revision (inclusive).
+     * @return matching paths with pending modifications.
+     */
+    @Nonnull
+    public Iterable<String> getPaths(@Nonnull final Revision start) {
+        if (map.isEmpty()) {
+            return Collections.emptyList();
+        } else {
+            return Iterables.transform(Iterables.filter(map.entrySet(),
+                    new Predicate<Map.Entry<String, Revision>>() {
+                @Override
+                public boolean apply(Map.Entry<String, Revision> input) {
+                    return start.compareRevisionTime(input.getValue()) < 1;
+                }
+            }), new Function<Map.Entry<String, Revision>, String>() {
+                @Override
+                public String apply(Map.Entry<String, Revision> input) {
+                    return input.getKey();
+                }
+            });
+        }
+    }
 }

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=1535004&r1=1535003&r2=1535004&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 Oct 23 12:45:04 2013
@@ -250,14 +250,13 @@ public class MongoMKDiffTest extends Abs
     }
 
     @Test
-    @Ignore
     public void diffForChangeBelowManyChildren() throws InterruptedException {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < MongoMK.MANY_CHILDREN_THRESHOLD * 2; i++) {
             sb.append("+\"node-").append(i).append("\":{}");
         }
         mk.commit("/", sb.toString(), null, null);
-        // wait a while, _modified has 5 seconds granularity
+        // wait a while, _modified has 5 seconds resolution
         Thread.sleep(TimeUnit.SECONDS.toMillis(6));
         // create a base commit for the diff
         String base = mk.commit("/", "+\"foo\":{}", null, null);

Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1535004&r1=1535003&r2=1535004&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-jcr/pom.xml Wed Oct 23 12:45:04 2013
@@ -80,7 +80,6 @@
       org.apache.jackrabbit.test.api.observation.GetIdentifierTest#testNodeMoved
       org.apache.jackrabbit.test.api.observation.LockingTest#testAddLockToNode
       org.apache.jackrabbit.test.api.observation.LockingTest#testRemoveLockFromNode
-      org.apache.jackrabbit.test.api.observation.GetUserDataTest#testVersioning
 
       <!-- Versioning -->
       org.apache.jackrabbit.test.api.version.VersionTest#testUpdate