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>