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:49:04 UTC
svn commit: r1759394 -
/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
Author: tomekr
Date: Tue Sep 6 09:49:04 2016
New Revision: 1759394
URL: http://svn.apache.org/viewvc?rev=1759394&view=rev
Log:
OAK-4751: Improve the checkpoint migration performance
Modified:
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.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=1759394&r1=1759393&r2=1759394&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:49:04 2016
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.oak.spi.com
import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
import org.apache.jackrabbit.oak.spi.commit.EditorHook;
import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
+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;
@@ -351,35 +352,35 @@ public class RepositorySidegrade {
TarNodeStore sourceTarNS = (TarNodeStore) source;
TarNodeStore targetTarNS = (TarNodeStore) target;
- NodeState srcSuperRoot = sourceTarNS.getSuperRoot();
- NodeBuilder builder = targetTarNS.getSuperRoot().builder();
+ NodeState sourceSuperRoot = sourceTarNS.getSuperRoot();
+ NodeBuilder targetSuperRoot = targetTarNS.getSuperRoot().builder();
- String previousRoot = null;
- for (String checkpoint : getCheckpointPaths(srcSuperRoot)) {
- // copy the checkpoint without the root
- NodeStateCopier.builder()
- .include(checkpoint)
- .exclude(checkpoint + "/root")
- .copy(srcSuperRoot, builder);
-
- // reference the previousRoot or targetRoot as a new checkpoint root
- NodeState baseRoot;
- if (previousRoot == null) {
- baseRoot = targetRoot.getNodeState();
+ String previousCheckpoint = null;
+ for (String checkpoint : getCheckpointNames(sourceSuperRoot)) {
+ NodeState targetPreviousRoot, sourcePreviousRoot;
+ if (previousCheckpoint == null) {
+ sourcePreviousRoot = source.getRoot();
+ targetPreviousRoot = targetRoot.getNodeState();
} else {
- baseRoot = getBuilder(builder, previousRoot).getNodeState();
+ sourcePreviousRoot = getCheckpointRoot(sourceSuperRoot, previousCheckpoint);
+ targetPreviousRoot = getCheckpointRoot(targetSuperRoot.getNodeState(), previousCheckpoint);
}
- NodeBuilder targetParent = getBuilder(builder, checkpoint);
- targetParent.setChildNode("root", baseRoot);
- previousRoot = checkpoint + "/root";
+ NodeState sourceCheckpoint = getCheckpoint(sourceSuperRoot, checkpoint);
+ NodeBuilder targetCheckpoint = getCheckpoint(targetSuperRoot, checkpoint);
- // apply diff changes
- NodeStateCopier.builder()
- .include(checkpoint + "/root")
- .copy(srcSuperRoot, builder);
+ // copy checkpoint metadata
+ NodeStateCopier.copyProperties(sourceCheckpoint, targetCheckpoint);
+ targetCheckpoint.setChildNode("properties", sourceCheckpoint.getChildNode("properties"));
+
+ // create the checkpoint root
+ NodeState sourceCheckpointRoot = sourceCheckpoint.getChildNode("root");
+ NodeBuilder targetCheckpointRoot = targetCheckpoint.setChildNode("root", targetPreviousRoot);
+ sourceCheckpointRoot.compareAgainstBaseState(sourcePreviousRoot, new ApplyDiff(targetCheckpointRoot));
+
+ previousCheckpoint = checkpoint;
}
- targetTarNS.setSuperRoot(builder);
+ targetTarNS.setSuperRoot(targetSuperRoot);
return true;
}
@@ -389,7 +390,7 @@ public class RepositorySidegrade {
* @param superRoot
* @return
*/
- private static List<String> getCheckpointPaths(NodeState superRoot) {
+ private static List<String> getCheckpointNames(NodeState superRoot) {
List<ChildNodeEntry> checkpoints = newArrayList(superRoot.getChildNode("checkpoints").getChildNodeEntries().iterator());
sort(checkpoints, new Comparator<ChildNodeEntry>() {
@Override
@@ -403,16 +404,20 @@ public class RepositorySidegrade {
@Nullable
@Override
public String apply(@Nullable ChildNodeEntry input) {
- return "/checkpoints/" + input.getName();
+ return input.getName();
}
});
}
- private static NodeBuilder getBuilder(NodeBuilder root, String path) {
- NodeBuilder builder = root;
- for (String element : PathUtils.elements(path)) {
- builder = builder.child(element);
- }
- return builder;
+ private static NodeState getCheckpointRoot(NodeState superRoot, String name) {
+ return getCheckpoint(superRoot, name).getChildNode("root");
+ }
+
+ private static NodeState getCheckpoint(NodeState superRoot, String name) {
+ return superRoot.getChildNode("checkpoints").getChildNode(name);
+ }
+
+ private static NodeBuilder getCheckpoint(NodeBuilder superRoot, String name) {
+ return superRoot.child("checkpoints").child(name);
}
}