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


Reply via email to