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;
}