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 ju...@apache.org on 2014/04/24 16:38:10 UTC

svn commit: r1589748 - /jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java

Author: jukka
Date: Thu Apr 24 14:38:10 2014
New Revision: 1589748

URL: http://svn.apache.org/r1589748
Log:
OAK-1760: RepositoryUpgrade leads to one large commit with DocumentNodeStore causing OOM

Fix problems introduced in the earlier fix:
Do the JCR_SYSTEM exclusion check only at the root level.
Override defaults instead of merging them with content from the source repository.

Modified:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java?rev=1589748&r1=1589747&r2=1589748&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java Thu Apr 24 14:38:10 2014
@@ -93,6 +93,7 @@ import javax.jcr.version.OnParentVersion
 import com.google.common.collect.HashBiMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+
 import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.config.BeanConfig;
 import org.apache.jackrabbit.core.config.LoginModuleConfig;
@@ -108,7 +109,6 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.namepath.GlobalNameMapper;
 import org.apache.jackrabbit.oak.namepath.NameMapper;
-import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
 import org.apache.jackrabbit.oak.plugins.index.CompositeIndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider;
@@ -117,6 +117,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.name.Namespaces;
 import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
@@ -168,12 +169,6 @@ public class RepositoryUpgrade {
     private boolean copyBinariesByReference = false;
 
     /**
-     * NodeState are copied by value by recursing down the complete tree
-     * This is a temporary approach for OAK-1760 for 1.0 branch.
-     */
-    private final boolean copyNodeStateByValue;
-
-    /**
      * Copies the contents of the repository in the given source directory
      * to the given target node store.
      *
@@ -215,7 +210,6 @@ public class RepositoryUpgrade {
     public RepositoryUpgrade(RepositoryContext source, NodeStore target) {
         this.source = source;
         this.target = target;
-        this.copyNodeStateByValue = target instanceof DocumentNodeStore;
     }
 
     public boolean isCopyBinariesByReference() {
@@ -753,33 +747,39 @@ public class RepositoryUpgrade {
         NodeState state = new JackrabbitNodeState(
                 pm, root, uriToPrefix, ROOT_NODE_ID, "/", copyBinariesByReference);
 
-        copyState(builder, state, copyNodeStateByValue);
+        for (PropertyState property : state.getProperties()) {
+            builder.setProperty(property);
+        }
+        for (ChildNodeEntry child : state.getChildNodeEntries()) {
+            String childName = child.getName();
+            if (!JCR_SYSTEM.equals(childName)) {
+                copyState(builder, childName, child.getNodeState());
+            }
+        }
+
         return name;
     }
 
-    private void copyState(NodeBuilder parent, String childName, NodeState state) {
-        if (copyNodeStateByValue) {
-            copyState(parent.child(childName), state, true);
+    private void copyState(NodeBuilder parent, String name, NodeState state) {
+        if (parent instanceof SegmentNodeBuilder) {
+            parent.setChildNode(name, state);
         } else {
-            parent.setChildNode(childName, state);
+            setChildNode(parent, name, state);
         }
     }
 
-    private void copyState(NodeBuilder builder, NodeState state, boolean copyByValue) {
+    /**
+     * NodeState are copied by value by recursing down the complete tree
+     * This is a temporary approach for OAK-1760 for 1.0 branch.
+     */
+    private void setChildNode(NodeBuilder parent, String name, NodeState state) {
+        NodeBuilder builder = parent.setChildNode(name);
         for (PropertyState property : state.getProperties()) {
             builder.setProperty(property);
         }
         for (ChildNodeEntry child : state.getChildNodeEntries()) {
-            String childName = child.getName();
-            if (!JCR_SYSTEM.equals(childName)) {
-                NodeState childNodeState = child.getNodeState();
-                if (copyByValue) {
-                    NodeBuilder childBuilder = builder.child(childName);
-                    copyState(childBuilder, childNodeState, true);
-                } else {
-                    builder.setChildNode(childName, childNodeState);
-                }
-            }
+            setChildNode(builder, child.getName(), child.getNodeState());
         }
     }
+
 }