Author: mreutegg
Date: Wed Mar  5 12:59:41 2014
New Revision: 1574463

URL: http://svn.apache.org/r1574463
Log:
OAK-1429: Slow event listeners do not scale as expected

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java?rev=1574463&r1=1574462&r2=1574463&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentMK.java
 Wed Mar  5 12:59:41 2014
@@ -55,7 +55,7 @@ public class DocumentMK implements Micro
      * The threshold where special handling for many child node starts.
      */
     static final int MANY_CHILDREN_THRESHOLD = Integer.getInteger(
-            "oak.documentMK.manyChildren", 50);
+            "oak.documentMK.manyChildren", 10);
     
     /**
      * Enable the LIRS cache.

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java?rev=1574463&r1=1574462&r2=1574463&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java
 Wed Mar  5 12:59:41 2014
@@ -52,6 +52,7 @@ import com.google.common.collect.Iterato
 import com.google.common.collect.Maps;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static 
org.apache.jackrabbit.oak.plugins.document.DocumentMK.MANY_CHILDREN_THRESHOLD;
 import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
 
 /**
@@ -71,12 +72,6 @@ class DocumentNodeState extends Abstract
      */
     static final int MAX_FETCH_SIZE = INITIAL_FETCH_SIZE << 4;
 
-    /**
-     * Number of child nodes beyond which {@link DocumentNodeStore#}
-     * is used for diffing.
-     */
-    public static final int LOCAL_DIFF_THRESHOLD = 10;
-
     private final DocumentNodeStore store;
 
     final String path;
@@ -246,7 +241,7 @@ class DocumentNodeState extends Abstract
                     if (lastRevision.equals(mBase.lastRevision)) {
                         // no differences
                         return true;
-                    } else if (getChildNodeCount(LOCAL_DIFF_THRESHOLD) > 
LOCAL_DIFF_THRESHOLD) {
+                    } else if (getChildNodeCount(MANY_CHILDREN_THRESHOLD) > 
MANY_CHILDREN_THRESHOLD) {
                         // use DocumentNodeStore compare when there are many 
children
                         return dispatch(store.diffChildren(this, mBase), 
mBase, diff);
                     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1574463&r1=1574462&r2=1574463&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
 Wed Mar  5 12:59:41 2014
@@ -55,7 +55,7 @@ import static org.apache.jackrabbit.oak.
 /**
  * A document storing data about a node.
  */
-public class NodeDocument extends Document implements CachedNodeDocument{
+final public class NodeDocument extends Document implements CachedNodeDocument{
 
     /**
      * Marker document, which indicates the document does not exist.
@@ -361,10 +361,6 @@ public class NodeDocument extends Docume
         // check local map first
         Map<Revision, String> local = getLocalCommitRoot();
         String depth = local.get(revision);
-        if (depth == null) {
-            // check full map
-            depth = getCommitRoot().get(revision);
-        }
         if (depth != null) {
             if (depth.equals("0")) {
                 return "/";
@@ -372,9 +368,15 @@ public class NodeDocument extends Docume
             String p = Utils.getPathFromId(getId());
             return PathUtils.getAncestorPath(p,
                     PathUtils.getDepth(p) - Integer.parseInt(depth));
-        } else {
-            return null;
         }
+        // check previous
+        for (NodeDocument prev : getPreviousDocs(COMMIT_ROOT, revision)) {
+            String path = prev.getCommitRootPath(revision);
+            if (path != null) {
+                return path;
+            }
+        }
+        return null;
     }
 
     /**
@@ -826,7 +828,7 @@ public class NodeDocument extends Docume
     @Nonnull
     SortedMap<Revision, String> getLocalMap(String key) {
         @SuppressWarnings("unchecked")
-        SortedMap<Revision, String> map = (SortedMap<Revision, String>) 
get(key);
+        SortedMap<Revision, String> map = (SortedMap<Revision, String>) 
data.get(key);
         if (map == null) {
             map = ValueMap.EMPTY;
         }
@@ -1095,6 +1097,11 @@ public class NodeDocument extends Docume
         Revision latestRev = null;
         for (Map.Entry<Revision, String> entry : valueMap.entrySet()) {
             Revision propRev = entry.getKey();
+            // ignore revisions newer than readRevision
+            // -> these are not visible anyway
+            if (isRevisionNewer(context, propRev, readRevision)) {
+                continue;
+            }
             // resolve revision
             NodeDocument commitRoot = getCommitRoot(propRev);
             if (commitRoot == null) {


Reply via email to