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

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 7fdba3229db HDDS-15448. Speed up retry-delay-bound tests in 
TestReconTaskControllerImpl (#10520)
7fdba3229db is described below

commit 7fdba3229db6e68feb5e3af12bf20b1254441b54
Author: Chi-Hsuan Huang <[email protected]>
AuthorDate: Tue Jun 16 23:22:30 2026 +0800

    HDDS-15448. Speed up retry-delay-bound tests in TestReconTaskControllerImpl 
(#10520)
---
 .../ozone/recon/tasks/ReconTaskControllerImpl.java | 25 ++++++++++++++++++++--
 .../recon/tasks/TestReconTaskControllerImpl.java   | 13 ++++++-----
 2 files changed, 31 insertions(+), 7 deletions(-)

diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ReconTaskControllerImpl.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ReconTaskControllerImpl.java
index b3f06a61ea3..23b6e37136c 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ReconTaskControllerImpl.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/tasks/ReconTaskControllerImpl.java
@@ -28,6 +28,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Paths;
+import java.time.Clock;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -102,6 +103,9 @@ public class ReconTaskControllerImpl implements 
ReconTaskController {
   private AtomicLong lastRetryTimestamp = new AtomicLong(0);
   private static final int MAX_EVENT_PROCESS_RETRIES = 6;
   private static final long RETRY_DELAY_MS = 2000; // 2 seconds
+  // Clock for the retry-delay gate; overridable in tests via the
+  // @VisibleForTesting constructor to drive the gate with a TestClock.
+  private Clock clock = Clock.systemUTC();
 
   @Inject
   @SuppressWarnings("checkstyle:ParameterNumber")
@@ -136,6 +140,23 @@ public ReconTaskControllerImpl(OzoneConfiguration 
configuration,
     }
   }
 
+  @VisibleForTesting
+  @SuppressWarnings("checkstyle:ParameterNumber")
+  ReconTaskControllerImpl(OzoneConfiguration configuration,
+                          Set<ReconOmTask> tasks,
+                          ReconTaskStatusUpdaterManager 
taskStatusUpdaterManager,
+                          ReconDBProvider reconDBProvider,
+                          ReconContainerMetadataManager 
reconContainerMetadataManager,
+                          ReconNamespaceSummaryManager 
reconNamespaceSummaryManager,
+                          ReconGlobalStatsManager reconGlobalStatsManager,
+                          ReconFileMetadataManager reconFileMetadataManager,
+                          Clock clock) {
+    this(configuration, tasks, taskStatusUpdaterManager, reconDBProvider,
+        reconContainerMetadataManager, reconNamespaceSummaryManager,
+        reconGlobalStatsManager, reconFileMetadataManager);
+    this.clock = clock;
+  }
+
   @Override
   public void registerTask(ReconOmTask task) {
     String taskName = task.getTaskName();
@@ -636,7 +657,7 @@ public synchronized 
ReconTaskController.ReInitializationResult queueReInitializa
 
   private ReconTaskController.ReInitializationResult 
validateRetryCountAndDelay() {
     // Check if we should retry based on timing for iteration-based retries
-    long currentTime = System.currentTimeMillis();
+    long currentTime = clock.millis();
     if (eventProcessRetryCount.get() > 0) {
       // Check if 2 seconds have passed since last iteration
       long timeSinceLastRetry = currentTime - lastRetryTimestamp.get();
@@ -655,7 +676,7 @@ private ReconTaskController.ReInitializationResult 
validateRetryCountAndDelay()
    * Handle iteration failure by updating retry counters.
    */
   private void handleEventFailure() {
-    long currentTime = System.currentTimeMillis();
+    long currentTime = clock.millis();
     lastRetryTimestamp.set(currentTime);
     eventProcessRetryCount.getAndIncrement();
     tasksFailed.compareAndSet(false, true);
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestReconTaskControllerImpl.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestReconTaskControllerImpl.java
index 1668a1e9fb3..26e47f8f6c1 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestReconTaskControllerImpl.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestReconTaskControllerImpl.java
@@ -58,6 +58,7 @@
 import org.apache.ozone.recon.schema.generated.tables.daos.ReconTaskStatusDao;
 import org.apache.ozone.recon.schema.generated.tables.pojos.ReconTaskStatus;
 import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ozone.test.TestClock;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -69,6 +70,7 @@ public class TestReconTaskControllerImpl extends 
AbstractReconSqlDBTest {
 
   private ReconTaskController reconTaskController;
   private ReconTaskStatusDao reconTaskStatusDao;
+  private TestClock testClock;
 
   public TestReconTaskControllerImpl() {
     super();
@@ -91,9 +93,10 @@ public void setUp() throws IOException {
     ReconNamespaceSummaryManager nsSummaryManager = 
mock(ReconNamespaceSummaryManager.class);
     ReconGlobalStatsManager reconGlobalStatsManager = 
mock(ReconGlobalStatsManager.class);
     ReconFileMetadataManager reconFileMetadataManager = 
mock(ReconFileMetadataManager.class);
+    testClock = TestClock.newInstance();
     reconTaskController = new ReconTaskControllerImpl(ozoneConfiguration, new 
HashSet<>(),
         reconTaskStatusUpdaterManagerMock, reconDbProvider, reconContainerMgr, 
nsSummaryManager,
-        reconGlobalStatsManager, reconFileMetadataManager);
+        reconGlobalStatsManager, reconFileMetadataManager, testClock);
     reconTaskController.start();
   }
 
@@ -585,7 +588,7 @@ public void testNewRetryLogicWithMaxRetriesExceeded() 
throws Exception {
     // Iterations 1-6: should return RETRY_LATER and increment retry count
     for (int i = 1; i <= 6; i++) {
       if (i > 1) {
-        Thread.sleep(2100); // Wait for retry delay
+        testClock.fastForward(2100); // Advance virtual time past the retry 
delay
       }
       result = controllerSpy.queueReInitializationEvent(
           
ReconTaskReInitializationEvent.ReInitializationReason.BUFFER_OVERFLOW);
@@ -596,7 +599,7 @@ public void testNewRetryLogicWithMaxRetriesExceeded() 
throws Exception {
     
     // Iteration 7: should return MAX_RETRIES_EXCEEDED (eventProcessRetryCount 
is now 6,
     // which >= MAX_EVENT_PROCESS_RETRIES)
-    Thread.sleep(2100); // Wait for retry delay
+    testClock.fastForward(2100); // Advance virtual time past the retry delay
     result = controllerSpy.queueReInitializationEvent(
         ReconTaskReInitializationEvent.ReInitializationReason.BUFFER_OVERFLOW);
     
assertEquals(ReconTaskController.ReInitializationResult.MAX_RETRIES_EXCEEDED, 
result,
@@ -676,8 +679,8 @@ public void 
testProcessReInitializationEventWithTaskFailuresAndRetry() throws Ex
     // This simulates the behavior in 
OzoneManagerServiceProviderImpl#syncDataFromOM lines 680-692
     assertTrue(controllerSpy.hasTasksFailed(), "tasksFailed should still be 
true, triggering retry");
     
-    // Wait for retry delay before attempting to queue again (RETRY_DELAY_MS = 
2000)
-    Thread.sleep(2100);
+    // Advance virtual time past the retry delay before attempting to queue 
again (RETRY_DELAY_MS = 2000)
+    testClock.fastForward(2100);
     
     // Queue another reinitialization event (simulating what syncDataFromOM 
does)
     ReconTaskController.ReInitializationResult result = 
controllerSpy.queueReInitializationEvent(


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to