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