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>


Reply via email to