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/09/18 15:11:40 UTC

svn commit: r1524397 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java

Author: mreutegg
Date: Wed Sep 18 13:11:40 2013
New Revision: 1524397

URL: http://svn.apache.org/r1524397
Log:
OAK-926: MongoMK: split documents when they are too large
- Maintain children cache entry when incomplete

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.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=1524397&r1=1524396&r2=1524397&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 Sep 18 13:11:40 2013
@@ -1308,17 +1308,32 @@ public class MongoMK implements MicroKer
         if (!added.isEmpty()) {
             NodeDocument.Children docChildren = docChildrenCache.getIfPresent(path);
             if (docChildren != null) {
-                if (docChildren.isComplete) {
-                    TreeSet<String> names = new TreeSet<String>(docChildren.childNames);
+                int currentSize = docChildren.childNames.size();
+                TreeSet<String> names = new TreeSet<String>(docChildren.childNames);
+                // incomplete cache entries must not be updated with
+                // names at the end of the list because there might be
+                // a next name in MongoDB smaller than the one added
+                if (!docChildren.isComplete) {
+                    for (String childPath : added) {
+                        String name = PathUtils.getName(childPath);
+                        if (names.higher(name) != null) {
+                            names.add(name);
+                        }
+                    }
+                } else {
+                    // add all
                     for (String childPath : added) {
                         names.add(PathUtils.getName(childPath));
                     }
+                }
+                // any changes?
+                if (names.size() != currentSize) {
+                    // create new cache entry with updated names
+                    boolean complete = docChildren.isComplete;
                     docChildren = new NodeDocument.Children();
-                    docChildren.isComplete = true;
+                    docChildren.isComplete = complete;
                     docChildren.childNames.addAll(names);
                     docChildrenCache.put(path, docChildren);
-                } else {
-                    docChildrenCache.invalidate(path);
                 }
             }
         }