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:50 UTC

svn commit: r1855587 - /jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java

Author: mduerig
Date: Fri Mar 15 13:34:49 2019
New Revision: 1855587

URL: http://svn.apache.org/viewvc?rev=1855587&view=rev
Log:
OAK-8094: JMX monitoring to detect commits carrying over from previous GC generation can block other threads from committing
Simplify CommitsTrackerTest

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java

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=1855587&r1=1855586&r2=1855587&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:49 2019
@@ -19,84 +19,74 @@
 
 package org.apache.jackrabbit.oak.segment;
 
-import static java.util.concurrent.Executors.newFixedThreadPool;
+import static com.google.common.collect.Lists.newArrayList;
+import static java.lang.Math.min;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
 import org.junit.Test;
 
 public class CommitsTrackerTest {
 
-    static class DequedCommitTask implements Runnable {
+    private static class CommitTask {
         private final CommitsTracker commitsTracker;
-        private final String threadName;
-        private final CountDownLatch latch;
+        private final Thread thread;
 
-        public DequedCommitTask(CommitsTracker commitsTracker, String threadName, CountDownLatch latch) {
+        CommitTask(CommitsTracker commitsTracker) {
             this.commitsTracker = commitsTracker;
-            this.threadName = threadName;
-            this.latch = latch;
+            this.thread = new Thread();
         }
 
-        @Override
-        public void run() {
-            Thread.currentThread().setName(threadName);
-            commitsTracker.trackDequedCommitOf(Thread.currentThread());
-            latch.countDown();
+        CommitTask(CommitsTracker commitsTracker, String threadName) {
+            this.commitsTracker = commitsTracker;
+            this.thread = new Thread(threadName);
+        }
+
+        public void queued() {
+            commitsTracker.trackQueuedCommitOf(thread);
+        }
+
+        public void dequeue() {
+            commitsTracker.trackDequedCommitOf(thread);
+        }
+
+        public void executed() {
+            commitsTracker.trackExecutedCommitOf(thread);
+        }
+
+        public String getThreadName() {
+            return thread.getName();
         }
     }
 
     @Test
     public void testCommitsCountOthers() throws InterruptedException {
-        CommitsTracker commitsTracker = new CommitsTracker(new String[] {}, 10, false);
-        ExecutorService executorService = newFixedThreadPool(30);
-        final CountDownLatch addLatch = new CountDownLatch(25);
-
-        Runnable executedCommitTask = () -> {
-            commitsTracker.trackExecutedCommitOf(Thread.currentThread());
-            addLatch.countDown();
-        };
-
-        Runnable queuedCommitTask = () -> {
-            Thread t = Thread.currentThread();
-            commitsTracker.trackQueuedCommitOf(t);
-            addLatch.countDown();
-        };
-
-        try {
-            for (int i = 0; i < 20; i++) {
-                executorService.submit(executedCommitTask);
-            }
-
-            for (int i = 0; i < 5; i++) {
-                executorService.submit(queuedCommitTask);
-            }
-
-            addLatch.await();
-            Map<String, Long> commitsCountOthersMap = commitsTracker.getCommitsCountOthers();
-            Map<String, String> queuedWritersMap = commitsTracker.getQueuedWritersMap();
-
-            assertTrue(commitsCountOthersMap.size() >= 10);
-            assertTrue(commitsCountOthersMap.size() < 20);
-            assertEquals(5, queuedWritersMap.size());
-
-            CountDownLatch removeLatch = new CountDownLatch(5);
-            for (String threadName : queuedWritersMap.keySet()) {
-                executorService.submit(new DequedCommitTask(commitsTracker, threadName, removeLatch));
-            }
-
-            removeLatch.await();
-            queuedWritersMap = commitsTracker.getQueuedWritersMap();
-            assertEquals(0, queuedWritersMap.size());
-        } finally {
-            new ExecutorCloser(executorService).close();
+        CommitsTracker commitsTracker = new CommitsTracker(new String[] {}, 10, true);
+
+        List<CommitTask> queued = newArrayList();
+        for (int k = 0; k < 20; k++) {
+            CommitTask commitTask = new CommitTask(commitsTracker);
+            queued.add(commitTask);
+            commitTask.queued();
+            assertEquals(queued.size(), commitsTracker.getQueuedWritersMap().size());
+            assertEquals(0, commitsTracker.getCommitsCountOthers().size());
+            assertTrue(commitsTracker.getCommitsCountPerGroupLastMinute().isEmpty());
+        }
+
+        List<CommitTask> executed = newArrayList();
+        for (int k = 0; k < 13; k ++) {
+            CommitTask commitTask = queued.remove(0);
+            executed.add(commitTask);
+            commitTask.dequeue();
+
+            commitTask.executed();
+            assertEquals(queued.size(), commitsTracker.getQueuedWritersMap().size());
+            assertEquals(min(10, executed.size()), commitsTracker.getCommitsCountOthers().size());
+            assertTrue(commitsTracker.getCommitsCountPerGroupLastMinute().isEmpty());
         }
     }
 
@@ -104,33 +94,23 @@ public class CommitsTrackerTest {
     public void testCommitsCountPerGroup() throws InterruptedException {
         String[] groups = new String[] { "Thread-1.*", "Thread-2.*", "Thread-3.*" };
         CommitsTracker commitsTracker = new CommitsTracker(groups, 10, false);
-        ExecutorService executorService = newFixedThreadPool(30);
-        AtomicInteger counter = new AtomicInteger(10);
-        final CountDownLatch latch = new CountDownLatch(30);
-
-        Runnable executedCommitTask = () -> {
-            Thread.currentThread().setName("Thread-" + counter.getAndIncrement());
-            commitsTracker.trackExecutedCommitOf(Thread.currentThread());
-            latch.countDown();
-        };
-
-        try {
-            for (int i = 0; i < 30; i++) {
-                executorService.submit(executedCommitTask);
-            }
-            
-            latch.await();
-            
-            Map<String, Long> commitsCountPerGroup = commitsTracker.getCommitsCountPerGroupLastMinute();
-            assertEquals(3, commitsCountPerGroup.size());
-            
-            for (String group : groups) {
-                Long groupCount = commitsCountPerGroup.get(group);
-                assertNotNull(groupCount);
-                assertEquals(10, (long) groupCount);
-            }
-        } finally {
-            new ExecutorCloser(executorService).close();
+
+        for (int k = 0; k < 40; k++) {
+            CommitTask commitTask = new CommitTask(commitsTracker, "Thread-" + (10 + k));
+            commitTask.queued();
+            commitTask.dequeue();
+            commitTask.executed();
         }
+
+        Map<String, Long> commitsCountPerGroup = commitsTracker.getCommitsCountPerGroupLastMinute();
+        assertEquals(3, commitsCountPerGroup.size());
+
+        for (String group : groups) {
+            Long groupCount = commitsCountPerGroup.get(group);
+            assertNotNull(groupCount);
+            assertEquals(10, (long) groupCount);
+        }
+
+        assertEquals(10, commitsTracker.getCommitsCountOthers().size());
     }
 }