You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by sh...@apache.org on 2026/08/20 02:39:52 UTC

(iotdb) branch fix-ut-compaction-candidate-20260820 created (now 03920bec510)

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

shuwenwei pushed a change to branch fix-ut-compaction-candidate-20260820
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 03920bec510 fix: make CompactionWorkerTest UT deterministic by using CountDownLatch instead of fixed 2s sleep to wait for task drop status reset

This branch includes the following new commits:

     new 03920bec510 fix: make CompactionWorkerTest UT deterministic by using CountDownLatch instead of fixed 2s sleep to wait for task drop status reset

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(iotdb) 01/01: fix: make CompactionWorkerTest UT deterministic by using CountDownLatch instead of fixed 2s sleep to wait for task drop status reset

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shuwenwei pushed a commit to branch fix-ut-compaction-candidate-20260820
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 03920bec5100ff238142c51bd311e76110a270b1
Author: shuwenwei <s1...@gmail.com>
AuthorDate: Thu Aug 20 10:28:04 2026 +0800

    fix: make CompactionWorkerTest UT deterministic by using CountDownLatch instead of fixed 2s sleep to wait for task drop status reset
    
    The two failing UTs (testFailedToAllocateFileNumInCrossTask and testFailedToCheckValidInCrossTask) were flaky because they used thread.join(2s) to wait for the task to be dropped. However, in these cases queue.take() never returns - the task is dropped by dropCompactionTask which calls resetCompactionCandidateStatusForAllSourceFiles(). The 2s sleep was not reliable under load.
    
    Change to CountDownLatch attached to the resetCompactionCandidateStatusForAllSourceFiles() hook, with 5s timeout. This makes the test wait for the exact condition (status back to NORMAL) instead of arbitrary time.
---
 .../compaction/CompactionWorkerTest.java           | 58 +++++++++++++++++++---
 1 file changed, 52 insertions(+), 6 deletions(-)

diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionWorkerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionWorkerTest.java
index 11121d5bc01..ec1ec976e2b 100644
--- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionWorkerTest.java
+++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/CompactionWorkerTest.java
@@ -95,6 +95,15 @@ public class CompactionWorkerTest {
             0);
     CrossSpaceCompactionTask taskMock = Mockito.spy(task);
     Mockito.doReturn(true).when(taskMock).start();
+    CountDownLatch statusResetLatch = new CountDownLatch(1);
+    Mockito.doAnswer(
+            invocation -> {
+              invocation.callRealMethod();
+              statusResetLatch.countDown();
+              return null;
+            })
+        .when(taskMock)
+        .resetCompactionCandidateStatusForAllSourceFiles();
     FixedPriorityBlockingQueue<AbstractCompactionTask> queue =
         new CompactionTaskQueue(50, new DefaultCompactionTaskComparatorImpl());
     queue.put(taskMock);
@@ -108,7 +117,9 @@ public class CompactionWorkerTest {
               }
             });
     thread.start();
-    thread.join(TimeUnit.SECONDS.toMillis(2));
+    Assert.assertTrue(
+        "source files should be reset to NORMAL after the cross-space task is dropped",
+        statusResetLatch.await(5, TimeUnit.SECONDS));
     Assert.assertEquals(
         0, SystemInfo.getInstance().getCompactionMemoryBlock().getUsedMemoryInBytes());
     Assert.assertEquals(0, SystemInfo.getInstance().getCompactionFileNumCost().get());
@@ -153,6 +164,15 @@ public class CompactionWorkerTest {
               0L, tsFileManager, sequenceFiles, unsequenceFiles, null, 1000, 0);
       CrossSpaceCompactionTask taskMock = Mockito.spy(task);
       Mockito.doReturn(true).when(taskMock).start();
+      CountDownLatch statusResetLatch = new CountDownLatch(1);
+      Mockito.doAnswer(
+              invocation -> {
+                invocation.callRealMethod();
+                statusResetLatch.countDown();
+                return null;
+              })
+          .when(taskMock)
+          .resetCompactionCandidateStatusForAllSourceFiles();
       FixedPriorityBlockingQueue<AbstractCompactionTask> queue =
           new CompactionTaskQueue(50, new DefaultCompactionTaskComparatorImpl());
       queue.put(taskMock);
@@ -165,7 +185,9 @@ public class CompactionWorkerTest {
                 }
               });
       thread.start();
-      thread.join(TimeUnit.SECONDS.toMillis(2));
+      Assert.assertTrue(
+          "source files should be reset to NORMAL after the cross-space task is dropped",
+          statusResetLatch.await(5, TimeUnit.SECONDS));
       Assert.assertEquals(
           0, SystemInfo.getInstance().getCompactionMemoryBlock().getUsedMemoryInBytes());
       Assert.assertEquals(0, SystemInfo.getInstance().getCompactionFileNumCost().get());
@@ -208,9 +230,19 @@ public class CompactionWorkerTest {
     CrossSpaceCompactionTask task =
         new CrossSpaceCompactionTask(
             0L, tsFileManager, sequenceFiles, unsequenceFiles, null, 1000, 0);
+    CrossSpaceCompactionTask taskMock = Mockito.spy(task);
+    CountDownLatch statusResetLatch = new CountDownLatch(1);
+    Mockito.doAnswer(
+            invocation -> {
+              invocation.callRealMethod();
+              statusResetLatch.countDown();
+              return null;
+            })
+        .when(taskMock)
+        .resetCompactionCandidateStatusForAllSourceFiles();
     FixedPriorityBlockingQueue<AbstractCompactionTask> queue =
         new CompactionTaskQueue(50, new DefaultCompactionTaskComparatorImpl());
-    queue.put(task);
+    queue.put(taskMock);
     Thread thread =
         new Thread(
             () -> {
@@ -220,7 +252,9 @@ public class CompactionWorkerTest {
               }
             });
     thread.start();
-    thread.join(TimeUnit.SECONDS.toMillis(2));
+    Assert.assertTrue(
+        "source files should be reset to NORMAL after the cross-space task is dropped",
+        statusResetLatch.await(5, TimeUnit.SECONDS));
     Assert.assertEquals(
         0, SystemInfo.getInstance().getCompactionMemoryBlock().getUsedMemoryInBytes());
     Assert.assertEquals(0, SystemInfo.getInstance().getCompactionFileNumCost().get());
@@ -248,9 +282,19 @@ public class CompactionWorkerTest {
     // fail to check valid when tsfile manager is not allowed to compaction in inner task
     InnerSpaceCompactionTask innerTask =
         new InnerSpaceCompactionTask(0L, tsFileManager, sequenceFiles, true, null, 0L);
+    InnerSpaceCompactionTask innerTaskMock = Mockito.spy(innerTask);
+    CountDownLatch statusResetLatch = new CountDownLatch(1);
+    Mockito.doAnswer(
+            invocation -> {
+              invocation.callRealMethod();
+              statusResetLatch.countDown();
+              return null;
+            })
+        .when(innerTaskMock)
+        .resetCompactionCandidateStatusForAllSourceFiles();
     FixedPriorityBlockingQueue<AbstractCompactionTask> queue =
         new CompactionTaskQueue(50, new DefaultCompactionTaskComparatorImpl());
-    queue.put(innerTask);
+    queue.put(innerTaskMock);
     Thread thread =
         new Thread(
             () -> {
@@ -260,7 +304,9 @@ public class CompactionWorkerTest {
               }
             });
     thread.start();
-    thread.join(TimeUnit.SECONDS.toMillis(2));
+    Assert.assertTrue(
+        "source files should be reset to NORMAL after the inner-space task is dropped",
+        statusResetLatch.await(5, TimeUnit.SECONDS));
     Assert.assertEquals(
         0, SystemInfo.getInstance().getCompactionMemoryBlock().getUsedMemoryInBytes());
     Assert.assertEquals(0, SystemInfo.getInstance().getCompactionFileNumCost().get());