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 md...@apache.org on 2019/03/15 13:34:56 UTC
svn commit: r1855588 - in /jackrabbit/oak/trunk/oak-segment-tar/src:
main/java/org/apache/jackrabbit/oak/segment/
test/java/org/apache/jackrabbit/oak/segment/
Author: mduerig
Date: Fri Mar 15 13:34:56 2019
New Revision: 1855588
URL: http://svn.apache.org/viewvc?rev=1855588&view=rev
Log:
OAK-8094: JMX monitoring to detect commits carrying over from previous GC generation can block other threads from committing
Add timestamp to monitoring of queued commits
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.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/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java
Modified: 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=1855588&r1=1855587&r2=1855588&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java Fri Mar 15 13:34:56 2019
@@ -22,6 +22,7 @@ package org.apache.jackrabbit.oak.segmen
import static com.google.common.collect.Maps.newHashMap;
import static com.google.common.collect.Queues.newConcurrentLinkedQueue;
+import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -46,36 +47,48 @@ import com.googlecode.concurrentlinkedha
class CommitsTracker {
private final String[] threadGroups;
private final int otherWritersLimit;
- private final boolean collectStackTraces;
- private final ConcurrentMap<String, String> queuedWritersMap;
+ private final ConcurrentMap<String, Commit> queuedWritersMap;
private final Queue<Commit> commits = newConcurrentLinkedQueue();
- private static final class Commit {
- final long timeStamp;
- final String thread;
+ static final class Commit {
+ private final long timeStamp;
+ private final String threadName;
+ private final WeakReference<Thread> thread;
- Commit(long timeStamp, String thread) {
+ Commit(long timeStamp, Thread thread) {
this.timeStamp = timeStamp;
- this.thread = thread;
+ this.threadName = thread.getName();
+ this.thread = new WeakReference<>(thread);
+ }
+
+ String getStackTrace() {
+ Thread t = thread.get();
+ if (t != null) {
+ StringBuilder threadDetails = new StringBuilder();
+ Stream.of(t.getStackTrace()).forEach(threadDetails::append);
+ return threadDetails.toString();
+ } else {
+ return "N/A";
+ }
+ }
+
+ String getThreadName() {
+ return threadName;
+ }
+
+ long getTimeStamp() {
+ return timeStamp;
}
}
- CommitsTracker(String[] threadGroups, int otherWritersLimit, boolean collectStackTraces) {
+ CommitsTracker(String[] threadGroups, int otherWritersLimit) {
this.threadGroups = threadGroups;
this.otherWritersLimit = otherWritersLimit;
- this.collectStackTraces = collectStackTraces;
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);
+ queuedWritersMap.put(t.getName(), new Commit(System.currentTimeMillis(), t));
}
public void trackDequedCommitOf(Thread t) {
@@ -95,10 +108,10 @@ class CommitsTracker {
break;
}
}
- commits.offer(new Commit(t, thread.getName()));
+ commits.offer(new Commit(t, thread));
}
- public Map<String, String> getQueuedWritersMap() {
+ public Map<String, Commit> getQueuedWritersMap() {
return new HashMap<>(queuedWritersMap);
}
@@ -121,7 +134,7 @@ class CommitsTracker {
long t = System.currentTimeMillis() - 60000;
for (Commit commit : commits) {
if (commit.timeStamp > t) {
- String group = findGroupFor(commit.thread);
+ String group = findGroupFor(commit.threadName);
if (!"other".equals(group)) {
commitsPerGroup.compute(group, (w, v) -> v == null ? 1 : v + 1);
}
@@ -136,9 +149,9 @@ class CommitsTracker {
long t = System.currentTimeMillis() - 60000;
for (Commit commit : commits) {
if (commit.timeStamp > t) {
- String group = findGroupFor(commit.thread);
+ String group = findGroupFor(commit.threadName);
if ("other".equals(group)) {
- commitsOther.compute(commit.thread, (w, v) -> v == null ? 1 : v + 1);
+ commitsOther.compute(commit.threadName, (w, v) -> v == null ? 1 : v + 1);
}
}
}
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=1855588&r1=1855587&r2=1855588&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 Fri Mar 15 13:34:56 2019
@@ -36,6 +36,8 @@ import javax.management.openmbean.Simple
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularDataSupport;
import javax.management.openmbean.TabularType;
+
+import com.google.common.collect.ImmutableMap;
import org.apache.jackrabbit.api.stats.TimeSeries;
import org.apache.jackrabbit.oak.stats.CounterStats;
import org.apache.jackrabbit.oak.stats.MeterStats;
@@ -67,7 +69,7 @@ public class SegmentNodeStoreStats imple
public SegmentNodeStoreStats(StatisticsProvider statisticsProvider) {
this.statisticsProvider = statisticsProvider;
- this.commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit, collectStackTraces);
+ this.commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit);
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);
@@ -156,24 +158,24 @@ public class SegmentNodeStoreStats imple
@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);
+ CompositeType queuedWritersDetailsRowType = new CompositeType(
+ "queuedWritersDetails", "queuedWritersDetails",
+ new String[] { "writerName", "writerDetails", "writerTimeStamp" },
+ new String[] { "writerName", "writerDetails", "writerTimeStamp" },
+ new OpenType[] { SimpleType.STRING, SimpleType.STRING, SimpleType.LONG });
+
+ TabularDataSupport tabularData = new TabularDataSupport(new TabularType(
+ "queuedWritersDetails", "Queued writers details",
+ queuedWritersDetailsRowType,
+ new String[] { "writerName" }));
+
+ commitsTracker.getQueuedWritersMap().values().stream().map(commit ->
+ ImmutableMap.<String, Object>of(
+ "writerName", commit.getThreadName(),
+ "writerDetails", collectStackTraces ? commit.getStackTrace() : "N/A",
+ "writerTimeStamp", commit.getTimeStamp()))
+ .map(d -> mapToCompositeData(queuedWritersDetailsRowType, d))
+ .forEach(tabularData::put);
return tabularData;
}
@@ -181,7 +183,7 @@ public class SegmentNodeStoreStats imple
@Override
public void setCollectStackTraces(boolean flag) {
this.collectStackTraces = flag;
- commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit, collectStackTraces);
+ commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit);
}
@Override
@@ -197,7 +199,7 @@ public class SegmentNodeStoreStats imple
@Override
public void setNumberOfOtherWritersToDetail(int otherWritersLimit) {
this.otherWritersLimit = otherWritersLimit;
- commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit, collectStackTraces);
+ commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit);
}
@Override
@@ -208,7 +210,7 @@ public class SegmentNodeStoreStats imple
@Override
public void setWriterGroupsForLastMinuteCounts(String[] writerGroups) {
this.writerGroups = writerGroups;
- commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit, collectStackTraces);
+ commitsTracker = new CommitsTracker(writerGroups, otherWritersLimit);
}
private TimeSeries getTimeSeries(String name) {
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=1855588&r1=1855587&r2=1855588&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 Fri Mar 15 13:34:56 2019
@@ -61,8 +61,8 @@ public interface SegmentNodeStoreStatsMB
TabularData getCommitsCountForOtherWriters() throws OpenDataException;
/**
- * @return tabular data of the form <writer,writerDetails> for each writer
- * currently in the queue
+ * @return tabular data of the form <em><writer, writerDetails, writerTimeStamp></em>
+ * for each writer currently in the queue
* @throws OpenDataException if data is not available
*/
TabularData getQueuedWriters() throws OpenDataException;
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java?rev=1855588&r1=1855587&r2=1855588&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java Fri Mar 15 13:34:56 2019
@@ -65,7 +65,7 @@ public class CommitsTrackerTest {
@Test
public void testCommitsCountOthers() throws InterruptedException {
- CommitsTracker commitsTracker = new CommitsTracker(new String[] {}, 10, true);
+ CommitsTracker commitsTracker = new CommitsTracker(new String[] {}, 10);
List<CommitTask> queued = newArrayList();
for (int k = 0; k < 20; k++) {
@@ -93,7 +93,7 @@ public class CommitsTrackerTest {
@Test
public void testCommitsCountPerGroup() throws InterruptedException {
String[] groups = new String[] { "Thread-1.*", "Thread-2.*", "Thread-3.*" };
- CommitsTracker commitsTracker = new CommitsTracker(groups, 10, false);
+ CommitsTracker commitsTracker = new CommitsTracker(groups, 10);
for (int k = 0; k < 40; k++) {
CommitTask commitTask = new CommitTask(commitsTracker, "Thread-" + (10 + k));