From 82ab49bc91dd1abcfba0fbe31e542e5ad322a6fd Mon Sep 17 00:00:00 2001 From: Max Lambrecht Date: Sat, 9 May 2026 14:32:29 -0500 Subject: [PATCH] fix(retry): preserve sub-second retry delays Signed-off-by: Max Lambrecht --- .../workloadapi/retry/RetryHandler.java | 2 +- .../workloadapi/retry/RetryHandlerTest.java | 29 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/java-spiffe-core/src/main/java/io/spiffe/workloadapi/retry/RetryHandler.java b/java-spiffe-core/src/main/java/io/spiffe/workloadapi/retry/RetryHandler.java index 6a80eec2..ccb637a8 100644 --- a/java-spiffe-core/src/main/java/io/spiffe/workloadapi/retry/RetryHandler.java +++ b/java-spiffe-core/src/main/java/io/spiffe/workloadapi/retry/RetryHandler.java @@ -39,7 +39,7 @@ public boolean scheduleRetry(final Runnable runnable) { } try { - executor.schedule(runnable, nextDelay.getSeconds(), TimeUnit.SECONDS); + executor.schedule(runnable, nextDelay.toMillis(), TimeUnit.MILLISECONDS); } catch (RejectedExecutionException e) { return false; } diff --git a/java-spiffe-core/src/test/java/io/spiffe/workloadapi/retry/RetryHandlerTest.java b/java-spiffe-core/src/test/java/io/spiffe/workloadapi/retry/RetryHandlerTest.java index 6d806abe..59b1e6c5 100644 --- a/java-spiffe-core/src/test/java/io/spiffe/workloadapi/retry/RetryHandlerTest.java +++ b/java-spiffe-core/src/test/java/io/spiffe/workloadapi/retry/RetryHandlerTest.java @@ -42,23 +42,38 @@ void testScheduleRetry_defaultPolicy() { assertTrue(retryHandler.scheduleRetry(runnable)); - verify(scheduledExecutorService).schedule(runnable, 1, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 1000, TimeUnit.MILLISECONDS); assertEquals(1, retryHandler.getRetryCount()); // second retry assertTrue(retryHandler.scheduleRetry(runnable)); assertEquals(2, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 2, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 2000, TimeUnit.MILLISECONDS); // third retry assertTrue(retryHandler.scheduleRetry(runnable)); assertEquals(3, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 4, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 4000, TimeUnit.MILLISECONDS); // fourth retry assertTrue(retryHandler.scheduleRetry(runnable)); assertEquals(4, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 8, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 8000, TimeUnit.MILLISECONDS); + } + + @Test + void testScheduleRetry_subSecondDelay_usesMilliseconds() { + Runnable runnable = () -> { }; + ExponentialBackoffPolicy exponentialBackoffPolicy = ExponentialBackoffPolicy.builder() + .initialDelay(Duration.ofMillis(250)) + .build(); + + RetryHandler retryHandler = new RetryHandler(exponentialBackoffPolicy, scheduledExecutorService); + + retryHandler.scheduleRetry(runnable); + + verify(scheduledExecutorService).schedule(runnable, 250, TimeUnit.MILLISECONDS); + assertEquals(1, retryHandler.getRetryCount()); } @Test @@ -70,18 +85,18 @@ void testScheduleRetry_maxRetries() { assertTrue(retryHandler.scheduleRetry(runnable)); - verify(scheduledExecutorService).schedule(runnable, 1, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 1000, TimeUnit.MILLISECONDS); assertEquals(1, retryHandler.getRetryCount()); // second retry assertTrue(retryHandler.scheduleRetry(runnable)); assertEquals(2, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 2, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 2000, TimeUnit.MILLISECONDS); // third retry assertTrue(retryHandler.scheduleRetry(runnable)); assertEquals(3, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 4, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 4000, TimeUnit.MILLISECONDS); Mockito.reset(scheduledExecutorService);