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