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/06/06 14:36:35 UTC
svn commit: r1490256 - in
/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk:
MongoMK.java Node.java
Author: thomasm
Date: Thu Jun 6 12:36:35 2013
New Revision: 1490256
URL: http://svn.apache.org/r1490256
Log:
OAK-857 MongoMK: support for many child nodes (bugfix)
Modified:
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/Node.java
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java?rev=1490256&r1=1490255&r2=1490256&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/MongoMK.java Thu Jun 6 12:36:35 2013
@@ -623,6 +623,9 @@ public class MongoMK implements MicroKer
}
Node.Children readChildren(String path, Revision rev, int limit) {
+ // TODO use offset, to avoid O(n^2) and running out of memory
+ // to do that, use the *name* of the last entry of the previous batch of children
+ // as the starting point
String from = getPathLowerLimit(path);
String to = getPathUpperLimit(path);
List<Map<String, Object>> list = store.query(DocumentStore.Collection.NODES,
@@ -934,8 +937,14 @@ public class MongoMK implements MicroKer
max = MANY_CHILDREN_THRESHOLD;
maxChildNodes = Integer.MAX_VALUE;
} else {
- // avoid overflow (if maxChildNodes is Integer.MAX_VALUE)
- max = Math.max(maxChildNodes, maxChildNodes + 1);
+ // use long to avoid overflows
+ long m = maxChildNodes + 1L + offset;
+ max = (int) Math.min(m, Integer.MAX_VALUE);
+ }
+ if (offset > 0) {
+ // TODO workaround for missing offset
+ // support in getChildren
+ max = Integer.MAX_VALUE;
}
Children c = getChildren(path, rev, max);
for (long i = offset; i < c.children.size(); i++) {
@@ -1122,8 +1131,7 @@ public class MongoMK implements MicroKer
nodeCache.invalidate(path + "@" + rev);
if (n != null) {
- Node.Children c = getChildren(path, rev,
- Integer.MAX_VALUE);
+ Node.Children c = getChildren(path, rev, Integer.MAX_VALUE);
for (String childPath : c.children) {
markAsDeleted(childPath, commit, true);
}
Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/Node.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/Node.java?rev=1490256&r1=1490255&r2=1490256&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/Node.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/Node.java Thu Jun 6 12:36:35 2013
@@ -118,10 +118,9 @@ public class Node {
final String path;
final Revision rev;
-
final ArrayList<String> children = new ArrayList<String>();
-
boolean hasMore;
+ long offset;
Children(String path, Revision rev) {
this.path = path;