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 &lt;writer,writerDetails&gt; for each writer
-     *         currently in the queue
+     * @return tabular data of the form <em>&lt;writer, writerDetails, writerTimeStamp&gt;</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));