You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jo...@apache.org on 2022/01/06 21:42:57 UTC

[cassandra] branch cassandra-3.0 updated: Race in CompactionExecutorTest

This is an automated email from the ASF dual-hosted git repository.

jonmeredith 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 071ecb5  Race in CompactionExecutorTest
071ecb5 is described below

commit 071ecb52465837c90520423c2bc80eb886936953
Author: Jon Meredith <jo...@apache.org>
AuthorDate: Thu Jan 6 11:12:21 2022 -0700

    Race in CompactionExecutorTest
    
    patch by Jon Meredith; reviewed by Josh McKenzie for CASSANDRA-17239
---
 CHANGES.txt                                        |  1 +
 .../db/compaction/CompactionExecutorTest.java      | 32 +++++++++++++---------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 085e1ff..6ed2033 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -22,6 +22,7 @@
  * Use JMX to validate nodetool --jobs parameter (CASSANDRA-16104)
  * Handle properly UnsatisfiedLinkError in NativeLibrary#getProcessID() (CASSANDRA-16578)
  * Remove mutation data from error log message (CASSANDRA-16817)
+ * Race in CompactionExecutorTest (CASSANDRA-17239)
 Merged from 2.2:
  * Add python2 location to RPMs (CASSANDRA-16822)
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java
index 9b07da9..b1f29b3 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java
@@ -18,13 +18,13 @@
 
 package org.apache.cassandra.db.compaction;
 
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import org.apache.cassandra.utils.concurrent.SimpleCondition;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -32,8 +32,12 @@ import static org.junit.Assert.assertNotNull;
 public class CompactionExecutorTest
 {
     static Throwable testTaskThrowable = null;
+    static SimpleCondition afterExecuteCompleted = null;
     private static class TestTaskExecutor extends CompactionManager.CompactionExecutor
     {
+        // afterExecute runs immediately after the task completes, but it may
+        // race with the main thread checking the result, so make the main thread wait
+        // with a simple condition
         @Override
         public void afterExecute(Runnable r, Throwable t)
         {
@@ -42,6 +46,7 @@ public class CompactionExecutorTest
                 t = DebuggableThreadPoolExecutor.extractThrowable(r);
             }
             testTaskThrowable = t;
+            afterExecuteCompleted.signalAll();
         }
         @Override
         protected void beforeExecute(Thread t, Runnable r)
@@ -54,6 +59,8 @@ public class CompactionExecutorTest
     public void setup()
     {
         executor = new TestTaskExecutor();
+        testTaskThrowable = null;
+        afterExecuteCompleted = new SimpleCondition();
     }
 
     @After
@@ -63,16 +70,19 @@ public class CompactionExecutorTest
         executor.awaitTermination(1, TimeUnit.MINUTES);
     }
 
+    void awaitExecution() throws Exception
+    {
+        assert afterExecuteCompleted.await(10, TimeUnit.SECONDS) : "afterExecute failed to complete";
+    }
+
     @Test
     public void testFailedRunnable() throws Exception
     {
-        testTaskThrowable = null;
-        Future<?> tt = executor.submitIfRunning(
+        executor.submitIfRunning(
             () -> { assert false : "testFailedRunnable"; }
             , "compactionExecutorTest");
 
-        while (!tt.isDone())
-            Thread.sleep(10);
+        awaitExecution();
         assertNotNull(testTaskThrowable);
         assertEquals(testTaskThrowable.getMessage(), "testFailedRunnable");
     }
@@ -80,13 +90,11 @@ public class CompactionExecutorTest
     @Test
     public void testFailedCallable() throws Exception
     {
-        testTaskThrowable = null;
-        Future<?> tt = executor.submitIfRunning(
+        executor.submitIfRunning(
             () -> { assert false : "testFailedCallable"; return 1; }
             , "compactionExecutorTest");
 
-        while (!tt.isDone())
-            Thread.sleep(10);
+        awaitExecution();
         assertNotNull(testTaskThrowable);
         assertEquals(testTaskThrowable.getMessage(), "testFailedCallable");
     }
@@ -94,13 +102,11 @@ public class CompactionExecutorTest
     @Test
     public void testExceptionRunnable() throws Exception
     {
-        testTaskThrowable = null;
-        Future<?> tt = executor.submitIfRunning(
+        executor.submitIfRunning(
         () -> { throw new RuntimeException("testExceptionRunnable"); }
         , "compactionExecutorTest");
 
-        while (!tt.isDone())
-            Thread.sleep(10);
+        awaitExecution();
         assertNotNull(testTaskThrowable);
         assertEquals(testTaskThrowable.getMessage(), "testExceptionRunnable");
     }

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org