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 js...@apache.org on 2015/10/04 15:18:29 UTC

svn commit: r1706674 - in /jackrabbit/oak/trunk/oak-upgrade: ./ src/main/java/org/apache/jackrabbit/oak/upgrade/ src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/

Author: jsedding
Date: Sun Oct  4 13:18:29 2015
New Revision: 1706674

URL: http://svn.apache.org/viewvc?rev=1706674&view=rev
Log:
OAK-3460 - Progress logging for RepositorySidegrade

- implemented ReportingNodeState wrapper in order to be able to log each NodeState access

Added:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java   (with props)
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java   (with props)
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java   (with props)
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java   (with props)
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java   (with props)
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java   (with props)
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-upgrade/pom.xml
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.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/RepositoryUpgrade.java

Modified: jackrabbit/oak/trunk/oak-upgrade/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/pom.xml?rev=1706674&r1=1706673&r2=1706674&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-upgrade/pom.xml Sun Oct  4 13:18:29 2015
@@ -134,6 +134,12 @@
 
     <!-- Test Dependencies -->
     <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-all</artifactId>
+      <version>1.3</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java?rev=1706674&r1=1706673&r2=1706674&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.java Sun Oct  4 13:18:29 2015
@@ -94,15 +94,6 @@ class JackrabbitNodeState extends Abstra
     private static final Logger log =
             LoggerFactory.getLogger(JackrabbitNodeState.class);
 
-    private static long count = 0;
-
-    private static void logNewNode(JackrabbitNodeState state) {
-        count++;
-        if (count % 10000 == 0) {
-            log.info("Migrating node #" + count + ": " + state.getPath());
-        }
-    }
-
     private JackrabbitNodeState parent;
 
     private final String name;
@@ -210,7 +201,6 @@ class JackrabbitNodeState extends Abstra
         this.nodeStateCache = parent.nodeStateCache;
         setChildOrder();
         fixFrozenUuid();
-        logNewNode(this);
     }
 
     JackrabbitNodeState(
@@ -248,7 +238,6 @@ class JackrabbitNodeState extends Abstra
         } catch (ItemStateException e) {
             throw new IllegalStateException("Unable to access node " + id, e);
         }
-        logNewNode(this);
     }
 
     @Override

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=1706674&r1=1706673&r2=1706674&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 Sun Oct  4 13:18:29 2015
@@ -36,9 +36,13 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.LoggingCompositeHook;
+import org.apache.jackrabbit.oak.upgrade.nodestate.report.LoggingReporter;
+import org.apache.jackrabbit.oak.upgrade.nodestate.report.ReportingNodeState;
 import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier;
 import org.apache.jackrabbit.oak.upgrade.version.VersionCopyConfiguration;
 import org.apache.jackrabbit.oak.upgrade.version.VersionableEditor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.ImmutableSet.copyOf;
@@ -52,6 +56,8 @@ import static org.apache.jackrabbit.oak.
 
 public class RepositorySidegrade {
 
+    private static final Logger LOG = LoggerFactory.getLogger(RepositorySidegrade.class);
+
     /**
      * Target node store.
      */
@@ -207,7 +213,8 @@ public class RepositorySidegrade {
             if (initializer != null) {
                 initializer.initialize(builder);
             }
-            copyState(builder, root);
+
+            copyState(builder, ReportingNodeState.wrap(root, new LoggingReporter(LOG, "Copying", 10000, -1)));
 
             cleanCheckpoints(builder);
         } catch (Exception e) {

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=1706674&r1=1706673&r2=1706674&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 Sun Oct  4 13:18:29 2015
@@ -108,6 +108,8 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.upgrade.nodestate.report.LoggingReporter;
+import org.apache.jackrabbit.oak.upgrade.nodestate.report.ReportingNodeState;
 import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier;
 import org.apache.jackrabbit.oak.upgrade.security.GroupEditorProvider;
 import org.apache.jackrabbit.oak.upgrade.security.RestrictionEditorProvider;
@@ -408,8 +410,11 @@ public class RepositoryUpgrade {
 
             NodeState root = builder.getNodeState();
 
-            final NodeState sourceState = JackrabbitNodeState.createRootNodeState(
-                    source, workspaceName, root, uriToPrefix, copyBinariesByReference, skipOnError);
+            final NodeState sourceState = ReportingNodeState.wrap(
+                    JackrabbitNodeState.createRootNodeState(
+                            source, workspaceName, root, uriToPrefix, copyBinariesByReference, skipOnError),
+                    new LoggingReporter(logger, "Migrating", 10000, -1)
+            );
 
             final Stopwatch watch = Stopwatch.createStarted();
 

Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.slf4j.Logger;
+
+import javax.annotation.Nonnull;
+
+/**
+ * A Reporter implementation that logs every nth node
+ * and/or any nth property to the given logger on {@code info}
+ * level.
+ */
+public class LoggingReporter extends PeriodicReporter {
+
+    private final Logger logger;
+
+    private final String verb;
+
+    /**
+     * Constructor that allows setting the intervals to log node and property
+     * accesses to a given logger.
+     *
+     * @param logger              The logger to log the progress to.
+     * @param nodeLogInterval     Every how many nodes a log message should be written.
+     * @param propertyLogInterval Every how many properties a log message should be written.
+     */
+    public LoggingReporter(final Logger logger, final int nodeLogInterval, final int propertyLogInterval) {
+        this(logger, "Loading", nodeLogInterval, propertyLogInterval);
+    }
+
+    /**
+     * Like {@link #LoggingReporter(Logger, int, int)}, however this constructor allow
+     * to customize the verb of the log message.
+     * <br>
+     * The messages are of the format: "{verb} node #100: /path/to/the/node
+     *
+     * @param logger              The logger to log the progress to.
+     * @param verb                The verb to use for logging.
+     * @param nodeLogInterval     Every how many nodes a log message should be written.
+     * @param propertyLogInterval Every how many properties a log message should be written.
+     */
+    public LoggingReporter(final Logger logger, final String verb, final int nodeLogInterval, final int propertyLogInterval) {
+        super(nodeLogInterval, propertyLogInterval);
+        this.logger = logger;
+        this.verb = verb;
+    }
+
+    @Override
+    protected void reportPeriodicNode(final long count, @Nonnull final ReportingNodeState nodeState) {
+        logger.info("{} node #{}: {}", verb, count, nodeState.getPath());
+    }
+
+    @Override
+    protected void reportPeriodicProperty(final long count, @Nonnull final ReportingNodeState parent, @Nonnull final String propertyName) {
+        logger.info("{} properties #{}: {}", verb, count, PathUtils.concat(parent.getPath(), propertyName));
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import javax.annotation.Nonnull;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Abstract class that simplifies development of a Reporter
+ * that should only report every nth event (node or property seen).
+ */
+public abstract class PeriodicReporter implements Reporter {
+
+    private final int nodeLogInterval;
+
+    private final int propertyLogInterval;
+
+    private AtomicLong nodes = new AtomicLong(0);
+
+    private AtomicLong properties = new AtomicLong(0);
+
+    protected PeriodicReporter(final int nodeLogInterval, final int propertyLogInterval) {
+        this.nodeLogInterval = nodeLogInterval;
+        this.propertyLogInterval = propertyLogInterval;
+    }
+
+    /**
+     * Reset the node and property counts to 0. Inheriting implementations
+     * may reset their own internal state.
+     */
+    protected void reset() {
+        nodes.set(0);
+        properties.set(0);
+    }
+
+    /**
+     * Callback called every nth time a node is accessed.
+     *
+     * @param count The count of reported nodes.
+     * @param nodeState The node that was reported.
+     */
+    protected abstract void reportPeriodicNode(
+            final long count, @Nonnull final ReportingNodeState nodeState);
+
+    /**
+     * Callback called every nth time a property is accessed.
+     *
+     * @param count The count of reported properties.
+     * @param parent The parent node of the reported property.
+     * @param propertyName The name of the reported property.
+     */
+    protected abstract void reportPeriodicProperty(
+            final long count, @Nonnull final ReportingNodeState parent, @Nonnull final String propertyName);
+
+    @Override
+    public final void reportNode(@Nonnull final ReportingNodeState nodeState) {
+        if (nodeLogInterval == -1) {
+            return;
+        }
+
+        final long count = nodes.incrementAndGet();
+        if (count % nodeLogInterval == 0) {
+            reportPeriodicNode(count, nodeState);
+        }
+    }
+
+    @Override
+    public final void reportProperty(@Nonnull final ReportingNodeState parent, @Nonnull final String propertyName) {
+        if (propertyLogInterval == -1) {
+            return;
+        }
+
+        final long count = properties.incrementAndGet();
+        if (count % propertyLogInterval == 0) {
+            reportPeriodicProperty(count, parent, propertyName);
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import javax.annotation.Nonnull;
+
+/**
+ * A {@code Reporter} receives callbacks for every NodeState
+ * and PropertyState that was accessed via a {ReportingNodeState}
+ * instance.
+ */
+public interface Reporter {
+
+    /**
+     * Callback reporting that the given {@code nodeState} was accessed.
+     *
+     * @param nodeState The accessed {@code ReportingNodeState} instance.
+     */
+    void reportNode(@Nonnull final ReportingNodeState nodeState);
+
+    /**
+     * Callback reporting that the property named {@code propertyName}
+     * was accessed on the {@code parent} node.
+     *
+     * @param parent The parent node state of the reported property.
+     * @param propertyName The name of the reported property.
+     */
+    void reportProperty(@Nonnull final ReportingNodeState parent, @Nonnull final String propertyName);
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,306 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
+import org.apache.jackrabbit.oak.spi.state.ReadOnlyBuilder;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * A decoration layer for NodeState instances that intercepts
+ * all accesses to NodeStates and PropertyStates (getters) and
+ * informs a {@link Reporter} via its callbacks that the respective
+ * NodeStates or PropertyStates have been accessed.
+ * <br>
+ * The decoration is deep, i.e. any child NodeStates will be
+ * decorated as well and will report to the same {@code Reporter}
+ * instance.
+ * <br>
+ * For convenience, a {@link PeriodicReporter} abstract class exists.
+ * This simplifies reporting every nth node/property only.
+ * <br>
+ * Note: Multiple accesses to the same node or property are each
+ * reported. Therefore if exactly counting unique accesses is a
+ * requirement, the reporter needs to take care of de-duplication.
+ *
+ * @see Reporter, PeriodicReporter, LoggingReporter
+ */
+public class ReportingNodeState implements NodeState {
+
+    private final ReportingNodeState parent;
+    private final NodeState delegate;
+    private final String name;
+    private final Reporter reporter;
+
+    /**
+     * Allows wrapping a NodeState as a ReportingNodeState. The wrapped
+     * NodeState is treated as the root of a tree (i.e. path is "/").
+     * <br>
+     * Any children accessed via this NodeState are also wrapped. Each
+     * wrapped NodeState is also reported to the provided Reporter.
+     *
+     * @param nodeState The NodeState to be wrapped.
+     * @param reporter The reporter to report to.
+     * @return the wrapped NodeState.
+     */
+    public static NodeState wrap(NodeState nodeState, Reporter reporter) {
+        return wrapAndReport(null, "/", nodeState, reporter);
+    }
+
+    private static NodeState wrapAndReport(@Nullable ReportingNodeState parent, @Nonnull String name,
+                                           @Nonnull NodeState delegate, @Nonnull Reporter reporter) {
+        final ReportingNodeState nodeState = new ReportingNodeState(parent, name, delegate, reporter);
+        reporter.reportNode(nodeState);
+        return nodeState;
+    }
+
+    protected NodeState wrapChild(String name, NodeState delegate) {
+        return wrapAndReport(this, name, delegate, this.reporter);
+    }
+
+    private ReportingNodeState(ReportingNodeState parent, String name, NodeState delegate, Reporter reporter) {
+        this.parent = parent;
+        this.delegate = delegate;
+        this.name = name;
+        this.reporter = reporter;
+    }
+
+    /**
+     * ReportingNodeState instances provide access to their path via their
+     * parent hierarchy. Note that calculating the path on every access may
+     * incur a significant performance penalty.
+     *
+     * @return The path of the ReportingNodeState instance, assuming that
+     *         the first wrapped instance is the root node.
+     */
+    public String getPath() {
+        if (parent == null) {
+            return name;
+        }
+        return PathUtils.concat(parent.getPath(), name);
+    }
+
+    /**
+     * The ReportingNodeState implementation returns a ReadOnlyBuilder, which
+     * will fail for any mutable operation.
+     *
+     * @return a NodeBuilder instance corresponding to this NodeState.
+     */
+    @Override
+    @Nonnull
+    public NodeBuilder builder() {
+        return new ReadOnlyBuilder(this);
+    }
+
+    @Override
+    public boolean compareAgainstBaseState(final NodeState base, final NodeStateDiff diff) {
+        return delegate.compareAgainstBaseState(base, new ReportingDiff(diff, this));
+    }
+
+    /**
+     * Note that any implementation-specific optimizations of wrapped NodeStates
+     * will not work if a ReportingNodeState is passed into their {@code #equals()}
+     * method. This implementation will compare the wrapped NodeState, however. So
+     * optimizations work when calling {@code #equals()} on a ReportingNodeState.
+     *
+     * @param other Object to compare with this NodeState.
+     * @return true if the given object is equal to this NodeState, false otherwise.
+     */
+    @Override
+    public boolean equals(final Object other) {
+        if (other instanceof ReportingNodeState) {
+            return delegate.equals(((ReportingNodeState) other).delegate);
+        } else {
+            return delegate.equals(other);
+        }
+    }
+
+    @Override
+    public boolean exists() {
+        return delegate.exists();
+    }
+
+    @Override
+    public boolean hasChildNode(@Nonnull final String name) {
+        return delegate.hasChildNode(name);
+    }
+
+    @Override
+    @Nonnull
+    public NodeState getChildNode(@Nonnull final String name) throws IllegalArgumentException {
+        return wrapChild(name, delegate.getChildNode(name));
+    }
+
+    @Override
+    public long getChildNodeCount(final long max) {
+        return delegate.getChildNodeCount(max);
+    }
+
+    @Override
+    public Iterable<String> getChildNodeNames() {
+        return delegate.getChildNodeNames();
+    }
+
+    @Override
+    @Nonnull
+    public Iterable<? extends ChildNodeEntry> getChildNodeEntries() {
+        return Iterables.transform(
+                delegate.getChildNodeEntries(),
+                new Function<ChildNodeEntry, ChildNodeEntry>() {
+                    @Override
+                    @Nonnull
+                    public ChildNodeEntry apply(final ChildNodeEntry childNodeEntry) {
+                        final String name = childNodeEntry.getName();
+                        return new MemoryChildNodeEntry(name, wrapChild(name, childNodeEntry.getNodeState()));
+                    }
+                }
+        );
+    }
+
+    @Override
+    public boolean hasProperty(@Nonnull final String name) {
+        return delegate.hasProperty(name);
+    }
+
+    @Override
+    public boolean getBoolean(@Nonnull final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getBoolean(name);
+    }
+
+    @Override
+    public long getLong(final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getLong(name);
+    }
+
+    @Override
+    @CheckForNull
+    public String getName(@Nonnull final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getName(name);
+    }
+
+    @Override
+    @Nonnull
+    public Iterable<String> getNames(@Nonnull final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getNames(name);
+    }
+
+
+    @Override
+    @CheckForNull
+    public String getString(final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getString(name);
+    }
+
+    @Override
+    @Nonnull
+    public Iterable<String> getStrings(@Nonnull final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getStrings(name);
+    }
+
+    @Override
+    @CheckForNull
+    public PropertyState getProperty(@Nonnull final String name) {
+        reporter.reportProperty(this, name);
+        return delegate.getProperty(name);
+    }
+
+    @Override
+    public long getPropertyCount() {
+        return delegate.getPropertyCount();
+    }
+
+    @Override
+    @Nonnull
+    public Iterable<? extends PropertyState> getProperties() {
+        return Iterables.transform(
+                delegate.getProperties(),
+                new Function<PropertyState, PropertyState>() {
+                    @Override
+                    @Nonnull
+                    public PropertyState apply(final PropertyState propertyState) {
+                        reporter.reportProperty(ReportingNodeState.this, propertyState.getName());
+                        return propertyState;
+                    }
+                }
+        );
+    }
+
+    @Override
+    public String toString() {
+        return "ReportingNodeState{" + getPath() + ", " + super.toString() + "}";
+    }
+
+    private static class ReportingDiff implements NodeStateDiff {
+
+        private final NodeStateDiff diff;
+        private ReportingNodeState parent;
+
+        public ReportingDiff(NodeStateDiff diff, ReportingNodeState parent) {
+            this.diff = diff;
+            this.parent = parent;
+        }
+
+        @Override
+        public boolean childNodeAdded(final String name, final NodeState after) {
+            return diff.childNodeAdded(name, parent.wrapChild(name, after));
+        }
+
+        @Override
+        public boolean childNodeChanged(final String name, final NodeState before, final NodeState after) {
+            return diff.childNodeChanged(name, before, parent.wrapChild(name, after));
+        }
+
+        @Override
+        public boolean childNodeDeleted(final String name, final NodeState before) {
+            return diff.childNodeDeleted(name, before);
+        }
+
+        @Override
+        public boolean propertyAdded(final PropertyState after) {
+            return diff.propertyAdded(after);
+        }
+
+        @Override
+        public boolean propertyChanged(final PropertyState before, final PropertyState after) {
+            return diff.propertyChanged(before, after);
+        }
+
+        @Override
+        public boolean propertyDeleted(final PropertyState before) {
+            return diff.propertyDeleted(before);
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+
+import javax.annotation.Nonnull;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.any;
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.anything;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.collection.IsMapContaining.hasEntry;
+
+class AssertingPeriodicReporter extends PeriodicReporter {
+
+    private final Map<Long, String> reportedNodes = new HashMap<Long, String>();
+
+    private final Map<Long, String> reportedProperties = new HashMap<Long, String>();
+
+    public AssertingPeriodicReporter(final int nodeLogInterval, final int propertyLogInterval) {
+        super(nodeLogInterval, propertyLogInterval);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        reportedNodes.clear();
+        reportedProperties.clear();
+    }
+
+    @Override
+    protected void reportPeriodicNode(final long count, @Nonnull final ReportingNodeState nodeState) {
+        reportedNodes.put(count, nodeState.getPath());
+    }
+
+    @Override
+    protected void reportPeriodicProperty(final long count, @Nonnull final ReportingNodeState parent, @Nonnull final String propertyName) {
+        reportedProperties.put(count, PathUtils.concat(parent.getPath(), propertyName));
+    }
+
+    @Override
+    public String toString() {
+        return "Reported{ nodes: " + reportedNodes + " properties: " + reportedProperties + "}";
+    }
+
+    public static Matcher<AssertingPeriodicReporter> hasReportedNode(final int count, final String path) {
+        return hasReports(hasEntry((long) count, path), whatever());
+    }
+
+    public static Matcher<AssertingPeriodicReporter> hasReportedNode(final int count, final Matcher<String> pathMatcher) {
+        return hasReports(hasEntry(equalTo((long) count), pathMatcher), whatever());
+    }
+
+    public static Matcher<AssertingPeriodicReporter> hasReportedNodes(final String... paths) {
+        final List<Matcher<? super AssertingPeriodicReporter>> matchers =
+                new ArrayList<Matcher<? super AssertingPeriodicReporter>>();
+        for (final String path : paths) {
+            matchers.add(hasReports(hasEntry(any(Long.class), equalTo(path)), whatever()));
+        }
+        return allOf(matchers);
+    }
+
+    public static Matcher<AssertingPeriodicReporter> hasReportedProperty(final int count, final String path) {
+        return hasReports(whatever(), hasEntry((long) count, path));
+    }
+
+    public static Matcher<AssertingPeriodicReporter> hasReportedProperty(final int count, final Matcher<String> pathMatcher) {
+        return hasReports(whatever(), hasEntry(equalTo((long) count), pathMatcher));
+    }
+
+    public static Matcher<AssertingPeriodicReporter> hasReportedProperty(final String... paths) {
+        final List<Matcher<? super String>> pathMatchers = new ArrayList<Matcher<? super String>>();
+        for (final String path : paths) {
+            pathMatchers.add(equalTo(path));
+        }
+        return hasReports(whatever(), hasEntry(any(Long.class), allOf(pathMatchers)));
+    }
+
+    private static Matcher<Map<? extends Long, ? extends String>> whatever() {
+        return anyOf(
+            hasEntry(any(Long.class), any(String.class)),
+            anything()
+        );
+    }
+
+    private static Matcher<AssertingPeriodicReporter> hasReports(
+            final Matcher<Map<? extends Long, ? extends String>> nodeMapMatcher,
+            final Matcher<Map<? extends Long, ? extends String>> propertyMapMatcher) {
+
+        return new org.hamcrest.TypeSafeMatcher<AssertingPeriodicReporter>() {
+            @Override
+            protected boolean matchesSafely(final AssertingPeriodicReporter reporter) {
+                final boolean nodesMatch = nodeMapMatcher.matches(reporter.reportedNodes);
+                final boolean propertiesMatch = propertyMapMatcher.matches(reporter.reportedProperties);
+                return nodesMatch && propertiesMatch;
+            }
+
+            @Override
+            public void describeTo(final Description description) {
+                description
+                        .appendText("Reported{ nodes: ")
+                        .appendDescriptionOf(nodeMapMatcher)
+                        .appendText(", properties: ")
+                        .appendDescriptionOf(propertyMapMatcher);
+
+            }
+        };
+    }
+
+    private static Matcher<AssertingPeriodicReporter> hasPropertyMapContaining(
+            final Matcher<Map<? extends Long, ? extends String>> mapMatcher) {
+
+        return new org.hamcrest.TypeSafeMatcher<AssertingPeriodicReporter>() {
+            @Override
+            protected boolean matchesSafely(final AssertingPeriodicReporter reporter) {
+                return mapMatcher.matches(reporter.reportedProperties);
+            }
+
+            @Override
+            public void describeTo(final Description description) {
+                description
+                        .appendText("Has reported properties ")
+                        .appendDescriptionOf(mapMatcher);
+            }
+        };
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.junit.Test;
+
+import static org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter.hasReportedNode;
+import static org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter.hasReportedProperty;
+import static org.junit.Assert.assertThat;
+
+public class PeriodicReporterTest {
+
+    @Test
+    public void callbackEveryTenNodes() {
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(10, -1);
+        final NodeState counter = ReportingNodeState.wrap(EmptyNodeState.EMPTY_NODE, reporter)
+                .getChildNode("counter");
+
+        reporter.reset();
+        for (int i = 1; i < 40; i++) {
+            counter.getChildNode(Integer.toString(i));
+        }
+
+        assertThat(reporter, hasReportedNode(10, "/counter/10"));
+        assertThat(reporter, hasReportedNode(20, "/counter/20"));
+        assertThat(reporter, hasReportedNode(30, "/counter/30"));
+    }
+
+    @Test
+    public void callbackEveryTenProperties() {
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(-1, 10);
+        final NodeState counter = ReportingNodeState.wrap(EmptyNodeState.EMPTY_NODE, reporter)
+                .getChildNode("counter");
+
+        reporter.reset();
+        for (int i = 1; i < 40; i++) {
+            counter.getProperty(Integer.toString(i));
+        }
+
+        assertThat(reporter, hasReportedProperty(10, "/counter/10"));
+        assertThat(reporter, hasReportedProperty(20, "/counter/20"));
+        assertThat(reporter, hasReportedProperty(30, "/counter/30"));
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java?rev=1706674&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java Sun Oct  4 13:18:29 2015
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.upgrade.nodestate.report;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.upgrade.util.NodeStateTestUtils;
+import org.junit.Test;
+
+import static org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter.hasReportedNode;
+import static org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter.hasReportedNodes;
+import static org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter.hasReportedProperty;
+import static org.hamcrest.CoreMatchers.any;
+import static org.junit.Assert.assertThat;
+
+public class ReportingNodeStateTest {
+
+    @Test
+    public void getChildNodeReportsNode() {
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(10, 10);
+        final NodeState nodeState = ReportingNodeState.wrap(EmptyNodeState.EMPTY_NODE, reporter);
+
+        reporter.reset();
+        for (int i = 1; i <= 20; i++) {
+            nodeState.getChildNode("a" + i);
+        }
+
+        assertThat(reporter, hasReportedNode(10, "/a10"));
+        assertThat(reporter, hasReportedNode(20, "/a20"));
+    }
+
+    @Test
+    public void getChildNodeEntriesReportsNode() {
+        final NodeBuilder builder = EmptyNodeState.EMPTY_NODE.builder();
+        for (int i = 1; i < 20; i++) {
+            builder.child("a" + i);
+        }
+
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(10, 10);
+        final NodeState nodeState = ReportingNodeState.wrap(builder.getNodeState(), reporter);
+
+        reporter.reset();
+        int counter = 0;
+        String name = "<none>";
+        for (final ChildNodeEntry child : nodeState.getChildNodeEntries()) {
+            if (++counter == 10) {
+                name = child.getName();
+                break;
+            }
+        }
+
+        assertThat(reporter, hasReportedNode(10, "/" + name));
+    }
+
+    @Test
+    public void getPropertyReportsProperty() {
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(10, 10);
+        final NodeState nodeState = ReportingNodeState.wrap(EmptyNodeState.EMPTY_NODE, reporter);
+
+        reporter.reset();
+        final String name = "a";
+        for (int i = 0; i < 3; i++) {
+            // 3 * 7 property requests = 21
+            nodeState.getProperty(name);
+            nodeState.getBoolean(name);
+            nodeState.getLong(name);
+            nodeState.getString(name);
+            nodeState.getStrings(name);
+            nodeState.getName(name);
+            nodeState.getNames(name);
+        }
+
+        assertThat(reporter, hasReportedProperty(10, "/a"));
+        assertThat(reporter, hasReportedProperty(20, "/a"));
+    }
+
+    @Test
+    public void getPropertiesReportsProperty() {
+        final NodeBuilder builder = EmptyNodeState.EMPTY_NODE.builder();
+        for (int i = 0; i < 20; i++) {
+            builder.setProperty("a" + i, "foo");
+        }
+
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(10, 10);
+        final NodeState nodeState = ReportingNodeState.wrap(builder.getNodeState(), reporter);
+
+        reporter.reset();
+        int counter = 0;
+        for (final PropertyState property : nodeState.getProperties()) {
+            if (++counter == 10) {
+                break;
+            }
+        }
+
+        assertThat(reporter, hasReportedProperty(10, any(String.class)));
+    }
+
+    @Test
+    public void compareAgainstBaseState() {
+        final NodeBuilder root = EmptyNodeState.EMPTY_NODE.builder();
+        root.child("a").child("aa");
+
+        final NodeState before = root.getNodeState();
+
+        root.child("a").child("ab");
+        root.child("b");
+
+        final AssertingPeriodicReporter reporter = new AssertingPeriodicReporter(1, -1);
+        final NodeState after = ReportingNodeState.wrap(root.getNodeState(), reporter);
+
+        reporter.reset();
+        NodeStateTestUtils.expectDifference()
+                .childNodeAdded(
+                        "/a/ab",
+                        "/b"
+                )
+                .childNodeChanged(
+                        "/a"
+                )
+                .strict()
+                .verify(before, after);
+
+        assertThat(reporter, hasReportedNodes("/a", "/a/ab", "/b"));
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java
------------------------------------------------------------------------------
    svn:eol-style = native




Re: svn commit: r1706674 - in /jackrabbit/oak/trunk/oak-upgrade: ./ src/main/java/org/apache/jackrabbit/oak/upgrade/ src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/

Posted by Julian Sedding <js...@gmail.com>.
Java 6 failed to infer some generic argument types. Fixed in
https://svn.apache.org/r1706797

Regards
Julian

On Mon, Oct 5, 2015 at 12:09 PM, Julian Sedding <js...@gmail.com> wrote:
> Thanks for alerting me. I'll take a look.
>
> Regards
> Julian
>
> On Mon, Oct 5, 2015 at 12:06 PM, Michael Dürig <md...@apache.org> wrote:
>>
>> Hi,
>>
>> I just noted that this won't compile on Java 1.6 [1]. Julian, could you have
>> a look?
>>
>> OTOH, do we still need/want to support Java 1.6? Let's discuss this in
>> another thread.
>>
>> Michael
>>
>>
>> [1] [ERROR] /jenkins/workspace/Apache Jackrabbit Oak
>> matrix/jdk/jdk-1.6u45/label/Ubuntu/nsfixtures/SEGMENT_MK/profile/unittesting/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java:[75,15]
>> hasReports(org.hamcrest.Matcher<java.util.Map<? extends java.lang.Long,?
>> extends java.lang.String>>,org.hamcrest.Matcher<java.util.Map<? extends
>> java.lang.Long,? extends java.lang.String>>) in
>> org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter
>> cannot be applied to (org.hamcrest.Matcher<java.util.Map<? extends
>> java.lang.Object,? extends
>> java.lang.Object>>,org.hamcrest.Matcher<java.util.Map<? extends
>> java.lang.Long,? extends java.lang.String>>)
>>
>>
>>
>>
>>
>> On 4.10.15 3:18 , jsedding@apache.org wrote:
>>>
>>> Author: jsedding
>>> Date: Sun Oct  4 13:18:29 2015
>>> New Revision: 1706674
>>>
>>> URL:http://svn.apache.org/viewvc?rev=1706674&view=rev
>>> Log:
>>> OAK-3460 - Progress logging for RepositorySidegrade
>>>
>>> - implemented ReportingNodeState wrapper in order to be able to log each
>>> NodeState access
>>>
>>> Added:
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
>>> (with props)
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
>>> (with props)
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java
>>> (with props)
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java
>>> (with props)
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java
>>> (with props)
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java
>>> (with props)
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java
>>> (with props)
>>> Modified:
>>>      jackrabbit/oak/trunk/oak-upgrade/pom.xml
>>>
>>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.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/RepositoryUpgrade.java
>>
>>

Re: svn commit: r1706674 - in /jackrabbit/oak/trunk/oak-upgrade: ./ src/main/java/org/apache/jackrabbit/oak/upgrade/ src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/

Posted by Julian Sedding <js...@gmail.com>.
Thanks for alerting me. I'll take a look.

Regards
Julian

On Mon, Oct 5, 2015 at 12:06 PM, Michael Dürig <md...@apache.org> wrote:
>
> Hi,
>
> I just noted that this won't compile on Java 1.6 [1]. Julian, could you have
> a look?
>
> OTOH, do we still need/want to support Java 1.6? Let's discuss this in
> another thread.
>
> Michael
>
>
> [1] [ERROR] /jenkins/workspace/Apache Jackrabbit Oak
> matrix/jdk/jdk-1.6u45/label/Ubuntu/nsfixtures/SEGMENT_MK/profile/unittesting/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java:[75,15]
> hasReports(org.hamcrest.Matcher<java.util.Map<? extends java.lang.Long,?
> extends java.lang.String>>,org.hamcrest.Matcher<java.util.Map<? extends
> java.lang.Long,? extends java.lang.String>>) in
> org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter
> cannot be applied to (org.hamcrest.Matcher<java.util.Map<? extends
> java.lang.Object,? extends
> java.lang.Object>>,org.hamcrest.Matcher<java.util.Map<? extends
> java.lang.Long,? extends java.lang.String>>)
>
>
>
>
>
> On 4.10.15 3:18 , jsedding@apache.org wrote:
>>
>> Author: jsedding
>> Date: Sun Oct  4 13:18:29 2015
>> New Revision: 1706674
>>
>> URL:http://svn.apache.org/viewvc?rev=1706674&view=rev
>> Log:
>> OAK-3460 - Progress logging for RepositorySidegrade
>>
>> - implemented ReportingNodeState wrapper in order to be able to log each
>> NodeState access
>>
>> Added:
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java
>> (with props)
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java
>> (with props)
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java
>> (with props)
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java
>> (with props)
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java
>> (with props)
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java
>> (with props)
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java
>> (with props)
>> Modified:
>>      jackrabbit/oak/trunk/oak-upgrade/pom.xml
>>
>> jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.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/RepositoryUpgrade.java
>
>

Re: svn commit: r1706674 - in /jackrabbit/oak/trunk/oak-upgrade: ./ src/main/java/org/apache/jackrabbit/oak/upgrade/ src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/

Posted by Michael Dürig <md...@apache.org>.
Hi,

I just noted that this won't compile on Java 1.6 [1]. Julian, could you 
have a look?

OTOH, do we still need/want to support Java 1.6? Let's discuss this in 
another thread.

Michael


[1] [ERROR] /jenkins/workspace/Apache Jackrabbit Oak 
matrix/jdk/jdk-1.6u45/label/Ubuntu/nsfixtures/SEGMENT_MK/profile/unittesting/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java:[75,15] 
hasReports(org.hamcrest.Matcher<java.util.Map<? extends java.lang.Long,? 
extends java.lang.String>>,org.hamcrest.Matcher<java.util.Map<? extends 
java.lang.Long,? extends java.lang.String>>) in 
org.apache.jackrabbit.oak.upgrade.nodestate.report.AssertingPeriodicReporter 
cannot be applied to (org.hamcrest.Matcher<java.util.Map<? extends 
java.lang.Object,? extends 
java.lang.Object>>,org.hamcrest.Matcher<java.util.Map<? extends 
java.lang.Long,? extends java.lang.String>>)




On 4.10.15 3:18 , jsedding@apache.org wrote:
> Author: jsedding
> Date: Sun Oct  4 13:18:29 2015
> New Revision: 1706674
>
> URL:http://svn.apache.org/viewvc?rev=1706674&view=rev
> Log:
> OAK-3460 - Progress logging for RepositorySidegrade
>
> - implemented ReportingNodeState wrapper in order to be able to log each NodeState access
>
> Added:
>      jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
>      jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/LoggingReporter.java   (with props)
>      jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporter.java   (with props)
>      jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/Reporter.java   (with props)
>      jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeState.java   (with props)
>      jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/
>      jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/AssertingPeriodicReporter.java   (with props)
>      jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/PeriodicReporterTest.java   (with props)
>      jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/nodestate/report/ReportingNodeStateTest.java   (with props)
> Modified:
>      jackrabbit/oak/trunk/oak-upgrade/pom.xml
>      jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/JackrabbitNodeState.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/RepositoryUpgrade.java