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 mr...@apache.org on 2014/04/24 13:51:49 UTC

svn commit: r1589681 - in /jackrabbit/oak/branches/1.0: ./ oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java

Author: mreutegg
Date: Thu Apr 24 11:51:48 2014
New Revision: 1589681

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

Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1589664

Modified: jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java?rev=1589681&r1=1589680&r2=1589681&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java (original)
+++ jackrabbit/oak/branches/1.0/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java Thu Apr 24 11:51:48 2014
@@ -108,6 +108,7 @@ 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;
@@ -167,6 +168,12 @@ 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.
      *
@@ -208,6 +215,7 @@ public class RepositoryUpgrade {
     public RepositoryUpgrade(RepositoryContext source, NodeStore target) {
         this.source = source;
         this.target = target;
+        this.copyNodeStateByValue = target instanceof DocumentNodeStore;
     }
 
     public boolean isCopyBinariesByReference() {
@@ -725,13 +733,13 @@ public class RepositoryUpgrade {
                 source.getInternalVersionManager().getPersistenceManager();
 
         NodeBuilder system = builder.child(JCR_SYSTEM);
-        system.setChildNode(JCR_VERSIONSTORAGE, new JackrabbitNodeState(
+        copyState(system, JCR_VERSIONSTORAGE, new JackrabbitNodeState(
                 pm, root, uriToPrefix, VERSION_STORAGE_NODE_ID,
                 "/jcr:system/jcr:versionStorage", copyBinariesByReference));
-        system.setChildNode("jcr:activities", new JackrabbitNodeState(
+        copyState(system, "jcr:activities", new JackrabbitNodeState(
                 pm, root, uriToPrefix, ACTIVITIES_NODE_ID,
                 "/jcr:system/jcr:activities", copyBinariesByReference));
-    }   
+    }
 
     private String copyWorkspace(
             NodeBuilder builder, NodeState root, String name,
@@ -744,18 +752,34 @@ public class RepositoryUpgrade {
 
         NodeState state = new JackrabbitNodeState(
                 pm, root, uriToPrefix, ROOT_NODE_ID, "/", copyBinariesByReference);
+
+        copyState(builder, state, copyNodeStateByValue);
+        return name;
+    }
+
+    private void copyState(NodeBuilder parent, String childName, NodeState state) {
+        if (copyNodeStateByValue) {
+            copyState(parent.child(childName), state, true);
+        } else {
+            parent.setChildNode(childName, state);
+        }
+    }
+
+    private void copyState(NodeBuilder builder, NodeState state, boolean copyByValue) {
         for (PropertyState property : state.getProperties()) {
             builder.setProperty(property);
         }
         for (ChildNodeEntry child : state.getChildNodeEntries()) {
             String childName = child.getName();
             if (!JCR_SYSTEM.equals(childName)) {
-                builder.setChildNode(childName, child.getNodeState());
+                NodeState childNodeState = child.getNodeState();
+                if (copyByValue) {
+                    NodeBuilder childBuilder = builder.child(childName);
+                    copyState(childBuilder, childNodeState, true);
+                } else {
+                    builder.setChildNode(childName, childNodeState);
+                }
             }
         }
-
-        return name;
     }
-
-
 }