From cb255878453fc4e85a553b8ee1e74b2f9c741a88 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 29e3dff9..7341fb31 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 @@ -35,7 +35,7 @@ public void scheduleRetry(final Runnable runnable) { if (exponentialBackoffPolicy.reachedMaxRetries(retryCount)) { return; } - executor.schedule(runnable, nextDelay.getSeconds(), TimeUnit.SECONDS); + executor.schedule(runnable, nextDelay.toMillis(), TimeUnit.MILLISECONDS); nextDelay = exponentialBackoffPolicy.nextDelay(nextDelay); retryCount++; } 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 8d7a300a..cbf73d4f 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 @@ -32,23 +32,38 @@ void testScheduleRetry_defaultPolicy() { retryHandler.scheduleRetry(runnable); - verify(scheduledExecutorService).schedule(runnable, 1, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 1000, TimeUnit.MILLISECONDS); assertEquals(1, retryHandler.getRetryCount()); // second retry retryHandler.scheduleRetry(runnable); assertEquals(2, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 2, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 2000, TimeUnit.MILLISECONDS); // third retry retryHandler.scheduleRetry(runnable); assertEquals(3, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 4, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 4000, TimeUnit.MILLISECONDS); // fourth retry 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 @@ -60,18 +75,18 @@ void testScheduleRetry_maxRetries() { retryHandler.scheduleRetry(runnable); - verify(scheduledExecutorService).schedule(runnable, 1, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 1000, TimeUnit.MILLISECONDS); assertEquals(1, retryHandler.getRetryCount()); // second retry retryHandler.scheduleRetry(runnable); assertEquals(2, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 2, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 2000, TimeUnit.MILLISECONDS); // third retry retryHandler.scheduleRetry(runnable); assertEquals(3, retryHandler.getRetryCount()); - verify(scheduledExecutorService).schedule(runnable, 4, TimeUnit.SECONDS); + verify(scheduledExecutorService).schedule(runnable, 4000, TimeUnit.MILLISECONDS); Mockito.reset(scheduledExecutorService);