This is an automated email from the ASF dual-hosted git repository. snazy pushed a commit to branch cassandra-3.0 in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-3.0 by this push: new 2aa7cf8 FBUtilitities.testWaitFirstFuture is flaky 2aa7cf8 is described below commit 2aa7cf8114f3c63359e65fd741bfb990ebac2ebe Author: Robert Stupp <sn...@snazy.de> AuthorDate: Tue Apr 21 13:12:33 2020 +0200 FBUtilitities.testWaitFirstFuture is flaky patch by Robert Stupp; reviewed by Eduard Tudenhöfner for CASSANDRA-15744 --- .../apache/cassandra/utils/FBUtilitiesTest.java | 56 +++++++++++++--------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java index c5126a0..f13d076 100644 --- a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java +++ b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -140,30 +141,41 @@ public class FBUtilitiesTest @Test public void testWaitFirstFuture() throws ExecutionException, InterruptedException { - - ExecutorService executor = Executors.newFixedThreadPool(4); - FBUtilities.reset(); - List<Future<?>> futures = new ArrayList<>(); - for (int i = 4; i >= 1; i--) + final int threadCount = 10; + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + try + { + List<Future<?>> futures = new ArrayList<>(threadCount); + List<CountDownLatch> latches = new ArrayList<>(threadCount); + + for (int i = 0; i < threadCount; i++) + { + CountDownLatch latch = new CountDownLatch(1); + latches.add(latch); + int finalI = i; + futures.add(executor.submit(() -> { + latch.await(10, TimeUnit.SECONDS); + // Sleep to emulate "work" done by the future to make it not return immediately + // after counting down the latch in order to test for delay and spinning done + // in FBUtilities#waitOnFirstFuture. + TimeUnit.MILLISECONDS.sleep(10); + return latch.getCount() == 0 ? finalI : -1; + })); + } + + for (int i = 0; i < threadCount; i++) + { + latches.get(i).countDown(); + Future<?> fut = FBUtilities.waitOnFirstFuture(futures, 3); + int futSleep = (Integer) fut.get(); + assertEquals(futSleep, i); + futures.remove(fut); + } + } + finally { - final int sleep = i * 10; - futures.add(executor.submit(() -> { TimeUnit.MILLISECONDS.sleep(sleep); return sleep; })); + executor.shutdown(); } - Future<?> fut = FBUtilities.waitOnFirstFuture(futures, 3); - int futSleep = (Integer) fut.get(); - assertEquals(futSleep, 10); - futures.remove(fut); - fut = FBUtilities.waitOnFirstFuture(futures, 3); - futSleep = (Integer) fut.get(); - assertEquals(futSleep, 20); - futures.remove(fut); - fut = FBUtilities.waitOnFirstFuture(futures, 3); - futSleep = (Integer) fut.get(); - assertEquals(futSleep, 30); - futures.remove(fut); - fut = FBUtilities.waitOnFirstFuture(futures, 3); - futSleep = (Integer) fut.get(); - assertEquals(futSleep, 40); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org