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 al...@apache.org on 2014/04/03 22:08:17 UTC

svn commit: r1584369 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document: DocumentNodeBuilder.java DocumentRootBuilder.java

Author: alexparvulescu
Date: Thu Apr  3 20:08:16 2014
New Revision: 1584369

URL: http://svn.apache.org/r1584369
Log:
OAK-1415 OOME when moving large subtree


Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentRootBuilder.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java?rev=1584369&r1=1584368&r2=1584369&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java Thu Apr  3 20:08:16 2014
@@ -22,11 +22,15 @@ import java.io.InputStream;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.ApplyDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static org.apache.jackrabbit.oak.spi.state.AbstractNodeState.checkValidName;
 
 /**
  * A node builder implementation for DocumentMK.
@@ -63,6 +67,11 @@ class DocumentNodeBuilder extends Memory
 
     @Override
     public boolean moveTo(NodeBuilder newParent, String newName) {
+        checkNotNull(newParent);
+        checkValidName(newName);
+        if (isRoot() || !exists() || newParent.hasChildNode(newName)) {
+            return false;
+        }
         if (newParent instanceof DocumentNodeBuilder) {
             // check if this builder is an ancestor of newParent or newParent
             DocumentNodeBuilder parent = (DocumentNodeBuilder) newParent;
@@ -78,11 +87,37 @@ class DocumentNodeBuilder extends Memory
                 }
             }
         }
-        return super.moveTo(newParent, newName);
+        if (newParent.exists()) {
+            // remember current root state and reset root in case
+            // something goes wrong
+            NodeState rootState = root.getNodeState();
+            boolean success = false;
+            try {
+                annotateSourcePath();
+                NodeState nodeState = getNodeState();
+                new ApplyDiff(newParent.child(newName)).apply(nodeState);
+                removeRecursive(this);
+                success = true;
+                return true;
+            } finally {
+                if (!success) {
+                    root.reset(rootState);
+                }
+            }
+        } else {
+            return false;
+        }
     }
 
     @Override
     public Blob createBlob(InputStream stream) throws IOException {
         return root.createBlob(stream);
     }
+
+    private static void removeRecursive(NodeBuilder builder) {
+        for (String name : builder.getChildNodeNames()) {
+            removeRecursive(builder.getChildNode(name));
+        }
+        builder.remove();
+    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentRootBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentRootBuilder.java?rev=1584369&r1=1584368&r2=1584369&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentRootBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentRootBuilder.java Thu Apr  3 20:08:16 2014
@@ -41,7 +41,7 @@ class DocumentRootBuilder extends Memory
      * Number of content updates that need to happen before the updates
      * are automatically purged to the private branch.
      */
-    static final int UPDATE_LIMIT = Integer.getInteger("update.limit", 1000);
+    static final int UPDATE_LIMIT = Integer.getInteger("update.limit", 10000);
 
     /**
      * The underlying store