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 to...@apache.org on 2016/09/06 09:38:30 UTC

svn commit: r1759392 - in /jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade: ./ version/

Author: tomekr
Date: Tue Sep  6 09:38:29 2016
New Revision: 1759392

URL: http://svn.apache.org/viewvc?rev=1759392&view=rev
Log:
OAK-4761: Reduce the number of calls to /jcr:system/jcr:versionStorage during the upgrade

Modified:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java?rev=1759392&r1=1759391&r2=1759392&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java Tue Sep  6 09:38:29 2016
@@ -67,6 +67,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.markIndexesToBeRebuilt;
 import static org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier.copyProperties;
 import static org.apache.jackrabbit.oak.upgrade.version.VersionCopier.copyVersionStorage;
+import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionStorage;
 
 public class RepositorySidegrade {
 
@@ -298,7 +299,7 @@ public class RepositorySidegrade {
         }
 
         if (!versionCopyConfiguration.skipOrphanedVersionsCopy()) {
-            copyVersionStorage(sourceRoot, targetRoot, versionCopyConfiguration);
+            copyVersionStorage(targetRoot, getVersionStorage(sourceRoot), getVersionStorage(targetRoot), versionCopyConfiguration);
         }
 
         final List<CommitHook> hooks = new ArrayList<CommitHook>();

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=1759392&r1=1759391&r2=1759392&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 Tue Sep  6 09:38:29 2016
@@ -145,6 +145,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.jackrabbit.oak.upgrade.version.VersionCopier.copyVersionStorage;
+import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionStorage;
 
 public class RepositoryUpgrade {
 
@@ -491,7 +492,7 @@ public class RepositoryUpgrade {
             if (!versionCopyConfiguration.skipOrphanedVersionsCopy()) {
                 logger.info("Copying version storage");
                 watch.reset().start();
-                copyVersionStorage(sourceRoot, targetBuilder, versionCopyConfiguration);
+                copyVersionStorage(targetBuilder, getVersionStorage(sourceRoot), getVersionStorage(targetBuilder), versionCopyConfiguration);
                 targetBuilder.getNodeState(); // on TarMK this does call triggers the actual copy
                 logger.info("Version storage copied in {}s ({})", watch.elapsed(TimeUnit.SECONDS), watch);
             } else {

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java?rev=1759392&r1=1759391&r2=1759392&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java Tue Sep  6 09:38:29 2016
@@ -17,8 +17,6 @@
 package org.apache.jackrabbit.oak.upgrade.version;
 
 import static org.apache.jackrabbit.JcrConstants.JCR_CREATED;
-import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM;
-import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE;
 import static org.apache.jackrabbit.JcrConstants.NT_VERSION;
 
 import java.util.Calendar;
@@ -38,7 +36,7 @@ import org.apache.jackrabbit.util.ISO860
 import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.REINDEX_PROPERTY_NAME;
 import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.VERSION_STORE_PATH;
 
-import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryPath;
+import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getRelativeVersionHistoryPath;
 import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState;
 
 /**
@@ -49,20 +47,22 @@ public class VersionCopier {
 
     private final TypePredicate isVersion;
 
-    private final NodeState sourceRoot;
+    private final NodeState sourceVersionStorage;
+
+    private final NodeBuilder targetVersionStorage;
 
     private final NodeBuilder targetRoot;
 
-    public VersionCopier(NodeState sourceRoot, NodeBuilder targetRoot) {
+    public VersionCopier(NodeBuilder targetRoot, NodeState sourceVersionStorage, NodeBuilder targetVersionStorage) {
         this.isVersion = new TypePredicate(targetRoot.getNodeState(), NT_VERSION);
-        this.sourceRoot = sourceRoot;
+        this.sourceVersionStorage = sourceVersionStorage;
+        this.targetVersionStorage = targetVersionStorage;
         this.targetRoot = targetRoot;
     }
 
-    public static void copyVersionStorage(NodeState sourceRoot, NodeBuilder targetRoot, VersionCopyConfiguration config) {
-        final NodeState versionStorage = sourceRoot.getChildNode(JCR_SYSTEM).getChildNode(JCR_VERSIONSTORAGE);
-        final Iterator<NodeState> versionStorageIterator = new DescendantsIterator(versionStorage, 3);
-        final VersionCopier versionCopier = new VersionCopier(sourceRoot, targetRoot);
+    public static void copyVersionStorage(NodeBuilder targetRoot, NodeState sourceVersionStorage, NodeBuilder targetVersionStorage, VersionCopyConfiguration config) {
+        final Iterator<NodeState> versionStorageIterator = new DescendantsIterator(sourceVersionStorage, 3);
+        final VersionCopier versionCopier = new VersionCopier(targetRoot, sourceVersionStorage, targetVersionStorage);
 
         boolean versionsCopied = false;
         while (versionStorageIterator.hasNext()) {
@@ -96,15 +96,15 @@ public class VersionCopier {
     }
 
     private boolean doCopyVersionHistory(String versionableUuid, Calendar minDate) {
-        final String versionHistoryPath = getVersionHistoryPath(versionableUuid);
-        final NodeState sourceVersionHistory = getVersionHistoryNodeState(sourceRoot, versionableUuid);
+        final String versionHistoryPath = getRelativeVersionHistoryPath(versionableUuid);
+        final NodeState sourceVersionHistory = getVersionHistoryNodeState(sourceVersionStorage, versionableUuid);
         final Calendar lastModified = getVersionHistoryLastModified(sourceVersionHistory);
 
         if (sourceVersionHistory.exists() && (lastModified.after(minDate) || minDate.getTimeInMillis() == 0)) {
             NodeStateCopier.builder()
                     .include(versionHistoryPath)
                     .merge(VERSION_STORE_PATH)
-                    .copy(sourceRoot, targetRoot);
+                    .copy(sourceVersionStorage, targetVersionStorage);
             return true;
         }
         return false;

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java?rev=1759392&r1=1759391&r2=1759392&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionHistoryUtil.java Tue Sep  6 09:38:29 2016
@@ -31,10 +31,10 @@ import com.google.common.base.Joiner;
 
 public class VersionHistoryUtil {
 
-    public static String getVersionHistoryPath(String versionableUuid) {
+    public static String getRelativeVersionHistoryPath(String versionableUuid) {
         return Joiner.on('/').join(concat(
                 singleton(""),
-                getVersionHistoryPathSegments(versionableUuid),
+                getRelativeVersionHistoryPathSegments(versionableUuid),
                 singleton(versionableUuid)));
     }
 
@@ -46,30 +46,36 @@ public class VersionHistoryUtil {
      * @return The NodeState corresponding to the version history, or {@code null}
      *         if it does not exist.
      */
-    static NodeState getVersionHistoryNodeState(NodeState root, String versionableUuid) {
-        NodeState historyParent = root;
-        for (String segment : getVersionHistoryPathSegments(versionableUuid)) {
+    static NodeState getVersionHistoryNodeState(NodeState versionStorage, String versionableUuid) {
+        NodeState historyParent = versionStorage;
+        for (String segment : getRelativeVersionHistoryPathSegments(versionableUuid)) {
             historyParent = historyParent.getChildNode(segment);
         }
         return historyParent.getChildNode(versionableUuid);
     }
 
-    static NodeBuilder getVersionHistoryBuilder(NodeBuilder root, String versionableUuid) {
-        NodeBuilder history = root;
-        for (String segment : getVersionHistoryPathSegments(versionableUuid)) {
+    static NodeBuilder getVersionHistoryBuilder(NodeBuilder versionStorage, String versionableUuid) {
+        NodeBuilder history = versionStorage;
+        for (String segment : getRelativeVersionHistoryPathSegments(versionableUuid)) {
             history = history.getChildNode(segment);
         }
         return history.getChildNode(versionableUuid);
     }
 
-    private static List<String> getVersionHistoryPathSegments(String versionableUuid) {
+    private static List<String> getRelativeVersionHistoryPathSegments(String versionableUuid) {
         final List<String> segments = new ArrayList<String>();
-        segments.add(JCR_SYSTEM);
-        segments.add(JCR_VERSIONSTORAGE);
         for (int i = 0; i < 3; i++) {
             segments.add(versionableUuid.substring(i * 2, i * 2 + 2));
         }
         return segments;
     }
 
+    public static NodeState getVersionStorage(NodeState root) {
+        return root.getChildNode(JCR_SYSTEM).getChildNode(JCR_VERSIONSTORAGE);
+    }
+
+    public static NodeBuilder getVersionStorage(NodeBuilder root) {
+        return root.child(JCR_SYSTEM).child(JCR_VERSIONSTORAGE);
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java?rev=1759392&r1=1759391&r2=1759392&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionableEditor.java Tue Sep  6 09:38:29 2016
@@ -47,6 +47,7 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState.nameProperty;
 import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.MIX_REP_VERSIONABLE_PATHS;
 import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState;
+import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionStorage;
 
 /**
  * The VersionableEditor provides two possible ways to handle
@@ -70,6 +71,8 @@ public class VersionableEditor extends D
 
     private final NodeBuilder rootBuilder;
 
+    private final NodeBuilder versionStorage;
+
     private final TypePredicate isReferenceable;
 
     private final TypePredicate isVersionable;
@@ -80,16 +83,17 @@ public class VersionableEditor extends D
 
     private String path;
 
-    private VersionableEditor(Provider provider, NodeBuilder builder) {
+    private VersionableEditor(Provider provider, NodeBuilder rootBuilder) {
+        this.rootBuilder = rootBuilder;
+        this.versionStorage = getVersionStorage(rootBuilder);
+        this.vMgr = new ReadWriteVersionManager(versionStorage, rootBuilder);
+
         this.provider = provider;
-        this.rootBuilder = builder;
-        this.isVersionable = new TypePredicate(builder.getNodeState(), MIX_VERSIONABLE);
-        this.isReferenceable = new TypePredicate(builder.getNodeState(), MIX_REFERENCEABLE);
-        this.versionCopier = new VersionCopier(provider.sourceRoot, builder);
+        this.isVersionable = new TypePredicate(rootBuilder.getNodeState(), MIX_VERSIONABLE);
+        this.isReferenceable = new TypePredicate(rootBuilder.getNodeState(), MIX_REFERENCEABLE);
+        this.versionCopier = new VersionCopier(rootBuilder, getVersionStorage(provider.sourceRoot), versionStorage);
         this.path = "/";
 
-        NodeBuilder vsRoot = rootBuilder.child(NodeTypeConstants.JCR_SYSTEM).child(NodeTypeConstants.JCR_VERSIONSTORAGE);
-        this.vMgr = new ReadWriteVersionManager(vsRoot, rootBuilder);
     }
 
     public static class Provider implements EditorProvider {
@@ -107,8 +111,8 @@ public class VersionableEditor extends D
         }
 
         @Override
-        public Editor getRootEditor(NodeState before, NodeState after, NodeBuilder builder, CommitInfo info) throws CommitFailedException {
-            return new VersionableEditor(this, builder);
+        public Editor getRootEditor(NodeState before, NodeState after, NodeBuilder rootBuilder, CommitInfo info) throws CommitFailedException {
+            return new VersionableEditor(this, rootBuilder);
         }
     }
 
@@ -159,13 +163,13 @@ public class VersionableEditor extends D
     }
 
     private void setVersionablePath(String versionableUuid) {
-        final NodeBuilder versionHistory = VersionHistoryUtil.getVersionHistoryBuilder(rootBuilder, versionableUuid);
+        final NodeBuilder versionHistory = VersionHistoryUtil.getVersionHistoryBuilder(versionStorage, versionableUuid);
         versionHistory.setProperty(provider.workspaceName, path, Type.PATH);
         addMixin(versionHistory, MIX_REP_VERSIONABLE_PATHS);
     }
 
     private boolean isVersionHistoryExists(String versionableUuid) {
-        return getVersionHistoryNodeState(rootBuilder.getNodeState(), versionableUuid).exists();
+        return getVersionHistoryNodeState(versionStorage.getNodeState(), versionableUuid).exists();
     }
 
     private void removeVersionProperties(final NodeBuilder versionableBuilder) {

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java?rev=1759392&r1=1759391&r2=1759392&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionablePropertiesEditor.java Tue Sep  6 09:38:29 2016
@@ -37,7 +37,6 @@ import static com.google.common.collect.
 import static org.apache.jackrabbit.JcrConstants.JCR_BASEVERSION;
 import static org.apache.jackrabbit.JcrConstants.JCR_FROZENMIXINTYPES;
 import static org.apache.jackrabbit.JcrConstants.JCR_ISCHECKEDOUT;
-import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
 import static org.apache.jackrabbit.JcrConstants.JCR_PREDECESSORS;
 import static org.apache.jackrabbit.JcrConstants.JCR_ROOTVERSION;
 import static org.apache.jackrabbit.JcrConstants.JCR_SUCCESSORS;
@@ -51,6 +50,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.api.Type.REFERENCES;
 import static org.apache.jackrabbit.oak.plugins.memory.MultiGenericPropertyState.nameProperty;
 import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionHistoryNodeState;
+import static org.apache.jackrabbit.oak.upgrade.version.VersionHistoryUtil.getVersionStorage;
 
 /**
  * The VersionablePropertiesEditor adds missing versionable properties.
@@ -63,6 +63,8 @@ public final class VersionableProperties
 
     private final NodeBuilder rootBuilder;
 
+    private final NodeBuilder versionStorage;
+
     private final NodeBuilder builder;
 
     private final TypePredicate isVersionable;
@@ -76,6 +78,7 @@ public final class VersionableProperties
     private VersionablePropertiesEditor(NodeBuilder rootBuilder) {
         this.builder = rootBuilder;
         this.rootBuilder = rootBuilder;
+        this.versionStorage = getVersionStorage(rootBuilder);
         this.isVersionable = new TypePredicate(rootBuilder.getNodeState(), MIX_VERSIONABLE);
         this.isSimpleVersionable = new TypePredicate(rootBuilder.getNodeState(), MIX_SIMPLE_VERSIONABLE);
         this.isNtVersion = new TypePredicate(rootBuilder.getNodeState(), NT_VERSION);
@@ -85,6 +88,7 @@ public final class VersionableProperties
     private VersionablePropertiesEditor(VersionablePropertiesEditor parent, NodeBuilder builder) {
         this.builder = builder;
         this.rootBuilder = parent.rootBuilder;
+        this.versionStorage = parent.versionStorage;
         this.isVersionable = parent.isVersionable;
         this.isSimpleVersionable = parent.isSimpleVersionable;
         this.isNtVersion = parent.isNtVersion;
@@ -133,7 +137,7 @@ public final class VersionableProperties
     }
 
     private void fixProperties(NodeBuilder node) {
-        NodeState versionHistory = getVersionHistoryNodeState(rootBuilder.getNodeState(), node.getString(JCR_UUID));
+        NodeState versionHistory = getVersionHistoryNodeState(versionStorage.getNodeState(), node.getString(JCR_UUID));
         if (!versionHistory.exists()) {
             log.warn("No version history for {}", node);
             return;