From 35e71b808cd8deecc170056684b1d7c5df9885e8 Mon Sep 17 00:00:00 2001 From: lokeshAlamuri Date: Sat, 31 Aug 2024 16:22:10 +0530 Subject: [PATCH 1/4] Fix backOff API in UniformRandomBackOffPolicy When maxBackOffPeriod is less than minBackOffPeriod, delta is taken taken as zero in UniformRandomBackOffPolicy backOff method. --- .../backoff/UniformRandomBackOffPolicy.java | 2 +- .../UniformRandomBackOffPolicyTests.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java b/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java index 68249f7b..8bc96c06 100644 --- a/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java +++ b/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java @@ -134,7 +134,7 @@ public long getMaxBackOffPeriod() { protected void doBackOff() throws BackOffInterruptedException { try { Long min = this.minBackOffPeriod.get(); - long delta = this.maxBackOffPeriod.get() == this.minBackOffPeriod.get() ? 0 + long delta = this.maxBackOffPeriod.get() <= this.minBackOffPeriod.get() ? 0 : this.random.nextInt((int) (this.maxBackOffPeriod.get() - min)); this.sleeper.sleep(min + delta); } diff --git a/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java b/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java index 0ea18385..4fc311af 100644 --- a/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java +++ b/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java @@ -18,6 +18,9 @@ import org.junit.jupiter.api.Test; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -60,4 +63,23 @@ public void sleep(long backOffPeriod) throws InterruptedException { assertThat(Thread.interrupted()).isTrue(); } + @Test + public void testMaxBackOffLessThanMinBackOff() throws InterruptedException { + UniformRandomBackOffPolicy backOffPolicy = new UniformRandomBackOffPolicy(); + int minBackOff = 1000; + int maxBackOff = 10; + backOffPolicy.setMinBackOffPeriod(minBackOff); + backOffPolicy.setMaxBackOffPeriod(maxBackOff); + CountDownLatch stopLatch = new CountDownLatch(1); + + UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(new Sleeper() { + @Override + public void sleep(long backOffPeriod) throws InterruptedException { + stopLatch.countDown(); + } + }); + withSleeper.backOff(null); + assertThat(stopLatch.await(10, TimeUnit.SECONDS)).isTrue(); + } + } From d0c5887be7ce0b95d27a435f024883d2b240faf3 Mon Sep 17 00:00:00 2001 From: lokeshAlamuri Date: Sun, 1 Sep 2024 14:06:10 +0530 Subject: [PATCH 2/4] Update Junit to use DummySleeper --- .../backoff/UniformRandomBackOffPolicyTests.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java b/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java index 4fc311af..4ea5771b 100644 --- a/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java +++ b/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java @@ -18,9 +18,6 @@ import org.junit.jupiter.api.Test; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -70,16 +67,12 @@ public void testMaxBackOffLessThanMinBackOff() throws InterruptedException { int maxBackOff = 10; backOffPolicy.setMinBackOffPeriod(minBackOff); backOffPolicy.setMaxBackOffPeriod(maxBackOff); - CountDownLatch stopLatch = new CountDownLatch(1); - UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(new Sleeper() { - @Override - public void sleep(long backOffPeriod) throws InterruptedException { - stopLatch.countDown(); - } - }); + DummySleeper dummySleeper = new DummySleeper(); + UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper); + assertThat(dummySleeper.getBackOffs()).isEmpty(); withSleeper.backOff(null); - assertThat(stopLatch.await(10, TimeUnit.SECONDS)).isTrue(); + assertThat(dummySleeper.getBackOffs()).isNotEmpty(); } } From 972582fe36e8a80baf701f3904b263a6f549fb38 Mon Sep 17 00:00:00 2001 From: lokeshAlamuri Date: Sat, 7 Sep 2024 18:42:43 +0530 Subject: [PATCH 3/4] Extract UniformRandomBackOffPolicy backOffSuppliers in to local variables --- .../retry/backoff/UniformRandomBackOffPolicy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java b/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java index 8bc96c06..011213b5 100644 --- a/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java +++ b/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java @@ -134,8 +134,8 @@ public long getMaxBackOffPeriod() { protected void doBackOff() throws BackOffInterruptedException { try { Long min = this.minBackOffPeriod.get(); - long delta = this.maxBackOffPeriod.get() <= this.minBackOffPeriod.get() ? 0 - : this.random.nextInt((int) (this.maxBackOffPeriod.get() - min)); + Long max = this.minBackOffPeriod.get(); + long delta = max <= min ? 0 : this.random.nextInt((int) (max - min)); this.sleeper.sleep(min + delta); } catch (InterruptedException e) { From 6337de738d5a645cb7ae8c885686eb469ed226b2 Mon Sep 17 00:00:00 2001 From: lokeshAlamuri Date: Sat, 7 Sep 2024 19:15:34 +0530 Subject: [PATCH 4/4] Modify UniformRandomBackOffPolicy Junits --- .../retry/backoff/UniformRandomBackOffPolicy.java | 2 +- .../backoff/UniformRandomBackOffPolicyTests.java | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java b/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java index 011213b5..0f172b2b 100644 --- a/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java +++ b/src/main/java/org/springframework/retry/backoff/UniformRandomBackOffPolicy.java @@ -134,7 +134,7 @@ public long getMaxBackOffPeriod() { protected void doBackOff() throws BackOffInterruptedException { try { Long min = this.minBackOffPeriod.get(); - Long max = this.minBackOffPeriod.get(); + Long max = this.maxBackOffPeriod.get(); long delta = max <= min ? 0 : this.random.nextInt((int) (max - min)); this.sleeper.sleep(min + delta); } diff --git a/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java b/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java index 4ea5771b..4ba6ac44 100644 --- a/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java +++ b/src/test/java/org/springframework/retry/backoff/UniformRandomBackOffPolicyTests.java @@ -36,10 +36,18 @@ public void testSetSleeper() { int maxBackOff = 10000; backOffPolicy.setMinBackOffPeriod(minBackOff); backOffPolicy.setMaxBackOffPeriod(maxBackOff); - UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(new DummySleeper()); + + DummySleeper dummySleeper = new DummySleeper(); + UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper); assertThat(withSleeper.getMinBackOffPeriod()).isEqualTo(minBackOff); assertThat(withSleeper.getMaxBackOffPeriod()).isEqualTo(maxBackOff); + + assertThat(dummySleeper.getBackOffs()).isEmpty(); + withSleeper.backOff(null); + + assertThat(dummySleeper.getBackOffs()).hasSize(1); + assertThat(dummySleeper.getBackOffs()[0]).isLessThan(maxBackOff); } @Test @@ -61,7 +69,7 @@ public void sleep(long backOffPeriod) throws InterruptedException { } @Test - public void testMaxBackOffLessThanMinBackOff() throws InterruptedException { + public void testMaxBackOffLessThanMinBackOff() { UniformRandomBackOffPolicy backOffPolicy = new UniformRandomBackOffPolicy(); int minBackOff = 1000; int maxBackOff = 10; @@ -72,7 +80,8 @@ public void testMaxBackOffLessThanMinBackOff() throws InterruptedException { UniformRandomBackOffPolicy withSleeper = backOffPolicy.withSleeper(dummySleeper); assertThat(dummySleeper.getBackOffs()).isEmpty(); withSleeper.backOff(null); - assertThat(dummySleeper.getBackOffs()).isNotEmpty(); + assertThat(dummySleeper.getBackOffs()).hasSize(1); + assertThat(dummySleeper.getBackOffs()[0]).isEqualTo(minBackOff); } }