Author: tomekr Date: Thu Jun 21 11:49:56 2018 New Revision: 1833999 URL: http://svn.apache.org/viewvc?rev=1833999&view=rev Log: OAK-7567: Migrating an unmodified checkpoint takes a long time
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/FilteringNodeState.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/report/ReportingNodeState.java 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/nodestate/MetadataExposingNodeState.java jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java?rev=1833999&r1=1833998&r2=1833999&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java Thu Jun 21 11:49:56 2018 @@ -37,6 +37,8 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import static com.google.common.base.Predicates.notNull; import static org.apache.jackrabbit.oak.plugins.tree.TreeConstants.OAK_CHILD_ORDER; @@ -45,8 +47,11 @@ public abstract class AbstractDecoratedN protected final NodeState delegate; - protected AbstractDecoratedNodeState(@Nonnull final NodeState delegate) { + private final boolean useNativeEquals; + + protected AbstractDecoratedNodeState(@Nonnull final NodeState delegate, boolean useNativeEquals) { this.delegate = delegate; + this.useNativeEquals = useNativeEquals; } public NodeState getDelegate() { @@ -198,21 +203,57 @@ public abstract class AbstractDecoratedN */ @Override public boolean equals(final Object other) { - if (other == null) { + if (!(other instanceof NodeState)) { return false; } - if (this.getClass() == other.getClass()) { - final AbstractDecoratedNodeState o = (AbstractDecoratedNodeState) other; - return delegate.equals(o.delegate); + if (useNativeEquals) { + if (this.getClass() == other.getClass()) { + final AbstractDecoratedNodeState o = (AbstractDecoratedNodeState) other; + return delegate.equals(o.delegate); + } } - return delegate.equals(other); + return AbstractDecoratedNodeState.equals(this, (NodeState) other); } @Override public boolean compareAgainstBaseState(final NodeState base, final NodeStateDiff diff) { - return AbstractNodeState.compareAgainstBaseState(this, base, new DecoratingDiff(diff, this)); + NodeStateDiff decoratingDiff = new DecoratingDiff(diff, this); + + if (!comparePropertiesAgainstBaseState(this, base, decoratingDiff)) { + return false; + } + + Set<String> baseChildNodes = new HashSet<String>(); + for (ChildNodeEntry beforeCNE : base.getChildNodeEntries()) { + String name = beforeCNE.getName(); + NodeState beforeChild = beforeCNE.getNodeState(); + NodeState afterChild = this.getChildNode(name); + if (!afterChild.exists()) { + if (!decoratingDiff.childNodeDeleted(name, beforeChild)) { + return false; + } + } else { + baseChildNodes.add(name); + if (!afterChild.equals(beforeChild)) { // TODO: fastEquals? + if (!decoratingDiff.childNodeChanged(name, beforeChild, afterChild)) { + return false; + } + } + } + } + + for (ChildNodeEntry afterChild : this.getChildNodeEntries()) { + String name = afterChild.getName(); + if (!baseChildNodes.contains(name)) { + if (!decoratingDiff.childNodeAdded(name, afterChild.getNodeState())) { + return false; + } + } + } + + return true; } private static class DecoratingDiff implements NodeStateDiff { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/FilteringNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/FilteringNodeState.java?rev=1833999&r1=1833998&r2=1833999&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/FilteringNodeState.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/FilteringNodeState.java Thu Jun 21 11:49:56 2018 @@ -110,7 +110,7 @@ public class FilteringNodeState extends @Nonnull final Set<String> fragmentPaths, @Nonnull final Set<String> excludedFragments ) { - super(delegate); + super(delegate, false); this.path = path; this.includedPaths = includedPaths; this.excludedPaths = excludedPaths; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/report/ReportingNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/report/ReportingNodeState.java?rev=1833999&r1=1833998&r2=1833999&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/report/ReportingNodeState.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/report/ReportingNodeState.java Thu Jun 21 11:49:56 2018 @@ -77,7 +77,7 @@ public class ReportingNodeState extends } private ReportingNodeState(ReportingNodeState parent, String name, NodeState delegate, Reporter reporter) { - super(delegate); + super(delegate, true); this.parent = parent; this.name = name; this.reporter = reporter; 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=1833999&r1=1833998&r2=1833999&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 Thu Jun 21 11:49:56 2018 @@ -335,16 +335,18 @@ public class RepositorySidegrade { Map<String, String> checkpointInfo = source.checkpointInfo(checkpoint.getName()); boolean tracePaths; + boolean showDiff = false; if (previousRoot == initialRoot) { LOG.info("Migrating first checkpoint: {}", checkpoint.getName()); tracePaths = true; } else { LOG.info("Applying diff to {}", checkpoint.getName()); + showDiff = true; tracePaths = false; } LOG.info("Checkpoint expiry time: {}, metadata: {}", checkpoint.getExpiryTime(), checkpointInfo); - targetRoot = copyDiffToTarget(previousRoot, checkpointRoot, targetRoot, tracePaths); + targetRoot = copyDiffToTarget(previousRoot, checkpointRoot, targetRoot, tracePaths, showDiff); previousRoot = checkpointRoot; String newCheckpointName = target.checkpoint(checkpoint.getExpiryTime() - System.currentTimeMillis(), checkpointInfo); @@ -356,15 +358,17 @@ public class RepositorySidegrade { NodeState sourceRoot = source.getRoot(); boolean tracePaths; + boolean showDiff = false; if (previousRoot == initialRoot) { LOG.info("No checkpoints found; migrating head"); tracePaths = true; } else { LOG.info("Applying diff to head"); tracePaths = false; + showDiff = true; } - targetRoot = copyDiffToTarget(previousRoot, sourceRoot, targetRoot, tracePaths); + targetRoot = copyDiffToTarget(previousRoot, sourceRoot, targetRoot, tracePaths, showDiff); LOG.info("Rewriting checkpoint names in /:async {}", nameToRevision); NodeBuilder targetBuilder = targetRoot.builder(); @@ -388,8 +392,7 @@ public class RepositorySidegrade { return true; } - private NodeState copyDiffToTarget(NodeState before, NodeState after, NodeState targetRoot, boolean tracePaths) throws IOException, CommitFailedException { - + private NodeState copyDiffToTarget(NodeState before, NodeState after, NodeState targetRoot, boolean tracePaths, boolean showDiff) throws IOException, CommitFailedException { NodeBuilder targetBuilder = targetRoot.builder(); if (targetFileStore == null) { NodeState currentRoot = wrapNodeState(after, tracePaths, true); Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/MetadataExposingNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/MetadataExposingNodeState.java?rev=1833999&r1=1833998&r2=1833999&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/MetadataExposingNodeState.java (original) +++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/MetadataExposingNodeState.java Thu Jun 21 11:49:56 2018 @@ -35,7 +35,7 @@ public class MetadataExposingNodeState e private final List<PropertyState> metadataProperties; public MetadataExposingNodeState(AbstractDocumentNodeState documentNodeState) { - super(documentNodeState); + super(documentNodeState, true); metadataProperties = new ArrayList<>(2); if (PathUtils.denotesRoot(documentNodeState.getPath())) { Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java?rev=1833999&r1=1833998&r2=1833999&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java (original) +++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/NameFilteringNodeState.java Thu Jun 21 11:49:56 2018 @@ -42,7 +42,7 @@ public class NameFilteringNodeState exte } private NameFilteringNodeState(final NodeState delegate, NameFilteringNodeState parent, String name) { - super(delegate); + super(delegate, false); this.parent = parent; this.name = name; }