From f2fea4d88b0e882f4164cc8641727573c4196622 Mon Sep 17 00:00:00 2001 From: Jukka Zitting Date: Wed, 23 Apr 2014 13:02:18 -0400 Subject: [PATCH] OAK-1760: RepositoryUpgrade leads to one large commit with DocumentNodeStore causing OOM Split DocumentNodeBuilder.setChildNode() calls to small pieces to give the purge mechanism a chance to work. --- .../oak/plugins/document/DocumentNodeBuilder.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java index 5c525b5..c5b83b2 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeBuilder.java @@ -22,14 +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.api.PropertyState; import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder; import org.apache.jackrabbit.oak.spi.state.ApplyDiff; +import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; 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.plugins.memory.EmptyNodeState.EMPTY_NODE; import static org.apache.jackrabbit.oak.spi.state.AbstractNodeState.checkValidName; /** @@ -61,6 +62,18 @@ class DocumentNodeBuilder extends MemoryNodeBuilder { } @Override + public NodeBuilder setChildNode(String name, NodeState state) { + NodeBuilder builder = super.setChildNode(name, EMPTY_NODE); + for (PropertyState property : state.getProperties()) { + builder.setProperty(property); + } + for (ChildNodeEntry child : state.getChildNodeEntries()) { + builder.setChildNode(child.getName(), child.getNodeState()); + } + return builder; + } + + @Override protected DocumentNodeBuilder createChildBuilder(String name) { return new DocumentNodeBuilder(this, name, root); } -- 1.8.4.msysgit.0