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 mr...@apache.org on 2018/07/09 11:59:10 UTC

svn commit: r1835414 - in /jackrabbit/oak/trunk/oak-store-document/src: main/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/

Author: mreutegg
Date: Mon Jul  9 11:59:10 2018
New Revision: 1835414

URL: http://svn.apache.org/viewvc?rev=1835414&view=rev
Log:
OAK-7617: Metric for DocumentNodeStore lease update

Modified:
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStats.java
    jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollector.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollectorIT.java
    jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsTest.java

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1835414&r1=1835413&r2=1835414&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java Mon Jul  9 11:59:10 2018
@@ -24,6 +24,7 @@ import static com.google.common.collect.
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Lists.reverse;
 import static java.util.Collections.singletonList;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.jackrabbit.oak.api.CommitFailedException.OAK;
@@ -70,6 +71,7 @@ import javax.management.NotCompliantMBea
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
+import com.google.common.base.Stopwatch;
 import com.google.common.base.Strings;
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
@@ -2113,7 +2115,12 @@ public final class DocumentNodeStore
      * @return {@code true} if the lease was renewed; {@code false} otherwise.
      */
     boolean renewClusterIdLease() {
-        return clusterNodeInfo.renewLease();
+        Stopwatch sw = Stopwatch.createStarted();
+        boolean renewed = clusterNodeInfo.renewLease();
+        if (renewed) {
+            nodeStoreStatsCollector.doneLeaseUpdate(sw.elapsed(MICROSECONDS));
+        }
+        return renewed;
     }
 
     /**

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStats.java?rev=1835414&r1=1835413&r2=1835414&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStats.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStats.java Mon Jul  9 11:59:10 2018
@@ -45,6 +45,8 @@ public class DocumentNodeStoreStats impl
     static final String BGW_NUM_WRITES_RATE = "DOCUMENT_NS_BGW_NUM_WRITE_RATE";
     private static final String BGW_TOTAL = "DOCUMENT_NS_BGW_TOTAL_TIME";
 
+    static final String LEASE_UPDATE = "DOCUMENT_NS_LEASE_UPDATE";
+
     private static final String MERGE_SUCCESS_NUM_RETRY = "DOCUMENT_NS_MERGE_SUCCESS_RETRY";
     static final String MERGE_SUCCESS_COUNT = "DOCUMENT_NS_MERGE_SUCCESS_COUNT";
     private static final String MERGE_SUCCESS_TIME = "DOCUMENT_NS_MERGE_SUCCESS_TIME";
@@ -55,6 +57,7 @@ public class DocumentNodeStoreStats impl
     static final String BRANCH_COMMIT_COUNT = "DOCUMENT_NS_BRANCH_COMMIT_COUNT";
     static final String MERGE_BRANCH_COMMIT_COUNT = "DOCUMENT_NS_MERGE_BRANCH_COMMIT_COUNT";
 
+    // background read
     private final TimerStats readHead;
     private final TimerStats readCacheInvalidate;
     private final TimerStats readDiffCache;
@@ -64,6 +67,7 @@ public class DocumentNodeStoreStats impl
     private final MeterStats numChangesRate;
     private final HistogramStats numChangesHisto;
 
+    // background update
     private final TimerStats writeClean;
     private final TimerStats writeSplit;
     private final TimerStats writeSweep;
@@ -72,6 +76,10 @@ public class DocumentNodeStoreStats impl
     private final TimerStats writeTotal;
     private final MeterStats numWritesRate;
 
+    // lease update
+    private final TimerStats leaseUpdate;
+
+    // merge stats
     private final HistogramStats mergeSuccessRetries;
     private final MeterStats mergeSuccessRate;
     private final TimerStats mergeSuccessTime;
@@ -79,6 +87,7 @@ public class DocumentNodeStoreStats impl
     private final MeterStats mergeSuccessSuspended;
     private final MeterStats mergeFailedExclusive;
 
+    // branch stats
     private final MeterStats branchCommitRate;
     private final MeterStats mergeBranchCommitRate;
 
@@ -101,6 +110,8 @@ public class DocumentNodeStoreStats impl
         writeNum = sp.getHistogram(BGW_NUM, StatsOptions.METRICS_ONLY);
         numWritesRate = sp.getMeter(BGW_NUM_WRITES_RATE, StatsOptions.DEFAULT); //Enable time series
 
+        leaseUpdate = sp.getTimer(LEASE_UPDATE, StatsOptions.METRICS_ONLY);
+
         mergeSuccessRetries = sp.getHistogram(MERGE_SUCCESS_NUM_RETRY, StatsOptions.METRICS_ONLY);
         mergeSuccessRate = sp.getMeter(MERGE_SUCCESS_COUNT, StatsOptions.DEFAULT); //Enable time series
         mergeSuccessTime = sp.getTimer(MERGE_SUCCESS_TIME, StatsOptions.METRICS_ONLY);
@@ -141,6 +152,11 @@ public class DocumentNodeStoreStats impl
     }
 
     @Override
+    public void doneLeaseUpdate(long timeMicros) {
+        leaseUpdate.update(timeMicros, TimeUnit.MICROSECONDS);
+    }
+
+    @Override
     public void doneBranchCommit() {
         branchCommitRate.mark();
     }
@@ -166,7 +182,7 @@ public class DocumentNodeStoreStats impl
     }
 
     @Override
-    public void failedMerge(int numRetries, long time, boolean suspended, boolean exclusive) {
+    public void failedMerge(int numRetries, long timeMillis, boolean suspended, boolean exclusive) {
         if (exclusive){
             mergeFailedExclusive.mark();
         }

Modified: jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollector.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollector.java?rev=1835414&r1=1835413&r2=1835414&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollector.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollector.java Mon Jul  9 11:59:10 2018
@@ -20,15 +20,57 @@
 package org.apache.jackrabbit.oak.plugins.document;
 
 public interface DocumentNodeStoreStatsCollector {
+
+    /**
+     * Report to the collector that a background read was done.
+     *
+     * @param stats the stats for the background read operation.
+     */
     void doneBackgroundRead(BackgroundReadStats stats);
 
+    /**
+     * Report to the collector that a background update was done.
+     *
+     * @param stats the stats for the background update operation.
+     */
     void doneBackgroundUpdate(BackgroundWriteStats stats);
 
+    /**
+     * Report to the collector that a lease update was done.
+     *
+     * @param timeMicros the time in microseconds it took to update the lease.
+     */
+    void doneLeaseUpdate(long timeMicros);
+
+    /**
+     * Report to the collector that a branch commit was done.
+     */
     void doneBranchCommit();
 
+    /**
+     * Report to the collector that a branch was merged.
+     *
+     * @param numCommits the number of branch commits merged.
+     */
     void doneMergeBranch(int numCommits);
 
-    void doneMerge(int numRetries, long time, boolean suspended, boolean exclusive);
-
-    void failedMerge(int numRetries, long time, boolean suspended, boolean exclusive);
+    /**
+     * Reports to the collector that a merge was done.
+     *
+     * @param numRetries the number of retries that were necessary.
+     * @param timeMillis the time in milliseconds it took to merge the changes.
+     * @param suspended whether the merge had to be suspended.
+     * @param exclusive whether the merge was holding an exclusive lock.
+     */
+    void doneMerge(int numRetries, long timeMillis, boolean suspended, boolean exclusive);
+
+    /**
+     * Reports to the collector that a merge failed.
+     *
+     * @param numRetries the number of retries that were done.
+     * @param timeMillis the time in milliseconds it took to attempt the merge.
+     * @param suspended whether the merge had to be suspended.
+     * @param exclusive whether the merge was holding an exclusive lock.
+     */
+    void failedMerge(int numRetries, long timeMillis, boolean suspended, boolean exclusive);
 }

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollectorIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollectorIT.java?rev=1835414&r1=1835413&r2=1835414&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollectorIT.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsCollectorIT.java Mon Jul  9 11:59:10 2018
@@ -26,11 +26,14 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.stats.Clock;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
 import static org.apache.jackrabbit.oak.plugins.document.TestUtils.merge;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
@@ -46,11 +49,18 @@ public class DocumentNodeStoreStatsColle
 
     private DocumentNodeStoreStatsCollector statsCollector = mock(DocumentNodeStoreStatsCollector.class);
 
+    private Clock clock;
+
     private DocumentNodeStore nodeStore;
 
     @Before
-    public void setUp(){
+    public void setUp() throws Exception {
+        clock = new Clock.Virtual();
+        clock.waitUntil(System.currentTimeMillis());
+        Revision.setClock(clock);
+        ClusterNodeInfo.setClock(clock);
         nodeStore = builderProvider.newBuilder()
+                .clock(clock)
                 .setAsyncDelay(0)
                 .setNodeStoreStatsCollector(statsCollector)
                 .setUpdateLimit(10)
@@ -59,14 +69,20 @@ public class DocumentNodeStoreStatsColle
         nodeStore.setMaxBackOffMillis(0);
     }
 
+    @AfterClass
+    public static void reset() {
+        Revision.resetClockToDefault();
+        ClusterNodeInfo.resetClockToDefault();
+    }
+
     @Test
-    public void doneBackgroundRead() throws Exception {
+    public void doneBackgroundRead() {
         nodeStore.runBackgroundReadOperations();
         verify(statsCollector).doneBackgroundRead(any(BackgroundReadStats.class));
     }
 
     @Test
-    public void doneBackgroundUpdate() throws Exception {
+    public void doneBackgroundUpdate() {
         nodeStore.runBackgroundUpdateOperations();
         verify(statsCollector).doneBackgroundUpdate(any(BackgroundWriteStats.class));
     }
@@ -80,7 +96,7 @@ public class DocumentNodeStoreStatsColle
     }
 
     @Test
-    public void failedMerge() throws Exception {
+    public void failedMerge() {
         CommitHook failingHook = new CommitHook() {
             @Override
             public NodeState processCommit(NodeState before, NodeState after,
@@ -119,4 +135,11 @@ public class DocumentNodeStoreStatsColle
         verify(statsCollector, times(2)).doneBranchCommit();
         verify(statsCollector).doneMergeBranch(2);
     }
+
+    @Test
+    public void leaseUpdate() throws Exception {
+        clock.waitUntil(clock.getTime() + ClusterNodeInfo.DEFAULT_LEASE_UPDATE_INTERVAL_MILLIS * 2);
+        assertTrue(nodeStore.renewClusterIdLease());
+        verify(statsCollector).doneLeaseUpdate(anyLong());
+    }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsTest.java?rev=1835414&r1=1835413&r2=1835414&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsTest.java (original)
+++ jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreStatsTest.java Mon Jul  9 11:59:10 2018
@@ -24,11 +24,15 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
 import com.codahale.metrics.Meter;
+import com.codahale.metrics.Snapshot;
+import com.codahale.metrics.Timer;
+
 import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
 import org.apache.jackrabbit.oak.plugins.metric.MetricStatisticsProvider;
 import org.junit.After;
 import org.junit.Test;
 
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static org.junit.Assert.assertEquals;
 
 public class DocumentNodeStoreStatsTest {
@@ -44,7 +48,7 @@ public class DocumentNodeStoreStatsTest
     }
 
     @Test
-    public void backgroundRead() throws Exception{
+    public void backgroundRead() {
         BackgroundReadStats readStats = new BackgroundReadStats();
         readStats.numExternalChanges = 5;
         stats.doneBackgroundRead(readStats);
@@ -52,15 +56,29 @@ public class DocumentNodeStoreStatsTest
     }
 
     @Test
-    public void backgroundWrite() throws Exception{
+    public void backgroundWrite() {
         BackgroundWriteStats writeStats = new BackgroundWriteStats();
         writeStats.num = 7;
         stats.doneBackgroundUpdate(writeStats);
         assertEquals(7, getMeter(DocumentNodeStoreStats.BGW_NUM_WRITES_RATE).getCount());
+    }
 
+    @Test
+    public void leaseUpdate() {
+        stats.doneLeaseUpdate(47);
+        stats.doneLeaseUpdate(53);
+        Timer t = getTimer(DocumentNodeStoreStats.LEASE_UPDATE);
+        Snapshot s = t.getSnapshot();
+        assertEquals(MICROSECONDS.toNanos(47), s.getMin());
+        assertEquals(MICROSECONDS.toNanos(53), s.getMax());
+        assertEquals(MICROSECONDS.toNanos(50), s.getMean(), 0.01);
     }
 
     private Meter getMeter(String name) {
         return statsProvider.getRegistry().getMeters().get(name);
     }
+
+    private Timer getTimer(String name) {
+        return statsProvider.getRegistry().getTimers().get(name);
+    }
 }