Author: adulceanu Date: Tue Mar 6 13:34:22 2018 New Revision: 1825984 URL: http://svn.apache.org/viewvc?rev=1825984&view=rev Log: OAK-7259 - Improve SegmentNodeStoreStats to include number of commits per thread and threads currently waiting on the semaphore
Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java Modified: jackrabbit/oak/trunk/oak-examples/standalone/pom.xml jackrabbit/oak/trunk/oak-examples/webapp/pom.xml jackrabbit/oak/trunk/oak-it/pom.xml jackrabbit/oak/trunk/oak-jcr/pom.xml jackrabbit/oak/trunk/oak-lucene/pom.xml jackrabbit/oak/trunk/oak-parent/pom.xml jackrabbit/oak/trunk/oak-pojosr/pom.xml jackrabbit/oak/trunk/oak-run-commons/pom.xml jackrabbit/oak/trunk/oak-segment-tar/pom.xml jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStatsMBean.java jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java jackrabbit/oak/trunk/oak-upgrade/pom.xml Modified: jackrabbit/oak/trunk/oak-examples/standalone/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/standalone/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-examples/standalone/pom.xml (original) +++ jackrabbit/oak/trunk/oak-examples/standalone/pom.xml Tue Mar 6 13:34:22 2018 @@ -101,6 +101,11 @@ <optional>true</optional> </dependency> <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <optional>true</optional> + </dependency> + <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>${mongo.driver.version}</version> Modified: jackrabbit/oak/trunk/oak-examples/webapp/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-examples/webapp/pom.xml (original) +++ jackrabbit/oak/trunk/oak-examples/webapp/pom.xml Tue Mar 6 13:34:22 2018 @@ -201,6 +201,11 @@ <artifactId>metrics-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> Modified: jackrabbit/oak/trunk/oak-it/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-it/pom.xml (original) +++ jackrabbit/oak/trunk/oak-it/pom.xml Tue Mar 6 13:34:22 2018 @@ -212,5 +212,10 @@ <artifactId>metrics-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> Modified: jackrabbit/oak/trunk/oak-jcr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-jcr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-jcr/pom.xml Tue Mar 6 13:34:22 2018 @@ -458,5 +458,10 @@ <artifactId>metrics-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> Modified: jackrabbit/oak/trunk/oak-lucene/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-lucene/pom.xml (original) +++ jackrabbit/oak/trunk/oak-lucene/pom.xml Tue Mar 6 13:34:22 2018 @@ -388,6 +388,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version> Modified: jackrabbit/oak/trunk/oak-parent/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-parent/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-parent/pom.xml (original) +++ jackrabbit/oak/trunk/oak-parent/pom.xml Tue Mar 6 13:34:22 2018 @@ -538,6 +538,11 @@ <version>${guava.version}</version> </dependency> <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <version>1.4.2</version> + </dependency> + <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.4</version> Modified: jackrabbit/oak/trunk/oak-pojosr/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-pojosr/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-pojosr/pom.xml (original) +++ jackrabbit/oak/trunk/oak-pojosr/pom.xml Tue Mar 6 13:34:22 2018 @@ -352,5 +352,10 @@ <artifactId>metrics-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> Modified: jackrabbit/oak/trunk/oak-run-commons/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run-commons/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run-commons/pom.xml (original) +++ jackrabbit/oak/trunk/oak-run-commons/pom.xml Tue Mar 6 13:34:22 2018 @@ -113,6 +113,10 @@ <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-core</artifactId> </dependency> + <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + </dependency> <!-- Test dependencies --> <dependency> Modified: jackrabbit/oak/trunk/oak-segment-tar/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/pom.xml (original) +++ jackrabbit/oak/trunk/oak-segment-tar/pom.xml Tue Mar 6 13:34:22 2018 @@ -237,6 +237,11 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> <scope>provided</scope> Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java?rev=1825984&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java (added) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java Tue Mar 6 13:34:22 2018 @@ -0,0 +1,92 @@ +/* + * 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.segment; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Stream; + +import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; + +/** + * A simple tracker for the source of commits (writes) in + * {@link SegmentNodeStore}. It provides two basic functionalities: + * <ul> + * <li>exposes the number of commits executed per thread</li> + * <li>exposes the threads (and possibly their details - i.e., stack traces) + * currently waiting on the commit semaphore + * </ul> + * + * This class delegates thread-safety to its underlying state variables. + */ +class CommitsTracker { + private static final int DEFAULT_COMMITS_COUNT_MAP_SIZE = 20; + private static final boolean DEFAULT_COLLECT_STACK_TRACES = true; + + private volatile boolean collectStackTraces; + + private final ConcurrentMap<String, String> queuedWritersMap; + private final ConcurrentMap<String, Long> commitsCountMap; + + CommitsTracker() { + this(DEFAULT_COMMITS_COUNT_MAP_SIZE, DEFAULT_COLLECT_STACK_TRACES); + } + + CommitsTracker(int commitsCountMapMaxSize, boolean collectStackTraces) { + this.collectStackTraces = collectStackTraces; + this.commitsCountMap = new ConcurrentLinkedHashMap.Builder<String, Long>() + .maximumWeightedCapacity(commitsCountMapMaxSize).build(); + this.queuedWritersMap = new ConcurrentHashMap<>(); + } + + public void trackQueuedCommitOf(Thread t) { + String writerDetails = "N/A"; + if (collectStackTraces) { + StringBuilder threadDetails = new StringBuilder(); + Stream.of(t.getStackTrace()).forEach(threadDetails::append); + writerDetails = threadDetails.toString(); + } + + queuedWritersMap.put(t.getName(), writerDetails); + } + + public void trackDequedCommitOf(Thread t) { + queuedWritersMap.remove(t.getName()); + } + + public void trackExecutedCommitOf(Thread t) { + commitsCountMap.compute(t.getName(), (w, v) -> v == null ? 1 : v + 1); + } + + public void setCollectStackTraces(boolean flag) { + this.collectStackTraces = flag; + } + + public Map<String, String> getQueuedWritersMap() { + return new HashMap<>(queuedWritersMap); + } + + public Map<String, Long> getCommitsCountMap() { + return new HashMap<>(commitsCountMap); + } + +} Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java Tue Mar 6 13:34:22 2018 @@ -26,56 +26,41 @@ public interface SegmentNodeStoreMonitor SegmentNodeStoreMonitor DEFAULT = new SegmentNodeStoreMonitor() { @Override - public void onCommit() { + public void onCommit(Thread t, long time) { } @Override - public void onCommitQueued() { + public void onCommitQueued(Thread t) { } @Override - public void onCommitDequeued() { - - } - - @Override - public void committedAfter(long time) { - - } - - @Override - public void dequeuedAfter(long time) { + public void onCommitDequeued(Thread t, long time) { } }; /** - * Notifies the monitor when a new commit was persisted right away + * Notifies the monitor when a new commit was persisted. + * @param t the thread which initiated the write + * @param time the time spent for persisting the commit */ - void onCommit(); + void onCommit(Thread t, long time); /** * Notifies the monitor when a new commit couldn't be persisted, but was - * queued for later retry + * queued for later retry. + * + * @param t the thread which initiated the write */ - void onCommitQueued(); + void onCommitQueued(Thread t); /** * Notifies the monitor when a queued commit was dequeued for processing. + * @param t the thread which initiated the write + * @param time the time spent in the queue */ - void onCommitDequeued(); + void onCommitDequeued(Thread t, long time); - /** - * Notifies the monitor time spent (excluding queuing time) for a commit. - * @param time the time spent - */ - void committedAfter(long time); - - /** - * Notifies the monitor time spent in the queue for a commit, before being processed. - * @param time the time spent - */ - void dequeuedAfter(long time); -} +} \ No newline at end of file Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java Tue Mar 6 13:34:22 2018 @@ -21,10 +21,21 @@ package org.apache.jackrabbit.oak.segmen import static org.apache.jackrabbit.stats.TimeSeriesStatsUtil.asCompositeData; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.TimeUnit; import javax.management.openmbean.CompositeData; - +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.SimpleType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; import org.apache.jackrabbit.api.stats.TimeSeries; import org.apache.jackrabbit.oak.stats.CounterStats; import org.apache.jackrabbit.oak.stats.MeterStats; @@ -37,51 +48,50 @@ public class SegmentNodeStoreStats imple public static final String COMMIT_QUEUE_SIZE = "COMMIT_QUEUE_SIZE"; public static final String COMMIT_TIME = "COMMIT_TIME"; public static final String QUEUEING_TIME = "QUEUEING_TIME"; - + private final StatisticsProvider statisticsProvider; + private final CommitsTracker commitsTracker; private final MeterStats commitsCount; private final CounterStats commitQueueSize; private final TimerStats commitTime; private final TimerStats queueingTime; + private boolean collectStackTraces; + public SegmentNodeStoreStats(StatisticsProvider statisticsProvider) { this.statisticsProvider = statisticsProvider; + + this.commitsTracker = new CommitsTracker(); this.commitsCount = statisticsProvider.getMeter(COMMITS_COUNT, StatsOptions.DEFAULT); this.commitQueueSize = statisticsProvider.getCounterStats(COMMIT_QUEUE_SIZE, StatsOptions.DEFAULT); this.commitTime = statisticsProvider.getTimer(COMMIT_TIME, StatsOptions.DEFAULT); this.queueingTime = statisticsProvider.getTimer(QUEUEING_TIME, StatsOptions.DEFAULT); } - //~--------------------------------< SegmentStoreMonitor > - + // ~--------------------------------< SegmentStoreMonitor > + @Override - public void onCommit() { + public void onCommit(Thread t, long time) { commitsCount.mark(); + commitTime.update(time, TimeUnit.NANOSECONDS); + commitsTracker.trackExecutedCommitOf(t); } - + @Override - public void onCommitQueued() { + public void onCommitQueued(Thread t) { commitQueueSize.inc(); + commitsTracker.trackQueuedCommitOf(t); } - - @Override - public void onCommitDequeued() { - commitQueueSize.dec(); - } - @Override - public void committedAfter(long time) { - commitTime.update(time, TimeUnit.NANOSECONDS); - } - - @Override - public void dequeuedAfter(long time) { + public void onCommitDequeued(Thread t, long time) { + commitQueueSize.dec(); queueingTime.update(time, TimeUnit.NANOSECONDS); + commitsTracker.trackDequedCommitOf(t); } - - //~--------------------------------< SegmentStoreStatsMBean > - + + // ~--------------------------------< SegmentStoreStatsMBean > + @Override public CompositeData getCommitsCount() { return asCompositeData(getTimeSeries(COMMITS_COUNT), COMMITS_COUNT); @@ -91,19 +101,86 @@ public class SegmentNodeStoreStats imple public CompositeData getQueuingCommitsCount() { return asCompositeData(getTimeSeries(COMMIT_QUEUE_SIZE), COMMIT_QUEUE_SIZE); } - + @Override public CompositeData getCommitTimes() { return asCompositeData(getTimeSeries(COMMIT_TIME), COMMIT_TIME); } - + @Override public CompositeData getQueuingTimes() { return asCompositeData(getTimeSeries(QUEUEING_TIME), QUEUEING_TIME); } + + @Override + public TabularData getCommitsCountPerWriter() throws OpenDataException { + CompositeType commitsPerWriterRowType = new CompositeType("commitsPerWriter", "commitsPerWriter", + new String[] { "count", "writerName" }, new String[] { "count", "writerName" }, + new OpenType[] { SimpleType.LONG, SimpleType.STRING }); + + TabularDataSupport tabularData = new TabularDataSupport(new TabularType("commitsPerWriter", + "Most active writers", commitsPerWriterRowType, new String[] { "writerName" })); + + Map<String, Long> commitsCountMap = commitsTracker.getCommitsCountMap(); + if (commitsCountMap.isEmpty()) { + commitsCountMap.put("N/A", 0L); + } + + commitsCountMap.entrySet().stream() + .sorted(Comparator.<Entry<String, Long>> comparingLong(Entry::getValue).reversed()).map(e -> { + Map<String, Object> m = new HashMap<>(); + m.put("count", e.getValue()); + m.put("writerName", e.getKey()); + return m; + }).map(d -> mapToCompositeData(commitsPerWriterRowType, d)).forEach(tabularData::put); + + return tabularData; + } + + @Override + public TabularData getQueuedWriters() throws OpenDataException { + CompositeType queuedWritersDetailsRowType = new CompositeType("queuedWritersDetails", "queuedWritersDetails", + new String[] { "writerName", "writerDetails" }, new String[] { "writerName", "writerDetails" }, + new OpenType[] { SimpleType.STRING, SimpleType.STRING }); + + TabularDataSupport tabularData = new TabularDataSupport(new TabularType("queuedWritersDetails", + "Queued writers details", queuedWritersDetailsRowType, new String[] { "writerName" })); + + Map<String, String> queuedWritersMap = commitsTracker.getQueuedWritersMap(); + if (queuedWritersMap.isEmpty()) { + queuedWritersMap.put("N/A", "N/A"); + } + + queuedWritersMap.entrySet().stream().map(e -> { + Map<String, Object> m = new HashMap<>(); + m.put("writerName", e.getKey()); + m.put("writerDetails", e.getValue()); + return m; + }).map(d -> mapToCompositeData(queuedWritersDetailsRowType, d)).forEach(tabularData::put); + + return tabularData; + } + + @Override + public void setCollectStackTraces(boolean flag) { + this.collectStackTraces = flag; + commitsTracker.setCollectStackTraces(flag); + } + @Override + public boolean isCollectStackTraces() { + return collectStackTraces; + } + private TimeSeries getTimeSeries(String name) { return statisticsProvider.getStats().getTimeSeries(name, true); } - + + private static CompositeData mapToCompositeData(CompositeType compositeType, Map<String, Object> data) { + try { + return new CompositeDataSupport(compositeType, data); + } catch (OpenDataException | ArrayStoreException e) { + throw new IllegalArgumentException(e); + } + } } Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStatsMBean.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStatsMBean.java?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStatsMBean.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStatsMBean.java Tue Mar 6 13:34:22 2018 @@ -20,6 +20,8 @@ package org.apache.jackrabbit.oak.segment; import javax.management.openmbean.CompositeData; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.TabularData; public interface SegmentNodeStoreStatsMBean { String TYPE = "SegmentStoreStats"; @@ -43,4 +45,29 @@ public interface SegmentNodeStoreStatsMB * @return time series of the queuing times */ CompositeData getQueuingTimes(); + + /** + * @return tabular data of the form <commits,writer> + * @throws OpenDataException if data is not available + */ + TabularData getCommitsCountPerWriter() throws OpenDataException; + + /** + * @return tabular data of the form <writer,writerDetails> for each writer + * currently in the queue + * @throws OpenDataException if data is not available + */ + TabularData getQueuedWriters() throws OpenDataException; + + /** + * Turns on/off, depending on the value of {@code flag}, the collection of + * stack traces for each writer thread. + * @param flag {@code boolean} indicating whether to collect or not + */ + void setCollectStackTraces(boolean flag); + + /** + * @return collectStackTraces status flag + */ + boolean isCollectStackTraces(); } Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java (original) +++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java Tue Mar 6 13:34:22 2018 @@ -219,7 +219,7 @@ public class LockBasedScheduler implemen if (commitSemaphore.availablePermits() < 1) { queuedTime = System.nanoTime(); - stats.onCommitQueued(); + stats.onCommitQueued(Thread.currentThread()); queued = true; } @@ -227,8 +227,7 @@ public class LockBasedScheduler implemen try { if (queued) { long dequeuedTime = System.nanoTime(); - stats.dequeuedAfter(dequeuedTime - queuedTime); - stats.onCommitDequeued(); + stats.onCommitDequeued(Thread.currentThread(), dequeuedTime - queuedTime); } long beforeCommitTime = System.nanoTime(); @@ -237,9 +236,8 @@ public class LockBasedScheduler implemen commit.applied(merged); long afterCommitTime = System.nanoTime(); - stats.committedAfter(afterCommitTime - beforeCommitTime); commitTimeHistogram.update(afterCommitTime - beforeCommitTime); - stats.onCommit(); + stats.onCommit(Thread.currentThread(), afterCommitTime - beforeCommitTime); return merged; } finally { Modified: jackrabbit/oak/trunk/oak-upgrade/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/pom.xml?rev=1825984&r1=1825983&r2=1825984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/pom.xml (original) +++ jackrabbit/oak/trunk/oak-upgrade/pom.xml Tue Mar 6 13:34:22 2018 @@ -172,6 +172,10 @@ <groupId>io.dropwizard.metrics</groupId> <artifactId>metrics-core</artifactId> </dependency> + <dependency> + <groupId>com.googlecode.concurrentlinkedhashmap</groupId> + <artifactId>concurrentlinkedhashmap-lru</artifactId> + </dependency> <!-- Test Dependencies --> <dependency>