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]