From 17168240befb9016205ef5ca7afbd3134e0e5e93 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Thu, 16 Feb 2023 11:16:38 +0200 Subject: [PATCH 01/27] failsafe 3 - update version, package names --- riptide-failsafe/pom.xml | 4 ++-- .../org/zalando/riptide/failsafe/BackupRequest.java | 6 +++--- .../riptide/failsafe/BackupRequestExecutor.java | 10 +++++----- .../riptide/failsafe/CompositeDelayFunction.java | 4 ++-- .../riptide/failsafe/CompositeRetryListener.java | 2 +- .../riptide/failsafe/CompositeTaskDecorator.java | 2 +- .../riptide/failsafe/ConditionalRequestPolicy.java | 2 +- .../zalando/riptide/failsafe/DefaultRequestPolicy.java | 2 +- .../org/zalando/riptide/failsafe/FailsafePlugin.java | 6 +++--- .../zalando/riptide/failsafe/LoggingRetryListener.java | 2 +- .../riptide/failsafe/RateLimitResetDelayFunction.java | 4 ++-- .../org/zalando/riptide/failsafe/RequestPolicies.java | 4 ++-- .../org/zalando/riptide/failsafe/RequestPolicy.java | 2 +- .../riptide/failsafe/RetryAfterDelayFunction.java | 4 ++-- .../org/zalando/riptide/failsafe/RetryListener.java | 2 +- .../zalando/riptide/failsafe/RetryRequestPolicy.java | 8 ++++---- .../org/zalando/riptide/failsafe/TaskDecorator.java | 2 +- .../metrics/MetricsCircuitBreakerListener.java | 8 ++++---- .../soap/PreserveContextClassLoaderTaskDecorator.java | 2 +- .../riptide/failsafe/CompositeDelayFunctionTest.java | 2 +- .../riptide/failsafe/CompositeRetryListenerTest.java | 6 +++--- .../failsafe/FailsafePluginCircuitBreakerTest.java | 4 ++-- .../riptide/failsafe/FailsafePluginRetriesTest.java | 4 ++-- .../failsafe/FailsafePluginRetryListenerTest.java | 6 +++--- .../riptide/failsafe/FailsafePluginTimeoutTest.java | 6 +++--- .../riptide/failsafe/LoggingRetryListenerTest.java | 4 ++-- .../failsafe/RateLimitResetDelayFunctionTest.java | 4 ++-- .../riptide/failsafe/RetryAfterDelayFunctionTest.java | 4 ++-- .../metrics/MetricsCircuitBreakerListenerTest.java | 2 +- 29 files changed, 59 insertions(+), 59 deletions(-) diff --git a/riptide-failsafe/pom.xml b/riptide-failsafe/pom.xml index d5b6d61bc..b0c35d4ff 100644 --- a/riptide-failsafe/pom.xml +++ b/riptide-failsafe/pom.xml @@ -17,7 +17,7 @@ Client side response routing - 2.4.3 + 3.3.0 @@ -31,7 +31,7 @@ riptide-idempotency - net.jodah + dev.failsafe failsafe ${failsafe.version} diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java index ef0d07272..5d5c587b5 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java @@ -2,9 +2,9 @@ import lombok.AllArgsConstructor; import lombok.Getter; -import net.jodah.failsafe.AbstractExecution; -import net.jodah.failsafe.Policy; -import net.jodah.failsafe.PolicyExecutor; +import dev.failsafe.AbstractExecution; +import dev.failsafe.Policy; +import dev.failsafe.spi.PolicyExecutor; import org.apiguardian.api.API; import java.util.concurrent.TimeUnit; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java index 4e5f33b9e..b55b87c17 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java @@ -1,10 +1,10 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.AbstractExecution; -import net.jodah.failsafe.ExecutionResult; -import net.jodah.failsafe.FailsafeFuture; -import net.jodah.failsafe.PolicyExecutor; -import net.jodah.failsafe.util.concurrent.Scheduler; +import dev.failsafe.AbstractExecution; +import dev.failsafe.spi.ExecutionResult; +import dev.failsafe.spi.FailsafeFuture; +import dev.failsafe.spi.PolicyExecutor; +import dev.failsafe.util.concurrent.Scheduler; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java index 6ea53ee8e..233f12df0 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.ExecutionContext; -import net.jodah.failsafe.function.DelayFunction; +import dev.failsafe.ExecutionContext; +import dev.failsafe.function.DelayFunction; import org.apiguardian.api.API; import java.time.Duration; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeRetryListener.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeRetryListener.java index be7adef54..540d9a893 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeRetryListener.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeRetryListener.java @@ -1,7 +1,7 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.event.ExecutionAttemptedEvent; +import dev.failsafe.event.ExecutionAttemptedEvent; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java index 9f8167663..bad6e15d8 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java @@ -1,7 +1,7 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.function.ContextualSupplier; +import dev.failsafe.function.ContextualSupplier; import java.util.Collection; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/ConditionalRequestPolicy.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/ConditionalRequestPolicy.java index bfba46d3a..ab318ffb2 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/ConditionalRequestPolicy.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/ConditionalRequestPolicy.java @@ -1,7 +1,7 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.Policy; +import dev.failsafe.Policy; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/DefaultRequestPolicy.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/DefaultRequestPolicy.java index 11d4e34bb..fe3c65b25 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/DefaultRequestPolicy.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/DefaultRequestPolicy.java @@ -1,7 +1,7 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.Policy; +import dev.failsafe.Policy; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java index 6e4b2cf50..4d60e499c 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java @@ -1,9 +1,9 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.Failsafe; -import net.jodah.failsafe.Policy; -import net.jodah.failsafe.function.ContextualSupplier; +import dev.failsafe.Failsafe; +import dev.failsafe.Policy; +import dev.failsafe.function.ContextualSupplier; import org.apiguardian.api.API; import org.organicdesign.fp.collections.ImList; import org.springframework.http.client.ClientHttpResponse; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java index 7ba7097dd..dded437e1 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java @@ -1,7 +1,7 @@ package org.zalando.riptide.failsafe; import lombok.AllArgsConstructor; -import net.jodah.failsafe.event.ExecutionAttemptedEvent; +import dev.failsafe.event.ExecutionAttemptedEvent; import org.apiguardian.api.API; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java index 6d782259b..42f1b3eab 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; import lombok.extern.slf4j.Slf4j; -import net.jodah.failsafe.ExecutionContext; -import net.jodah.failsafe.function.DelayFunction; +import dev.failsafe.ExecutionContext; +import dev.failsafe.function.DelayFunction; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.HttpResponseException; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicies.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicies.java index 38ce294a9..4ec2e8e90 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicies.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicies.java @@ -1,7 +1,7 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.Policy; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.Policy; +import dev.failsafe.RetryPolicy; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicy.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicy.java index f7688f29b..368abdd99 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicy.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RequestPolicy.java @@ -1,6 +1,6 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.Policy; +import dev.failsafe.Policy; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java index 4a8ee40c0..c236a842e 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java @@ -2,8 +2,8 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.jodah.failsafe.ExecutionContext; -import net.jodah.failsafe.function.DelayFunction; +import dev.failsafe.ExecutionContext; +import dev.failsafe.function.DelayFunction; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.HttpResponseException; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryListener.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryListener.java index 2e2da75c0..4e7d65b0c 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryListener.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryListener.java @@ -1,6 +1,6 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.event.ExecutionAttemptedEvent; +import dev.failsafe.event.ExecutionAttemptedEvent; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java index f8b1077a5..43c6699ae 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java @@ -2,10 +2,10 @@ import com.google.common.annotations.VisibleForTesting; import lombok.AllArgsConstructor; -import net.jodah.failsafe.Policy; -import net.jodah.failsafe.RetryPolicy; -import net.jodah.failsafe.event.ExecutionAttemptedEvent; -import net.jodah.failsafe.function.CheckedConsumer; +import dev.failsafe.Policy; +import dev.failsafe.RetryPolicy; +import dev.failsafe.event.ExecutionAttemptedEvent; +import dev.failsafe.function.CheckedConsumer; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java index 15faa5eb8..e1e3ac00d 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java @@ -1,6 +1,6 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.function.ContextualSupplier; +import dev.failsafe.function.ContextualSupplier; import org.apiguardian.api.API; import java.util.Arrays; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListener.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListener.java index 188341ce4..3b477e49f 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListener.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListener.java @@ -5,7 +5,7 @@ import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Timer.Sample; import lombok.AllArgsConstructor; -import net.jodah.failsafe.CircuitBreaker.State; +import dev.failsafe.CircuitBreaker.State; import org.apiguardian.api.API; import org.zalando.riptide.failsafe.CircuitBreakerListener; @@ -16,9 +16,9 @@ import static io.micrometer.core.instrument.Timer.start; import static java.util.Collections.singleton; import static lombok.AccessLevel.PRIVATE; -import static net.jodah.failsafe.CircuitBreaker.State.CLOSED; -import static net.jodah.failsafe.CircuitBreaker.State.HALF_OPEN; -import static net.jodah.failsafe.CircuitBreaker.State.OPEN; +import static dev.failsafe.CircuitBreaker.State.CLOSED; +import static dev.failsafe.CircuitBreaker.State.HALF_OPEN; +import static dev.failsafe.CircuitBreaker.State.OPEN; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.INTERNAL; diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java b/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java index 10dac6331..86ffa4748 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java @@ -1,6 +1,6 @@ package org.zalando.riptide.soap; -import net.jodah.failsafe.function.ContextualSupplier; +import dev.failsafe.function.ContextualSupplier; import org.apiguardian.api.API; import org.zalando.riptide.failsafe.TaskDecorator; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java index 1162a284e..e6fc32851 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java @@ -1,6 +1,6 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.function.DelayFunction; +import dev.failsafe.function.DelayFunction; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java index 5c254b4db..26b8f85ae 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; -import net.jodah.failsafe.Failsafe; -import net.jodah.failsafe.RetryPolicy; -import net.jodah.failsafe.event.ExecutionAttemptedEvent; +import dev.failsafe.Failsafe; +import dev.failsafe.RetryPolicy; +import dev.failsafe.event.ExecutionAttemptedEvent; import org.junit.jupiter.api.Test; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java index ecc59a80d..db949cdbf 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.CircuitBreakerOpenException; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.CircuitBreakerOpenException; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java index 32c69e32b..4fed49f06 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java @@ -5,8 +5,8 @@ import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; import lombok.SneakyThrows; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.RetryPolicy; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java index 2e3435716..e12e6ed05 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java @@ -5,9 +5,9 @@ import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; import lombok.SneakyThrows; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.RetryPolicy; -import net.jodah.failsafe.event.ExecutionAttemptedEvent; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.RetryPolicy; +import dev.failsafe.event.ExecutionAttemptedEvent; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginTimeoutTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginTimeoutTest.java index 8f7ea825b..b98ce468b 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginTimeoutTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginTimeoutTest.java @@ -5,9 +5,9 @@ import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; import com.google.common.collect.ImmutableList; -import net.jodah.failsafe.Policy; -import net.jodah.failsafe.Timeout; -import net.jodah.failsafe.TimeoutExceededException; +import dev.failsafe.Policy; +import dev.failsafe.Timeout; +import dev.failsafe.TimeoutExceededException; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.jupiter.api.AfterEach; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java index 57ab62a94..041915955 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; import com.google.gag.annotation.remark.Hack; -import net.jodah.failsafe.Failsafe; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.Failsafe; +import dev.failsafe.RetryPolicy; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.springframework.http.client.ClientHttpResponse; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java index 3857e9912..2f1dfbb18 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java @@ -5,8 +5,8 @@ import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; import com.google.common.base.Stopwatch; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.RetryPolicy; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java index f8a25d703..f95170508 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java @@ -5,8 +5,8 @@ import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; import com.google.common.base.Stopwatch; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.RetryPolicy; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java index 5fb5d59f5..a63261921 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java @@ -3,7 +3,7 @@ import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import net.jodah.failsafe.CircuitBreaker; +import dev.failsafe.CircuitBreaker; import org.junit.jupiter.api.Test; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.failsafe.CircuitBreakerListener; From ba34428b71e2317efdbe4ec1211ae0c66975c671 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Thu, 16 Feb 2023 11:26:57 +0200 Subject: [PATCH 02/27] failsafe 3 - fix package names --- .../org/zalando/riptide/failsafe/BackupRequestExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java index b55b87c17..1da2ab9ee 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java @@ -4,7 +4,7 @@ import dev.failsafe.spi.ExecutionResult; import dev.failsafe.spi.FailsafeFuture; import dev.failsafe.spi.PolicyExecutor; -import dev.failsafe.util.concurrent.Scheduler; +import dev.failsafe.spi.Scheduler; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; From ff2253359297edd8dee5b7c4d4ceb870ac3002cd Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Thu, 16 Feb 2023 14:25:44 +0200 Subject: [PATCH 03/27] failsafe 3 - replace DelayFunction with ContextualSupplier --- .../failsafe/CompositeDelayFunction.java | 22 ++++++++++++------- .../failsafe/RateLimitResetDelayFunction.java | 9 ++++---- .../failsafe/RetryAfterDelayFunction.java | 8 +++---- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java index 233f12df0..e42ca805e 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; +import dev.failsafe.function.ContextualSupplier; import lombok.AllArgsConstructor; import dev.failsafe.ExecutionContext; -import dev.failsafe.function.DelayFunction; import org.apiguardian.api.API; import java.time.Duration; @@ -12,25 +12,31 @@ import static org.apiguardian.api.API.Status.EXPERIMENTAL; +//TODO: rename functions variable? @API(status = EXPERIMENTAL) @AllArgsConstructor -public final class CompositeDelayFunction - implements DelayFunction { +public final class CompositeDelayFunction implements ContextualSupplier { - private final Collection> functions; + private final Collection> functions; @Override - public Duration computeDelay(final R result, final X failure, final ExecutionContext context) { + public Duration get(final ExecutionContext context) throws Throwable { return functions.stream() - .map(function -> function.computeDelay(result, failure, context)) + .map(function -> { + try { + return function.get(context); + } catch (Throwable e) { + throw new RuntimeException(e); + } + }) .filter(Objects::nonNull) .findFirst() .orElse(null); } @SafeVarargs - public static DelayFunction composite( - final DelayFunction... functions) { + public static ContextualSupplier composite( + final ContextualSupplier... functions) { return new CompositeDelayFunction<>(Arrays.asList(functions)); } diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java index 42f1b3eab..0d2615f07 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; +import dev.failsafe.function.ContextualSupplier; import lombok.extern.slf4j.Slf4j; import dev.failsafe.ExecutionContext; -import dev.failsafe.function.DelayFunction; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.HttpResponseException; @@ -19,7 +19,7 @@ */ @API(status = EXPERIMENTAL) @Slf4j -public final class RateLimitResetDelayFunction implements DelayFunction { +public final class RateLimitResetDelayFunction implements ContextualSupplier { private final DelayParser parser; @@ -30,9 +30,10 @@ public RateLimitResetDelayFunction(final Clock clock) { )); } + //TODO: check getLastException usage @Override - public Duration computeDelay(final ClientHttpResponse result, final Throwable failure, final ExecutionContext context) { - return Optional.ofNullable(failure) + public Duration get(final ExecutionContext context) { + return Optional.ofNullable(context.getLastException()) .filter(HttpResponseException.class::isInstance) .map(HttpResponseException.class::cast) .map(response -> response.getResponseHeaders().getFirst("X-RateLimit-Reset")) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java index c236a842e..a78dbaa54 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java @@ -1,9 +1,9 @@ package org.zalando.riptide.failsafe; +import dev.failsafe.function.ContextualSupplier; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import dev.failsafe.ExecutionContext; -import dev.failsafe.function.DelayFunction; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.HttpResponseException; @@ -22,7 +22,7 @@ @API(status = EXPERIMENTAL) @Slf4j @AllArgsConstructor(access = PRIVATE) -public final class RetryAfterDelayFunction implements DelayFunction { +public final class RetryAfterDelayFunction implements ContextualSupplier { private final DelayParser parser; @@ -34,8 +34,8 @@ public RetryAfterDelayFunction(final Clock clock) { } @Override - public Duration computeDelay(final ClientHttpResponse result, final Throwable failure, final ExecutionContext context) { - return Optional.ofNullable(failure) + public Duration get(final ExecutionContext context) { + return Optional.ofNullable(context.getLastException()) .filter(HttpResponseException.class::isInstance) .map(HttpResponseException.class::cast) .map(response -> response.getResponseHeaders().getFirst("Retry-After")) From dfb5edb1e419efe70f7378e93591403ed65c2b76 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Fri, 17 Feb 2023 14:45:18 +0200 Subject: [PATCH 04/27] failsafe 3 - fix ContextualSupplier usage --- .../org/zalando/riptide/failsafe/CompositeTaskDecorator.java | 4 ++-- .../java/org/zalando/riptide/failsafe/FailsafePlugin.java | 4 ++-- .../org/zalando/riptide/failsafe/LoggingRetryListener.java | 4 ++-- .../main/java/org/zalando/riptide/failsafe/TaskDecorator.java | 2 +- .../riptide/soap/PreserveContextClassLoaderTaskDecorator.java | 2 +- .../org/zalando/riptide/opentracing/TracedTaskDecorator.java | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java index bad6e15d8..43c010985 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeTaskDecorator.java @@ -11,8 +11,8 @@ final class CompositeTaskDecorator implements TaskDecorator { private final Collection decorators; @Override - public ContextualSupplier decorate(final ContextualSupplier supplier) { - ContextualSupplier result = supplier; + public ContextualSupplier decorate(final ContextualSupplier supplier) { + ContextualSupplier result = supplier; for (final TaskDecorator decorator : decorators) { result = decorator.decorate(result); } diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java index 4d60e499c..e47321020 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/FailsafePlugin.java @@ -12,7 +12,7 @@ import org.zalando.riptide.RequestExecution; import java.util.List; -import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; import java.util.function.Predicate; import static java.util.stream.Collectors.toList; @@ -64,7 +64,7 @@ public RequestExecution aroundAsync(final RequestExecution execution) { }; } - private ContextualSupplier> decorate( + private ContextualSupplier> decorate( final RequestExecution execution, final RequestArguments arguments) { final TaskDecorator decorator = TaskDecorator.composite(decorators); diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java index dded437e1..875cc4302 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/LoggingRetryListener.java @@ -24,8 +24,8 @@ public LoggingRetryListener() { public void onRetry(final RequestArguments arguments, final ExecutionAttemptedEvent event) { - if (event.getLastFailure() != null) { - logger.warn("Retrying failure", event.getLastFailure()); + if (event.getLastException() != null) { + logger.warn("Retrying failure", event.getLastException()); } } diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java index e1e3ac00d..ef9a8754a 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/TaskDecorator.java @@ -12,7 +12,7 @@ @FunctionalInterface public interface TaskDecorator { - ContextualSupplier decorate(ContextualSupplier supplier); + ContextualSupplier decorate(ContextualSupplier supplier); static TaskDecorator identity() { return composite(); diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java b/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java index 86ffa4748..f71b57b7f 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/soap/PreserveContextClassLoaderTaskDecorator.java @@ -13,7 +13,7 @@ public final class PreserveContextClassLoaderTaskDecorator implements TaskDecorator { @Override - public ContextualSupplier decorate(final ContextualSupplier supplier) { + public ContextualSupplier decorate(final ContextualSupplier supplier) { final ClassLoader invokingThreadCL = Thread.currentThread().getContextClassLoader(); return context -> { final ClassLoader originalCL = Thread.currentThread().getContextClassLoader(); diff --git a/riptide-opentracing/src/main/java/org/zalando/riptide/opentracing/TracedTaskDecorator.java b/riptide-opentracing/src/main/java/org/zalando/riptide/opentracing/TracedTaskDecorator.java index 21577a5f3..885ab5cd1 100644 --- a/riptide-opentracing/src/main/java/org/zalando/riptide/opentracing/TracedTaskDecorator.java +++ b/riptide-opentracing/src/main/java/org/zalando/riptide/opentracing/TracedTaskDecorator.java @@ -4,7 +4,7 @@ import io.opentracing.Span; import io.opentracing.Tracer; import lombok.AllArgsConstructor; -import net.jodah.failsafe.function.ContextualSupplier; +import dev.failsafe.function.ContextualSupplier; import org.apiguardian.api.API; import org.zalando.riptide.failsafe.TaskDecorator; @@ -17,7 +17,7 @@ public final class TracedTaskDecorator implements TaskDecorator { private final Tracer tracer; @Override - public ContextualSupplier decorate(final ContextualSupplier supplier) { + public ContextualSupplier decorate(final ContextualSupplier supplier) { final Span span = tracer.activeSpan(); return context -> { From 209568cedc461376d5a495d9cbc3dc73f3347e98 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 22 Feb 2023 12:13:23 +0200 Subject: [PATCH 05/27] failsafe 3 - not use AbstractExecution --- .../riptide/failsafe/BackupRequest.java | 18 +++++---- .../failsafe/BackupRequestExecutor.java | 37 +++++++++++-------- .../autoconfigure/ManualConfiguration.java | 6 +-- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java index 5d5c587b5..edcb3b4e0 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java @@ -1,8 +1,8 @@ package org.zalando.riptide.failsafe; +import dev.failsafe.PolicyConfig; import lombok.AllArgsConstructor; import lombok.Getter; -import dev.failsafe.AbstractExecution; import dev.failsafe.Policy; import dev.failsafe.spi.PolicyExecutor; import org.apiguardian.api.API; @@ -19,16 +19,20 @@ public final class BackupRequest implements Policy { private final long delay; private final TimeUnit unit; + @Override + public PolicyConfig getConfig() { + //TODO: impl + return null; + } + @Override @SuppressWarnings("unchecked") - public PolicyExecutor> toExecutor( - final AbstractExecution execution) { - return (PolicyExecutor>) create(execution); + public PolicyExecutor toExecutor(int policyIndex) { + return create(policyIndex); } - private PolicyExecutor> create( - final AbstractExecution execution) { - return new BackupRequestExecutor(this, execution); + private PolicyExecutor create(int policyIndex) { + return new BackupRequestExecutor<>(this, policyIndex); } } diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java index 1da2ab9ee..697cf7606 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java @@ -1,6 +1,6 @@ package org.zalando.riptide.failsafe; -import dev.failsafe.AbstractExecution; +import dev.failsafe.spi.AsyncExecutionInternal; import dev.failsafe.spi.ExecutionResult; import dev.failsafe.spi.FailsafeFuture; import dev.failsafe.spi.PolicyExecutor; @@ -12,27 +12,31 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; -import java.util.function.Supplier; +import java.util.function.Function; import static org.zalando.riptide.CompletableFutures.forwardTo; -final class BackupRequestExecutor extends PolicyExecutor> { +final class BackupRequestExecutor extends PolicyExecutor { - BackupRequestExecutor(final BackupRequest policy, final AbstractExecution execution) { - super(policy, execution); + //TODO: correct usage? + private final BackupRequest policy; + + BackupRequestExecutor(final BackupRequest policy, int policyIndex) { + super(policy, policyIndex); + this.policy = policy; } @Override - protected Supplier> supplyAsync( - final Supplier> supplier, + public Function, CompletableFuture>> applyAsync( + Function, CompletableFuture>> innerFn, final Scheduler scheduler, - final FailsafeFuture future) { + final FailsafeFuture future) { - return () -> { - final CompletableFuture original = supplier.get(); - final CompletableFuture backup = new CompletableFuture<>(); + return (asyncExecutionInternal) -> { + final CompletableFuture> original = innerFn.apply(asyncExecutionInternal); + final CompletableFuture> backup = new CompletableFuture<>(); - final Future scheduledBackup = delay(scheduler, backup(supplier, backup)); + final Future scheduledBackup = delay(scheduler, backup(innerFn, asyncExecutionInternal, backup)); original.whenComplete(cancel(scheduledBackup)); backup.whenComplete(cancel(original)); @@ -41,11 +45,12 @@ protected Supplier> supplyAsync( }; } - private Callable> backup( - final Supplier> supplier, - final CompletableFuture target) { + private Callable>> backup( + final Function, CompletableFuture>> innerFn, + final AsyncExecutionInternal asyncExecutionInternal, + final CompletableFuture> target) { - return () -> supplier.get().whenComplete(forwardTo(target)); + return () -> innerFn.apply(asyncExecutionInternal).whenComplete(forwardTo(target)); } @SuppressWarnings("unchecked") diff --git a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java index 868f9aa4e..7813561ed 100644 --- a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java +++ b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java @@ -7,9 +7,9 @@ import io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics; import io.opentracing.Tracer; import io.opentracing.contrib.concurrent.TracedExecutorService; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.RetryPolicy; -import net.jodah.failsafe.Timeout; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.RetryPolicy; +import dev.failsafe.Timeout; import org.apache.http.client.config.RequestConfig; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.HttpClientBuilder; From 599f8cf3edff52617493b5a7ebfaf1a0d20b82ad Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 22 Feb 2023 14:59:41 +0200 Subject: [PATCH 06/27] failsafe 3 - fix tests --- .../riptide/failsafe/RetryRequestPolicy.java | 9 ++-- .../failsafe/CompositeDelayFunctionTest.java | 49 +++++++++++-------- .../failsafe/CompositeRetryListenerTest.java | 9 ++-- .../FailsafePluginCircuitBreakerTest.java | 5 +- .../failsafe/FailsafePluginRetriesTest.java | 25 ++++++---- .../FailsafePluginRetryListenerTest.java | 10 ++-- .../failsafe/LoggingRetryListenerTest.java | 10 ++-- .../RateLimitResetDelayFunctionTest.java | 12 +++-- .../failsafe/RetryAfterDelayFunctionTest.java | 10 ++-- .../MetricsCircuitBreakerListenerTest.java | 9 ++-- 10 files changed, 88 insertions(+), 60 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java index 43c6699ae..084875c35 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryRequestPolicy.java @@ -1,11 +1,11 @@ package org.zalando.riptide.failsafe; import com.google.common.annotations.VisibleForTesting; +import dev.failsafe.event.EventListener; import lombok.AllArgsConstructor; import dev.failsafe.Policy; import dev.failsafe.RetryPolicy; import dev.failsafe.event.ExecutionAttemptedEvent; -import dev.failsafe.function.CheckedConsumer; import org.apiguardian.api.API; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.RequestArguments; @@ -46,14 +46,15 @@ public boolean applies(final RequestArguments arguments) { public Policy prepare( final RequestArguments arguments) { - return policy.copy().onFailedAttempt( - new RetryListenerAdapter(listener, arguments)); + return RetryPolicy.builder(policy.getConfig()) + .onFailedAttempt(new RetryListenerAdapter(listener, arguments)) + .build(); } @VisibleForTesting @AllArgsConstructor static final class RetryListenerAdapter implements - CheckedConsumer> { + EventListener> { private final RetryListener listener; private final RequestArguments arguments; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java index e6fc32851..103124b27 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java @@ -1,6 +1,7 @@ package org.zalando.riptide.failsafe; -import dev.failsafe.function.DelayFunction; +import dev.failsafe.ExecutionContext; +import dev.failsafe.function.ContextualSupplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,52 +14,60 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.zalando.riptide.failsafe.CompositeDelayFunction.composite; @ExtendWith(MockitoExtension.class) final class CompositeDelayFunctionTest { - private final DelayFunction first; - private final DelayFunction second; - private final DelayFunction unit; + private final ContextualSupplier first; + private final ContextualSupplier second; + private final ContextualSupplier unit; + private final ExecutionContext firstContext; + private final ExecutionContext secondContext; CompositeDelayFunctionTest( - @Mock final DelayFunction first, - @Mock final DelayFunction second) { + @Mock final ContextualSupplier first, + @Mock final ContextualSupplier second, + @Mock final ExecutionContext firstContext, + @Mock final ExecutionContext secondContext) { this.first = first; this.second = second; + this.firstContext = firstContext; + this.secondContext = secondContext; this.unit = composite(first, second); } @BeforeEach - void defaultBehavior() { + void defaultBehavior() throws Throwable { // starting with Mockito 3.4.4, mocks will return Duration.ZERO instead of null, by default - when(first.computeDelay(any(), any(), any())).thenReturn(null); - when(second.computeDelay(any(), any(), any())).thenReturn(null); + when(first.get(any())).thenReturn(null); + when(first.get(any())).thenReturn(null); } @Test - void shouldUseFirstNonNullDelay() { - when(first.computeDelay(eq("1"), any(), any())).thenReturn(Duration.ofSeconds(1)); - when(second.computeDelay(eq("2"), any(), any())).thenReturn(Duration.ofSeconds(2)); + void shouldUseFirstNonNullDelay() throws Throwable { - assertEquals(Duration.ofSeconds(1), unit.computeDelay("1", null, null)); + when(first.get(eq(firstContext))).thenReturn(Duration.ofSeconds(1)); + when(second.get(eq(secondContext))).thenReturn(Duration.ofSeconds(2)); + + assertEquals(Duration.ofSeconds(1), unit.get(firstContext)); } @Test - void shouldIgnoreNullDelay() { - when(second.computeDelay(eq("2"), any(), any())).thenReturn(Duration.ofSeconds(2)); + void shouldIgnoreNullDelay() throws Throwable { + when(second.get(eq(secondContext))).thenReturn(Duration.ofSeconds(2)); - assertEquals(Duration.ofSeconds(2), unit.computeDelay("2", null, null)); + assertEquals(Duration.ofSeconds(2), unit.get(secondContext)); } @Test - void shouldFallbackToNullDelay() { - when(first.computeDelay(eq("1"), any(), any())).thenReturn(Duration.ofSeconds(1)); - when(second.computeDelay(eq("2"), any(), any())).thenReturn(Duration.ofSeconds(2)); + void shouldFallbackToNullDelay() throws Throwable { + when(first.get(eq(firstContext))).thenReturn(Duration.ofSeconds(1)); + when(second.get(eq(secondContext))).thenReturn(Duration.ofSeconds(2)); - assertNull(unit.computeDelay("3", null, null)); + assertNull(unit.get(mock(ExecutionContext.class))); } } diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java index 26b8f85ae..8ca9460b1 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeRetryListenerTest.java @@ -31,9 +31,10 @@ void shouldPropagateRetryToEveryListener() { final RequestArguments arguments = RequestArguments.create(); final IllegalStateException exception = new IllegalStateException(); - Failsafe.with(new RetryPolicy() + Failsafe.with(RetryPolicy.builder() .withMaxRetries(3) - .onRetry(new RetryRequestPolicy.RetryListenerAdapter(unit, arguments))) + .onRetry(new RetryRequestPolicy.RetryListenerAdapter(unit, arguments)) + .build()) .run(() -> { if (!success.getAndSet(true)) { throw exception; @@ -41,9 +42,9 @@ void shouldPropagateRetryToEveryListener() { }); verify(first).onRetry(eq(arguments), argThat(hasFeature(ExecutionAttemptedEvent::getLastResult, nullValue()))); - verify(first).onRetry(eq(arguments), argThat(hasFeature(ExecutionAttemptedEvent::getLastFailure, notNullValue()))); + verify(first).onRetry(eq(arguments), argThat(hasFeature(ExecutionAttemptedEvent::getLastException, notNullValue()))); verify(second).onRetry(eq(arguments), argThat(hasFeature(ExecutionAttemptedEvent::getLastResult, nullValue()))); - verify(second).onRetry(eq(arguments), argThat(hasFeature(ExecutionAttemptedEvent::getLastFailure, notNullValue()))); + verify(second).onRetry(eq(arguments), argThat(hasFeature(ExecutionAttemptedEvent::getLastException, notNullValue()))); } } diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java index db949cdbf..589623926 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginCircuitBreakerTest.java @@ -52,8 +52,9 @@ final class FailsafePluginCircuitBreakerTest { .baseUrl(driver.getBaseUrl()) .converter(createJsonConverter()) .plugin(new FailsafePlugin() - .withPolicy(new CircuitBreaker() - .withDelay(Duration.ofSeconds(1))) + .withPolicy(CircuitBreaker.builder() + .withDelay(Duration.ofSeconds(1)) + .build()) .withDecorator(composite( TaskDecorator.identity(), new PreserveContextClassLoaderTaskDecorator() diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java index 4fed49f06..7556dc66d 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java @@ -86,23 +86,27 @@ public RequestExecution aroundNetwork(final RequestExecution execution) { }) .plugin(new FailsafePlugin() .withPolicy(new RetryRequestPolicy( - new RetryPolicy() - .handleIf(transientSocketFaults()) + RetryPolicy.builder() + // TODO: fix transientSocketFaults + //.handleIf(transientSocketFaults()) .handle(RetryException.class) .handleResultIf(this::isBadGateway) .withDelay(Duration.ofMillis(500)) - .withMaxRetries(4)) + .withMaxRetries(4) + .build()) .withPredicate(new IdempotencyPredicate())) .withPolicy(new RetryRequestPolicy( - new RetryPolicy() - .handleIf(transientConnectionFaults()) + RetryPolicy.builder() + //.handleIf(transientConnectionFaults()) .withDelay(Duration.ofMillis(500)) - .withMaxRetries(4)) + .withMaxRetries(4) + .build()) .withPredicate(alwaysTrue())) - .withPolicy(new CircuitBreaker() + .withPolicy(CircuitBreaker.builder() .withFailureThreshold(5, 10) .withSuccessThreshold(5) - .withDelay(Duration.ofMinutes(1)))) + .withDelay(Duration.ofMinutes(1)) + .build())) .build(); @SneakyThrows @@ -166,9 +170,10 @@ void shouldRetryCustomDetectedIdempotentRequest() { .converter(createJsonConverter()) .plugin(new FailsafePlugin().withPolicy( new RetryRequestPolicy( - new RetryPolicy() + RetryPolicy.builder() .withDelay(Duration.ofMillis(500)) - .withMaxRetries(1)) + .withMaxRetries(1) + .build()) .withPredicate(arguments -> arguments.getHeaders().getOrDefault("Idempotent", emptyList()).contains( diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java index e12e6ed05..aacfbd85c 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetryListenerTest.java @@ -75,16 +75,18 @@ final class FailsafePluginRetryListenerTest { .converter(createJsonConverter()) .plugin(new FailsafePlugin() .withPolicy(new RetryRequestPolicy( - new RetryPolicy() + RetryPolicy.builder() .withDelay(Duration.ofMillis(500)) .withMaxRetries(4) .handle(Exception.class) - .handleResultIf(this::isBadGateway)) + .handleResultIf(this::isBadGateway) + .build()) .withListener(listeners)) - .withPolicy(new CircuitBreaker() + .withPolicy(CircuitBreaker.builder() .withFailureThreshold(3, 10) .withSuccessThreshold(5) - .withDelay(Duration.ofMinutes(1)))) + .withDelay(Duration.ofMinutes(1)) + .build())) .build(); @SneakyThrows diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java index 041915955..6187e52fa 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/LoggingRetryListenerTest.java @@ -30,9 +30,10 @@ void shouldLogFailure() { final RequestArguments arguments = RequestArguments.create(); final IllegalStateException exception = new IllegalStateException(); - Failsafe.with(new RetryPolicy() + Failsafe.with(RetryPolicy.builder() .withMaxRetries(3) - .onRetry(new RetryListenerAdapter(unit, arguments))) + .onRetry(new RetryListenerAdapter(unit, arguments)) + .build()) .run(() -> { if (!success.getAndSet(true)) { throw exception; @@ -48,10 +49,11 @@ void shouldNotLogResults() { final RequestArguments arguments = RequestArguments.create(); - Failsafe.with(new RetryPolicy() + Failsafe.with(RetryPolicy.builder() .withMaxRetries(3) .handleResultIf(Objects::isNull) - .onRetry(new RetryListenerAdapter(unit, arguments))) + .onRetry(new RetryListenerAdapter(unit, arguments)) + .build()) .get(() -> { if (!success.getAndSet(true)) { return null; diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java index 2f1dfbb18..0dcb16d88 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java @@ -6,6 +6,7 @@ import com.github.restdriver.clientdriver.ClientDriverFactory; import com.google.common.base.Stopwatch; import dev.failsafe.CircuitBreaker; +import dev.failsafe.CircuitBreakerBuilder; import dev.failsafe.RetryPolicy; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.CloseableHttpClient; @@ -56,12 +57,15 @@ final class RateLimitResetDelayFunctionTest { .baseUrl(driver.getBaseUrl()) .converter(createJsonConverter()) .plugin(new FailsafePlugin() - .withPolicy(new CircuitBreaker<>()) - .withPolicy(new RetryPolicy() + .withPolicy(CircuitBreaker.builder() + .build()) + .withPolicy(RetryPolicy.builder() .withDelay(Duration.ofSeconds(2)) - .withDelay(new RateLimitResetDelayFunction(clock)) + // TODO: check delay + //.withDelay(new RateLimitResetDelayFunction(clock)) .withMaxDuration(Duration.ofSeconds(5)) - .withMaxRetries(4))) + .withMaxRetries(4) + .build())) .build(); private static MappingJackson2HttpMessageConverter createJsonConverter() { diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java index f95170508..06147d5b9 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java @@ -56,12 +56,14 @@ final class RetryAfterDelayFunctionTest { .baseUrl(driver.getBaseUrl()) .converter(createJsonConverter()) .plugin(new FailsafePlugin() - .withPolicy(new CircuitBreaker<>()) - .withPolicy(new RetryPolicy() + .withPolicy(CircuitBreaker.builder().build()) + .withPolicy(RetryPolicy.builder() .withDelay(Duration.ofSeconds(2)) - .withDelay(new RetryAfterDelayFunction(clock)) + // TODO: check delay + //.withDelay(new RetryAfterDelayFunction(clock)) .withMaxDuration(Duration.ofSeconds(5)) - .withMaxRetries(4))) + .withMaxRetries(4) + .build())) .build(); private static MappingJackson2HttpMessageConverter createJsonConverter() { diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java index a63261921..71513cae7 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/metrics/MetricsCircuitBreakerListenerTest.java @@ -25,10 +25,11 @@ final class MetricsCircuitBreakerListenerTest { .withMetricName("circuit-breakers") .withDefaultTags(Tag.of("test", "true")); - private final CircuitBreaker breaker = new CircuitBreaker() - .onOpen(unit::onOpen) - .onHalfOpen(unit::onHalfOpen) - .onClose(unit::onClose); + private final CircuitBreaker breaker = CircuitBreaker.builder() + .onOpen((event) -> unit.onOpen()) + .onHalfOpen((event) -> unit.onHalfOpen()) + .onClose((event) -> unit.onClose()) + .build(); @Test void shouldRecordOpen() { From 25aff4e681f67ce776d34e9e7232dfe251b3288a Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 22 Feb 2023 16:36:38 +0200 Subject: [PATCH 07/27] failsafe 3 - fix tests --- .../org/zalando/riptide/failsafe/BackupRequest.java | 12 ++++++++++-- .../riptide/failsafe/FailsafePluginRetriesTest.java | 8 ++++++-- .../failsafe/RateLimitResetDelayFunctionTest.java | 3 +-- .../failsafe/RetryAfterDelayFunctionTest.java | 3 +-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java index edcb3b4e0..d3c0899a6 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java @@ -1,12 +1,18 @@ package org.zalando.riptide.failsafe; +import dev.failsafe.DelayablePolicyConfig; import dev.failsafe.PolicyConfig; +import dev.failsafe.RetryPolicy; +import dev.failsafe.RetryPolicyBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import dev.failsafe.Policy; import dev.failsafe.spi.PolicyExecutor; import org.apiguardian.api.API; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalUnit; import java.util.concurrent.TimeUnit; import static org.apiguardian.api.API.Status.EXPERIMENTAL; @@ -21,8 +27,10 @@ public final class BackupRequest implements Policy { @Override public PolicyConfig getConfig() { - //TODO: impl - return null; + //TODO: move to param, add unit -> ChronoUnit conversion + return RetryPolicy.builder() + .withDelay(Duration.of (delay, ChronoUnit.SECONDS) ) + .build().getConfig(); } @Override diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java index 7556dc66d..9270b0682 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; +import dev.failsafe.function.CheckedPredicate; import lombok.SneakyThrows; import dev.failsafe.CircuitBreaker; import dev.failsafe.RetryPolicy; @@ -29,6 +30,7 @@ import java.util.UUID; import java.util.concurrent.CompletionException; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; import static com.github.restdriver.clientdriver.ClientDriverRequest.Method.POST; import static com.github.restdriver.clientdriver.RestClientDriver.giveEmptyResponse; @@ -70,6 +72,9 @@ final class FailsafePluginRetriesTest { private final AtomicInteger attempt = new AtomicInteger(); + Predicate predicate = transientSocketFaults(); + CheckedPredicate checkedPredicate = t -> predicate.test(t); + private final Http unit = Http.builder() .executor(newFixedThreadPool(2)) // to allow for nested calls .requestFactory(new ApacheClientHttpRequestFactory(client)) @@ -87,8 +92,7 @@ public RequestExecution aroundNetwork(final RequestExecution execution) { .plugin(new FailsafePlugin() .withPolicy(new RetryRequestPolicy( RetryPolicy.builder() - // TODO: fix transientSocketFaults - //.handleIf(transientSocketFaults()) + .handleIf(checkedPredicate) .handle(RetryException.class) .handleResultIf(this::isBadGateway) .withDelay(Duration.ofMillis(500)) diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java index 0dcb16d88..025025795 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunctionTest.java @@ -61,8 +61,7 @@ final class RateLimitResetDelayFunctionTest { .build()) .withPolicy(RetryPolicy.builder() .withDelay(Duration.ofSeconds(2)) - // TODO: check delay - //.withDelay(new RateLimitResetDelayFunction(clock)) + .withDelayFn(new RateLimitResetDelayFunction(clock)) .withMaxDuration(Duration.ofSeconds(5)) .withMaxRetries(4) .build())) diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java index 06147d5b9..da2796201 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/RetryAfterDelayFunctionTest.java @@ -59,8 +59,7 @@ final class RetryAfterDelayFunctionTest { .withPolicy(CircuitBreaker.builder().build()) .withPolicy(RetryPolicy.builder() .withDelay(Duration.ofSeconds(2)) - // TODO: check delay - //.withDelay(new RetryAfterDelayFunction(clock)) + .withDelayFn(new RetryAfterDelayFunction(clock)) .withMaxDuration(Duration.ofSeconds(5)) .withMaxRetries(4) .build())) From 6bf111c9dec8c8d23e501e19d0bac2838917d142 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 22 Feb 2023 17:45:21 +0200 Subject: [PATCH 08/27] failsafe 3 - fix tests --- .../failsafe/RateLimitResetDelayFunction.java | 3 ++- .../riptide/failsafe/RetryAfterDelayFunction.java | 3 ++- .../riptide/failsafe/FailsafePluginRetriesTest.java | 12 +++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java index 0d2615f07..93e86693b 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java @@ -38,7 +38,8 @@ public Duration get(final ExecutionContext context) { .map(HttpResponseException.class::cast) .map(response -> response.getResponseHeaders().getFirst("X-RateLimit-Reset")) .map(parser::parse) - .orElse(null); + //TODO: workaround for DelayablePolicy line 52 NPE in Durations.ofSafeNanos( + .orElse(Duration.ofMinutes(-1)); } } diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java index a78dbaa54..0bfae61ea 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java @@ -40,7 +40,8 @@ public Duration get(final ExecutionContext context) { .map(HttpResponseException.class::cast) .map(response -> response.getResponseHeaders().getFirst("Retry-After")) .map(parser::parse) - .orElse(null); + //TODO: workaround for DelayablePolicy line 52 NPE in Durations.ofSafeNanos( + .orElse(Duration.ofMinutes(-1)); } } diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java index 9270b0682..5e2913cf8 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java @@ -72,9 +72,11 @@ final class FailsafePluginRetriesTest { private final AtomicInteger attempt = new AtomicInteger(); - Predicate predicate = transientSocketFaults(); - CheckedPredicate checkedPredicate = t -> predicate.test(t); - + //TODO: add wrapper class to convert predicate to CheckedPredicate ? + private final Predicate transientSocketFaults = transientSocketFaults(); + private final CheckedPredicate transientSocketFaultsPredicate = t -> transientSocketFaults.test(t); + private final Predicate transientConnectionFaults = transientConnectionFaults(); + private final CheckedPredicate transientConnectionFaultsPredicate = t -> transientConnectionFaults.test(t); private final Http unit = Http.builder() .executor(newFixedThreadPool(2)) // to allow for nested calls .requestFactory(new ApacheClientHttpRequestFactory(client)) @@ -92,7 +94,7 @@ public RequestExecution aroundNetwork(final RequestExecution execution) { .plugin(new FailsafePlugin() .withPolicy(new RetryRequestPolicy( RetryPolicy.builder() - .handleIf(checkedPredicate) + .handleIf(transientSocketFaultsPredicate) .handle(RetryException.class) .handleResultIf(this::isBadGateway) .withDelay(Duration.ofMillis(500)) @@ -101,7 +103,7 @@ public RequestExecution aroundNetwork(final RequestExecution execution) { .withPredicate(new IdempotencyPredicate())) .withPolicy(new RetryRequestPolicy( RetryPolicy.builder() - //.handleIf(transientConnectionFaults()) + .handleIf(transientConnectionFaultsPredicate) .withDelay(Duration.ofMillis(500)) .withMaxRetries(4) .build()) From 3b87debb6f88291ecded08f12988be3fd15d6bed Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Sun, 26 Feb 2023 14:15:19 +0200 Subject: [PATCH 09/27] failsafe 3 - fix other modules --- .../micrometer/MicrometerPluginTest.java | 2 +- .../OpenTelemetryPluginRetryTest.java | 2 +- .../OpenTracingPluginRetryTest.java | 2 +- riptide-spring-boot-autoconfigure/pom.xml | 2 +- .../DefaultRiptideRegistrar.java | 4 +- .../autoconfigure/FailsafePluginFactory.java | 101 +++++++++++------- .../autoconfigure/CircuitBreakerTest.java | 2 +- 7 files changed, 67 insertions(+), 48 deletions(-) diff --git a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java index 4f2195965..2c4e498f6 100644 --- a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java +++ b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java @@ -7,7 +7,7 @@ import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.search.Search; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.RetryPolicy; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.jupiter.api.Test; diff --git a/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java b/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java index 28c8181c7..de31db8c8 100644 --- a/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java +++ b/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java @@ -9,7 +9,7 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension; import io.opentelemetry.sdk.trace.data.SpanData; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.RetryPolicy; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.jupiter.api.Test; diff --git a/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java b/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java index 6d8955213..87fb40f03 100644 --- a/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java +++ b/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java @@ -6,7 +6,7 @@ import io.opentracing.contrib.concurrent.TracedExecutorService; import io.opentracing.mock.MockSpan; import io.opentracing.mock.MockTracer; -import net.jodah.failsafe.RetryPolicy; +import dev.failsafe.RetryPolicy; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.http.client.ClientHttpResponse; diff --git a/riptide-spring-boot-autoconfigure/pom.xml b/riptide-spring-boot-autoconfigure/pom.xml index fd9dbd7ac..d55a5557f 100644 --- a/riptide-spring-boot-autoconfigure/pom.xml +++ b/riptide-spring-boot-autoconfigure/pom.xml @@ -325,7 +325,7 @@ **/NoRiptideFailsafeTest.java org.zalando:riptide-failsafe - net.jodah:failsafe + dev:failsafe diff --git a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/DefaultRiptideRegistrar.java b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/DefaultRiptideRegistrar.java index 97e45e700..577880975 100644 --- a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/DefaultRiptideRegistrar.java +++ b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/DefaultRiptideRegistrar.java @@ -8,8 +8,8 @@ import io.opentracing.contrib.concurrent.TracedExecutorService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.Timeout; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.Timeout; import org.apache.http.client.HttpClient; import org.apache.http.client.cache.HttpCacheStorage; import org.apache.http.conn.HttpClientConnectionManager; diff --git a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java index c1d451f27..19d0cd9d3 100644 --- a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java +++ b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java @@ -1,9 +1,12 @@ package org.zalando.riptide.autoconfigure; -import net.jodah.failsafe.CircuitBreaker; -import net.jodah.failsafe.RetryPolicy; -import net.jodah.failsafe.Timeout; -import net.jodah.failsafe.function.DelayFunction; +import dev.failsafe.CircuitBreaker; +import dev.failsafe.CircuitBreakerBuilder; +import dev.failsafe.RetryPolicy; +import dev.failsafe.RetryPolicyBuilder; +import dev.failsafe.Timeout; +import dev.failsafe.function.CheckedPredicate; +import dev.failsafe.function.ContextualSupplier; import org.springframework.http.client.ClientHttpResponse; import org.zalando.riptide.Plugin; import org.zalando.riptide.autoconfigure.RiptideProperties.Client; @@ -27,6 +30,7 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; import static java.time.Clock.systemUTC; import static java.time.temporal.ChronoUnit.MILLIS; @@ -52,41 +56,71 @@ public static Plugin createCircuitBreakerPlugin( .withDecorator(composite(decorators)); } + //TODO: add more properties in config for more flexible CircuitBreaker configuration public static CircuitBreaker createCircuitBreaker( final Client client, final CircuitBreakerListener listener) { - final CircuitBreaker breaker = new CircuitBreaker<>(); + final CircuitBreakerBuilder breakerBuilder = CircuitBreaker.builder(); Optional.ofNullable(client.getCircuitBreaker().getFailureThreshold()) - .ifPresent(threshold -> threshold.applyTo(breaker::withFailureThreshold)); + .ifPresent(threshold -> threshold.applyTo(breakerBuilder::withFailureThreshold)); Optional.ofNullable(client.getCircuitBreaker().getFailureRateThreshold()) - .ifPresent(threshold -> threshold.applyTo(breaker::withFailureRateThreshold)); + .ifPresent(threshold -> threshold.applyTo(breakerBuilder::withFailureRateThreshold)); Optional.ofNullable(client.getCircuitBreaker().getDelay()) - .ifPresent(delay -> delay.applyTo(breaker::withDelay)); + .ifPresent(delay -> delay.applyTo(breakerBuilder::withDelay)); Optional.ofNullable(client.getCircuitBreaker().getSuccessThreshold()) - .ifPresent(threshold -> threshold.applyTo(breaker::withSuccessThreshold)); + .ifPresent(threshold -> threshold.applyTo(breakerBuilder::withSuccessThreshold)); - breaker.withDelay(delayFunction()); - breaker.onOpen(listener::onOpen); - breaker.onHalfOpen(listener::onHalfOpen); - breaker.onClose(listener::onClose); + breakerBuilder.withDelayFn(delayFunction()) + .onOpen(event -> listener.onOpen()) + .onHalfOpen(event -> listener.onHalfOpen()) + .onClose(event -> listener.onClose()); - return breaker; + return breakerBuilder.build(); } public static Plugin createRetryFailsafePlugin( final Client client, final List decorators) { - final RetryPolicy policy = new RetryPolicy<>(); + final RetryPolicyBuilder policyBuilder = ; + + if (client.getTransientFaultDetection().getEnabled()) { + //TODO: add wrapper class to convert predicate to CheckedPredicate ? + final Predicate transientSocketFaults = transientSocketFaults(); + final CheckedPredicate transientSocketFaultsPredicate = t -> transientSocketFaults.test(t); + final Predicate transientConnectionFaults = transientConnectionFaults(); + final CheckedPredicate transientConnectionFaultsPredicate = t -> transientConnectionFaults.test(t); + + return new FailsafePlugin() + .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client) + .handleIf(transientSocketFaultsPredicate) + .build()) + .withPredicate(new IdempotencyPredicate())) + .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client) + .handleIf(transientConnectionFaultsPredicate) + .build()) + .withPredicate(alwaysTrue())) + .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client).handle(RetryException.class).build())) + .withDecorator(composite(decorators)); + } else { + return new FailsafePlugin() + .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client).handle(RetryException.class).build())) + .withDecorator(composite(decorators)); + } + } + + private static RetryPolicyBuilder getRetryPolicyBuilder(Client client) { + final RetryPolicyBuilder policyBuilder = RetryPolicy.builder(); final Retry config = client.getRetry(); - Optional.ofNullable(config.getFixedDelay()) - .ifPresent(delay -> delay.applyTo(policy::withDelay)); + // TODO: delay to use??? + //Optional.ofNullable(config.getFixedDelay()) + // .ifPresent(delay -> delay.applyTo(policyBuilder::withDelay)); Optional.ofNullable(config.getBackoff()) .filter(Backoff::getEnabled) @@ -98,41 +132,26 @@ public static Plugin createRetryFailsafePlugin( @Nullable final Double delayFactor = backoff.getDelayFactor(); if (delayFactor == null) { - policy.withBackoff(delay.to(unit), maxDelay.to(unit), MILLIS); + policyBuilder.withBackoff(delay.to(unit), maxDelay.to(unit), MILLIS); } else { - policy.withBackoff(delay.to(unit), maxDelay.to(unit), MILLIS, delayFactor); + policyBuilder.withBackoff(delay.to(unit), maxDelay.to(unit), MILLIS, delayFactor); } }); Optional.ofNullable(config.getMaxRetries()) - .ifPresent(policy::withMaxRetries); + .ifPresent(policyBuilder::withMaxRetries); Optional.ofNullable(config.getMaxDuration()) - .ifPresent(duration -> duration.applyTo(policy::withMaxDuration)); + .ifPresent(duration -> duration.applyTo(policyBuilder::withMaxDuration)); Optional.ofNullable(config.getJitterFactor()) - .ifPresent(policy::withJitter); + .ifPresent(policyBuilder::withJitter); Optional.ofNullable(config.getJitter()) - .ifPresent(jitter -> jitter.applyTo(policy::withJitter)); - - policy.withDelay(delayFunction()); + .ifPresent(jitter -> jitter.applyTo(policyBuilder::withJitter)); - if (client.getTransientFaultDetection().getEnabled()) { - return new FailsafePlugin() - .withPolicy(new RetryRequestPolicy(policy.copy() - .handleIf(transientSocketFaults())) - .withPredicate(new IdempotencyPredicate())) - .withPolicy(new RetryRequestPolicy(policy.copy() - .handleIf(transientConnectionFaults())) - .withPredicate(alwaysTrue())) - .withPolicy(new RetryRequestPolicy(policy.handle(RetryException.class))) - .withDecorator(composite(decorators)); - } else { - return new FailsafePlugin() - .withPolicy(new RetryRequestPolicy(policy.handle(RetryException.class))) - .withDecorator(composite(decorators)); - } + policyBuilder.withDelayFn(delayFunction()); + return policyBuilder; } public static Plugin createBackupRequestPlugin( @@ -161,7 +180,7 @@ public static Plugin createTimeoutPlugin( .withDecorator(composite(decorators)); } - private static DelayFunction delayFunction() { + private static ContextualSupplier delayFunction() { return new CompositeDelayFunction<>(Arrays.asList( new RetryAfterDelayFunction(systemUTC()), new RateLimitResetDelayFunction(systemUTC()) diff --git a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/CircuitBreakerTest.java b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/CircuitBreakerTest.java index 50dd1a1a8..7053faa2e 100644 --- a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/CircuitBreakerTest.java +++ b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/CircuitBreakerTest.java @@ -1,6 +1,6 @@ package org.zalando.riptide.autoconfigure; -import net.jodah.failsafe.CircuitBreaker; +import dev.failsafe.CircuitBreaker; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; From 706e31d58676d08c714e2b913dd4485e9100ef52 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Sun, 26 Feb 2023 14:40:47 +0200 Subject: [PATCH 10/27] failsafe 3 - fix autoconfigure module --- .../micrometer/MicrometerPluginTest.java | 16 +++++++++++--- .../OpenTelemetryPluginRetryTest.java | 5 +++-- .../OpenTracingPluginRetryTest.java | 5 +++-- .../autoconfigure/FailsafePluginFactory.java | 14 ++++++------ .../autoconfigure/ManualConfiguration.java | 22 +++++++++++-------- 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java index 2c4e498f6..74d2c99e7 100644 --- a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java +++ b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java @@ -2,6 +2,7 @@ import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; +import dev.failsafe.function.CheckedPredicate; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Timer; @@ -14,6 +15,7 @@ import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.zalando.fauxpas.ThrowingPredicate; import org.zalando.riptide.Http; import org.zalando.riptide.failsafe.FailsafePlugin; import org.zalando.riptide.micrometer.tag.RetryTagGenerator; @@ -57,6 +59,13 @@ final class MicrometerPluginTest { private final MeterRegistry registry = new SimpleMeterRegistry(); + + //TODO: add wrapper class to convert predicate to CheckedPredicate ? + private final ThrowingPredicate predicate = throwingPredicate(response -> response.getStatusCode() + .is5xxServerError()); + private final CheckedPredicate checkedPredicate = t -> predicate.test(t); + + private final Http unit = Http.builder() .executor(Executors.newSingleThreadExecutor()) .requestFactory(factory) @@ -68,14 +77,15 @@ final class MicrometerPluginTest { new StaticTagDecorator(singleton(Tag.of("test", "true")))) .withAdditionalTagGenerators(new RetryTagGenerator())) .plugin(new FailsafePlugin() - .withPolicy(new RetryPolicy() + .withPolicy(RetryPolicy.builder() .handleIf(error -> false) - .handleResultIf(throwingPredicate(response -> - response.getStatusCode().is5xxServerError())))) + .handleResultIf(checkedPredicate) + .build())) .build(); @Test void shouldRecordSuccessResponseMetric() { + driver.addExpectation(onRequestTo("/foo"), giveEmptyResponse().withStatus(200)); diff --git a/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java b/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java index de31db8c8..99b7091f8 100644 --- a/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java +++ b/riptide-opentelemetry/src/test/java/org/zalando/riptide/opentelemetry/OpenTelemetryPluginRetryTest.java @@ -55,9 +55,10 @@ public class OpenTelemetryPluginRetryTest { .baseUrl(driver.getBaseUrl()) .plugin(new OpenTelemetryPlugin(otelTesting.getOpenTelemetry(), retryDecorator)) .plugin(new FailsafePlugin() - .withPolicy(new RetryPolicy() + .withPolicy(RetryPolicy.builder() .withMaxRetries(2) - .handleResultIf(response -> true))) + .handleResultIf(response -> true) + .build())) .build(); @Test diff --git a/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java b/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java index 87fb40f03..d25f60b14 100644 --- a/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java +++ b/riptide-opentracing/src/test/java/org/zalando/riptide/opentracing/OpenTracingPluginRetryTest.java @@ -51,9 +51,10 @@ final class OpenTracingPluginRetryTest { .baseUrl(driver.getBaseUrl()) .plugin(unit) .plugin(new FailsafePlugin() - .withPolicy(new RetryPolicy() + .withPolicy(RetryPolicy.builder() .withMaxRetries(2) - .handleResultIf(response -> true)) + .handleResultIf(response -> true) + .build()) .withDecorator(new TracedTaskDecorator(tracer))) .build(); diff --git a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java index 19d0cd9d3..7c2fe52db 100644 --- a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java +++ b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.function.Predicate; import static java.time.Clock.systemUTC; @@ -86,8 +87,6 @@ public static CircuitBreaker createCircuitBreaker( public static Plugin createRetryFailsafePlugin( final Client client, final List decorators) { - final RetryPolicyBuilder policyBuilder = ; - if (client.getTransientFaultDetection().getEnabled()) { //TODO: add wrapper class to convert predicate to CheckedPredicate ? final Predicate transientSocketFaults = transientSocketFaults(); @@ -118,9 +117,8 @@ private static RetryPolicyBuilder getRetryPolicyBuilder(Clie final Retry config = client.getRetry(); - // TODO: delay to use??? - //Optional.ofNullable(config.getFixedDelay()) - // .ifPresent(delay -> delay.applyTo(policyBuilder::withDelay)); + Optional.ofNullable(config.getFixedDelay()) + .ifPresent(delay -> delay.applyTo((Consumer)policyBuilder::withDelay)); Optional.ofNullable(config.getBackoff()) .filter(Backoff::getEnabled) @@ -175,8 +173,10 @@ public static Plugin createTimeoutPlugin( return new FailsafePlugin() .withPolicy( - Timeout.of(timeout) - .withCancel(true)) + Timeout.builder(timeout) + .withInterrupt() + .build() + ) .withDecorator(composite(decorators)); } diff --git a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java index 7813561ed..0e74666a8 100644 --- a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java +++ b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java @@ -1,6 +1,7 @@ package org.zalando.riptide.autoconfigure; import com.fasterxml.jackson.databind.ObjectMapper; +import dev.failsafe.function.CheckedPredicate; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.binder.MeterBinder; @@ -144,17 +145,18 @@ public List examplePlugins(final MeterRegistry meterRegistry, final Logb new LogbookPlugin(logbook), new OpenTracingPlugin(tracer), new FailsafePlugin() - .withPolicy(new CircuitBreaker() + .withPolicy(CircuitBreaker.builder() .withFailureThreshold(5, 5) .withDelay(Duration.ofSeconds(30)) .withSuccessThreshold(3, 5) - .withDelay(new CompositeDelayFunction<>(Arrays.asList( + .withDelayFn(new CompositeDelayFunction<>(Arrays.asList( new RetryAfterDelayFunction(systemUTC()), new RateLimitResetDelayFunction(systemUTC()) ))) - .onOpen(listener::onOpen) - .onHalfOpen(listener::onHalfOpen) - .onClose(listener::onClose)) + .onOpen(event -> listener.onOpen()) + .onHalfOpen(event -> listener.onHalfOpen()) + .onClose(event -> listener.onClose()) + .build()) .withDecorator(new TracedTaskDecorator(tracer)), new FailsafePlugin().withPolicy( new RetryRequestPolicy( @@ -175,17 +177,19 @@ public List examplePlugins(final MeterRegistry meterRegistry, final Logb private RetryPolicy retryPolicy( final Predicate predicate) { + final CheckedPredicate checkedPredicate = t -> predicate.test(t); - return new RetryPolicy() - .handleIf(predicate) + return RetryPolicy.builder() + .handleIf(checkedPredicate) .withBackoff(50, 2000, MILLIS) - .withDelay(new CompositeDelayFunction<>(Arrays.asList( + .withDelayFn(new CompositeDelayFunction<>(Arrays.asList( new RetryAfterDelayFunction(systemUTC()), new RateLimitResetDelayFunction(systemUTC()) ))) .withMaxRetries(10) .withMaxDuration(Duration.ofSeconds(2)) - .withJitter(0.2); + .withJitter(0.2) + .build(); } @Bean From d9be48c40a0d4f126099bc00163fc1877f343036 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Sun, 26 Feb 2023 15:08:21 +0200 Subject: [PATCH 11/27] failsafe 3 - fix TODOs --- .../riptide/failsafe/BackupRequest.java | 29 +++++++++---------- .../failsafe/CheckedPredicateConverter.java | 12 ++++++++ .../failsafe/CompositeDelayFunction.java | 1 - .../FailsafePluginBackupRequestTest.java | 6 ++-- .../failsafe/FailsafePluginRetriesTest.java | 12 ++------ .../micrometer/MicrometerPluginTest.java | 11 +++---- .../autoconfigure/FailsafePluginFactory.java | 16 ++++------ .../autoconfigure/ManualConfiguration.java | 3 +- 8 files changed, 43 insertions(+), 47 deletions(-) create mode 100644 riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java index d3c0899a6..6606c94a0 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java @@ -1,36 +1,33 @@ package org.zalando.riptide.failsafe; -import dev.failsafe.DelayablePolicyConfig; -import dev.failsafe.PolicyConfig; -import dev.failsafe.RetryPolicy; -import dev.failsafe.RetryPolicyBuilder; -import lombok.AllArgsConstructor; -import lombok.Getter; import dev.failsafe.Policy; +import dev.failsafe.RetryPolicy; +import dev.failsafe.RetryPolicyConfig; import dev.failsafe.spi.PolicyExecutor; +import lombok.Getter; import org.apiguardian.api.API; import java.time.Duration; -import java.time.temporal.ChronoUnit; -import java.time.temporal.TemporalUnit; import java.util.concurrent.TimeUnit; import static org.apiguardian.api.API.Status.EXPERIMENTAL; @API(status = EXPERIMENTAL) -@AllArgsConstructor @Getter public final class BackupRequest implements Policy { private final long delay; private final TimeUnit unit; - - @Override - public PolicyConfig getConfig() { - //TODO: move to param, add unit -> ChronoUnit conversion - return RetryPolicy.builder() - .withDelay(Duration.of (delay, ChronoUnit.SECONDS) ) - .build().getConfig(); + private final RetryPolicyConfig config; + + //TODO: duplicated logic (config + delay) + public BackupRequest(long delay, TimeUnit unit, Duration duration) { + this.delay = delay; + this.unit = unit; + this.config = RetryPolicy.builder() + .withDelay(duration) + .build() + .getConfig(); } @Override diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java new file mode 100644 index 000000000..2d9c7cefc --- /dev/null +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java @@ -0,0 +1,12 @@ +package org.zalando.riptide.failsafe; + +import dev.failsafe.function.CheckedPredicate; + +import java.util.function.Predicate; + +public class CheckedPredicateConverter { + + public static CheckedPredicate toCheckedPredicate(Predicate predicate) { + return predicate::test; + } +} diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java index e42ca805e..fcbf6ff5d 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CompositeDelayFunction.java @@ -12,7 +12,6 @@ import static org.apiguardian.api.API.Status.EXPERIMENTAL; -//TODO: rename functions variable? @API(status = EXPERIMENTAL) @AllArgsConstructor public final class CompositeDelayFunction implements ContextualSupplier { diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java index 0b5002df1..c818fe792 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java @@ -12,6 +12,8 @@ import org.zalando.riptide.httpclient.ApacheClientHttpRequestFactory; import java.io.IOException; +import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.concurrent.CompletionException; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; @@ -43,7 +45,7 @@ final class FailsafePluginBackupRequestTest { .requestFactory(factory) .baseUrl(driver.getBaseUrl()) .plugin(new FailsafePlugin() - .withPolicy(new BackupRequest<>(1, SECONDS))) + .withPolicy(new BackupRequest<>(1, SECONDS, Duration.of(1, ChronoUnit.SECONDS)))) .build(); @AfterEach @@ -126,7 +128,7 @@ void shouldSendBackupRequestForCustomSafeDetectedRequest() throws Throwable { .requestFactory(factory) .baseUrl(driver.getBaseUrl()) .plugin(new FailsafePlugin() - .withPolicy(new BackupRequest<>(1, SECONDS), arguments -> + .withPolicy(new BackupRequest<>(1, SECONDS, Duration.of(1, ChronoUnit.SECONDS)), arguments -> arguments.getHeaders() .getOrDefault("Allow-Backup-Request", emptyList()).contains("true"))) .build(); diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java index 5e2913cf8..ea3fd915e 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginRetriesTest.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.github.restdriver.clientdriver.ClientDriver; import com.github.restdriver.clientdriver.ClientDriverFactory; -import dev.failsafe.function.CheckedPredicate; import lombok.SneakyThrows; import dev.failsafe.CircuitBreaker; import dev.failsafe.RetryPolicy; @@ -30,7 +29,6 @@ import java.util.UUID; import java.util.concurrent.CompletionException; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Predicate; import static com.github.restdriver.clientdriver.ClientDriverRequest.Method.POST; import static com.github.restdriver.clientdriver.RestClientDriver.giveEmptyResponse; @@ -55,6 +53,7 @@ import static org.zalando.riptide.Navigators.status; import static org.zalando.riptide.PassRoute.pass; import static org.zalando.riptide.Route.call; +import static org.zalando.riptide.failsafe.CheckedPredicateConverter.toCheckedPredicate; import static org.zalando.riptide.failsafe.RetryRoute.retry; import static org.zalando.riptide.faults.Predicates.alwaysTrue; import static org.zalando.riptide.faults.TransientFaults.transientConnectionFaults; @@ -72,11 +71,6 @@ final class FailsafePluginRetriesTest { private final AtomicInteger attempt = new AtomicInteger(); - //TODO: add wrapper class to convert predicate to CheckedPredicate ? - private final Predicate transientSocketFaults = transientSocketFaults(); - private final CheckedPredicate transientSocketFaultsPredicate = t -> transientSocketFaults.test(t); - private final Predicate transientConnectionFaults = transientConnectionFaults(); - private final CheckedPredicate transientConnectionFaultsPredicate = t -> transientConnectionFaults.test(t); private final Http unit = Http.builder() .executor(newFixedThreadPool(2)) // to allow for nested calls .requestFactory(new ApacheClientHttpRequestFactory(client)) @@ -94,7 +88,7 @@ public RequestExecution aroundNetwork(final RequestExecution execution) { .plugin(new FailsafePlugin() .withPolicy(new RetryRequestPolicy( RetryPolicy.builder() - .handleIf(transientSocketFaultsPredicate) + .handleIf(toCheckedPredicate(transientSocketFaults())) .handle(RetryException.class) .handleResultIf(this::isBadGateway) .withDelay(Duration.ofMillis(500)) @@ -103,7 +97,7 @@ public RequestExecution aroundNetwork(final RequestExecution execution) { .withPredicate(new IdempotencyPredicate())) .withPolicy(new RetryRequestPolicy( RetryPolicy.builder() - .handleIf(transientConnectionFaultsPredicate) + .handleIf(toCheckedPredicate(transientConnectionFaults())) .withDelay(Duration.ofMillis(500)) .withMaxRetries(4) .build()) diff --git a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java index 74d2c99e7..91c15bb95 100644 --- a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java +++ b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java @@ -17,6 +17,7 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.zalando.fauxpas.ThrowingPredicate; import org.zalando.riptide.Http; +import org.zalando.riptide.failsafe.CheckedPredicateConverter; import org.zalando.riptide.failsafe.FailsafePlugin; import org.zalando.riptide.micrometer.tag.RetryTagGenerator; import org.zalando.riptide.micrometer.tag.StaticTagDecorator; @@ -45,6 +46,7 @@ import static org.zalando.riptide.Bindings.on; import static org.zalando.riptide.Navigators.series; import static org.zalando.riptide.PassRoute.pass; +import static org.zalando.riptide.failsafe.CheckedPredicateConverter.toCheckedPredicate; final class MicrometerPluginTest { @@ -60,12 +62,6 @@ final class MicrometerPluginTest { private final MeterRegistry registry = new SimpleMeterRegistry(); - //TODO: add wrapper class to convert predicate to CheckedPredicate ? - private final ThrowingPredicate predicate = throwingPredicate(response -> response.getStatusCode() - .is5xxServerError()); - private final CheckedPredicate checkedPredicate = t -> predicate.test(t); - - private final Http unit = Http.builder() .executor(Executors.newSingleThreadExecutor()) .requestFactory(factory) @@ -79,7 +75,8 @@ final class MicrometerPluginTest { .plugin(new FailsafePlugin() .withPolicy(RetryPolicy.builder() .handleIf(error -> false) - .handleResultIf(checkedPredicate) + .handleResultIf(toCheckedPredicate(throwingPredicate(response -> response.getStatusCode() + .is5xxServerError()))) .build())) .build(); diff --git a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java index 7c2fe52db..bd3f59cce 100644 --- a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java +++ b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java @@ -13,6 +13,7 @@ import org.zalando.riptide.autoconfigure.RiptideProperties.Retry; import org.zalando.riptide.autoconfigure.RiptideProperties.Retry.Backoff; import org.zalando.riptide.failsafe.BackupRequest; +import org.zalando.riptide.failsafe.CheckedPredicateConverter; import org.zalando.riptide.failsafe.CircuitBreakerListener; import org.zalando.riptide.failsafe.CompositeDelayFunction; import org.zalando.riptide.failsafe.FailsafePlugin; @@ -36,6 +37,7 @@ import static java.time.Clock.systemUTC; import static java.time.temporal.ChronoUnit.MILLIS; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.zalando.riptide.failsafe.CheckedPredicateConverter.toCheckedPredicate; import static org.zalando.riptide.failsafe.TaskDecorator.composite; import static org.zalando.riptide.faults.Predicates.alwaysTrue; import static org.zalando.riptide.faults.TransientFaults.transientConnectionFaults; @@ -88,19 +90,13 @@ public static Plugin createRetryFailsafePlugin( final Client client, final List decorators) { if (client.getTransientFaultDetection().getEnabled()) { - //TODO: add wrapper class to convert predicate to CheckedPredicate ? - final Predicate transientSocketFaults = transientSocketFaults(); - final CheckedPredicate transientSocketFaultsPredicate = t -> transientSocketFaults.test(t); - final Predicate transientConnectionFaults = transientConnectionFaults(); - final CheckedPredicate transientConnectionFaultsPredicate = t -> transientConnectionFaults.test(t); - return new FailsafePlugin() .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client) - .handleIf(transientSocketFaultsPredicate) + .handleIf(toCheckedPredicate(transientSocketFaults())) .build()) .withPredicate(new IdempotencyPredicate())) .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client) - .handleIf(transientConnectionFaultsPredicate) + .handleIf(toCheckedPredicate(transientConnectionFaults())) .build()) .withPredicate(alwaysTrue())) .withPolicy(new RetryRequestPolicy(getRetryPolicyBuilder(client).handle(RetryException.class).build())) @@ -159,9 +155,7 @@ public static Plugin createBackupRequestPlugin( return new FailsafePlugin() .withPolicy(RequestPolicies.of( - new BackupRequest<>( - delay.getAmount(), - delay.getUnit()), + new BackupRequest<>(delay.getAmount(), delay.getUnit(), delay.toDuration()), new IdempotencyPredicate())) .withDecorator(composite(decorators)); } diff --git a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java index 0e74666a8..a6f1dc5fa 100644 --- a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java +++ b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java @@ -71,6 +71,7 @@ import java.net.SocketTimeoutException; import java.time.Clock; import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.List; import java.util.concurrent.Executor; @@ -168,7 +169,7 @@ public List examplePlugins(final MeterRegistry meterRegistry, final Logb .withPredicate(alwaysTrue())), new AuthorizationPlugin(new PlatformCredentialsAuthorizationProvider("example")), new FailsafePlugin() - .withPolicy(new BackupRequest<>(10, MILLISECONDS)), + .withPolicy(new BackupRequest<>(10, MILLISECONDS, Duration.of(10, MILLIS))), new FailsafePlugin() .withPolicy(Timeout.of(Duration.ofSeconds(3))), new OriginalStackTracePlugin(), From 3d52cb79bfb5d969b1e7ffe903fa0e3c90621bb5 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Sun, 26 Feb 2023 15:31:32 +0200 Subject: [PATCH 12/27] failsafe 3 - fix test coverage --- .../CheckedPredicateConverterTest.java | 22 +++++++++++++++++++ .../failsafe/CompositeDelayFunctionTest.java | 10 +++++++++ 2 files changed, 32 insertions(+) create mode 100644 riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java new file mode 100644 index 000000000..1ac2af1cd --- /dev/null +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java @@ -0,0 +1,22 @@ +package org.zalando.riptide.failsafe; + +import dev.failsafe.function.CheckedPredicate; +import org.junit.jupiter.api.Test; + +import java.util.function.Predicate; + +import static org.junit.jupiter.api.Assertions.*; +import static org.zalando.riptide.failsafe.CheckedPredicateConverter.toCheckedPredicate; + +class CheckedPredicateConverterTest { + + @Test + void shouldConvertToEquivalentPredicate() throws Throwable { + Predicate biggerThan5 = i -> i > 5; + CheckedPredicate checkedPredicate = toCheckedPredicate(biggerThan5); + + assertFalse(checkedPredicate.test(1)); + assertTrue(checkedPredicate.test(10)); + } + +} \ No newline at end of file diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java index 103124b27..cd3abeb9e 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CompositeDelayFunctionTest.java @@ -12,6 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -55,6 +56,15 @@ void shouldUseFirstNonNullDelay() throws Throwable { assertEquals(Duration.ofSeconds(1), unit.get(firstContext)); } + @Test + void shouldReThrowException() throws Throwable { + + when(first.get(eq(firstContext))).thenThrow(new IllegalArgumentException("Wrong argument")); + when(second.get(eq(secondContext))).thenReturn(Duration.ofSeconds(2)); + + assertThrowsExactly(RuntimeException.class, () -> unit.get(firstContext)); + } + @Test void shouldIgnoreNullDelay() throws Throwable { when(second.get(eq(secondContext))).thenReturn(Duration.ofSeconds(2)); From ec22ef5f5cf235fe1bca30108da304352669b92b Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Mon, 27 Feb 2023 16:00:32 +0200 Subject: [PATCH 13/27] failsafe 3 - fix test coverage --- .../zalando/riptide/failsafe/CheckedPredicateConverter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java index 2d9c7cefc..6f3d302bc 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/CheckedPredicateConverter.java @@ -6,6 +6,9 @@ public class CheckedPredicateConverter { + private CheckedPredicateConverter() { + } + public static CheckedPredicate toCheckedPredicate(Predicate predicate) { return predicate::test; } From 7d8bc84a36a32bfb9328e164d013c750d942d876 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 10:34:25 +0200 Subject: [PATCH 14/27] failsafe 3 - fix TODOs --- .../zalando/riptide/failsafe/BackupRequest.java | 14 ++++---------- .../riptide/failsafe/BackupRequestExecutor.java | 1 - .../failsafe/RateLimitResetDelayFunction.java | 5 +++-- .../riptide/failsafe/RetryAfterDelayFunction.java | 5 +++-- .../failsafe/FailsafePluginBackupRequestTest.java | 4 ++-- .../autoconfigure/FailsafePluginFactory.java | 2 +- .../riptide/autoconfigure/ManualConfiguration.java | 2 +- 7 files changed, 14 insertions(+), 19 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java index 6606c94a0..8c2c7f3ce 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java @@ -1,13 +1,11 @@ package org.zalando.riptide.failsafe; import dev.failsafe.Policy; -import dev.failsafe.RetryPolicy; -import dev.failsafe.RetryPolicyConfig; +import dev.failsafe.PolicyConfig; import dev.failsafe.spi.PolicyExecutor; import lombok.Getter; import org.apiguardian.api.API; -import java.time.Duration; import java.util.concurrent.TimeUnit; import static org.apiguardian.api.API.Status.EXPERIMENTAL; @@ -18,16 +16,12 @@ public final class BackupRequest implements Policy { private final long delay; private final TimeUnit unit; - private final RetryPolicyConfig config; + private final PolicyConfig config = new PolicyConfig() { + }; - //TODO: duplicated logic (config + delay) - public BackupRequest(long delay, TimeUnit unit, Duration duration) { + public BackupRequest(long delay, TimeUnit unit) { this.delay = delay; this.unit = unit; - this.config = RetryPolicy.builder() - .withDelay(duration) - .build() - .getConfig(); } @Override diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java index 697cf7606..ba9566754 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequestExecutor.java @@ -18,7 +18,6 @@ final class BackupRequestExecutor extends PolicyExecutor { - //TODO: correct usage? private final BackupRequest policy; BackupRequestExecutor(final BackupRequest policy, int policyIndex) { diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java index 93e86693b..2d4aa82d6 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.Optional; +import static java.util.Optional.ofNullable; import static org.apiguardian.api.API.Status.EXPERIMENTAL; /** @@ -33,12 +34,12 @@ public RateLimitResetDelayFunction(final Clock clock) { //TODO: check getLastException usage @Override public Duration get(final ExecutionContext context) { - return Optional.ofNullable(context.getLastException()) + return ofNullable(context) + .map(ExecutionContext::getLastException) .filter(HttpResponseException.class::isInstance) .map(HttpResponseException.class::cast) .map(response -> response.getResponseHeaders().getFirst("X-RateLimit-Reset")) .map(parser::parse) - //TODO: workaround for DelayablePolicy line 52 NPE in Durations.ofSafeNanos( .orElse(Duration.ofMinutes(-1)); } diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java index 0bfae61ea..5ec602757 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RetryAfterDelayFunction.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.Optional; +import static java.util.Optional.ofNullable; import static lombok.AccessLevel.PRIVATE; import static org.apiguardian.api.API.Status.EXPERIMENTAL; @@ -35,12 +36,12 @@ public RetryAfterDelayFunction(final Clock clock) { @Override public Duration get(final ExecutionContext context) { - return Optional.ofNullable(context.getLastException()) + return ofNullable(context) + .map(ExecutionContext::getLastException) .filter(HttpResponseException.class::isInstance) .map(HttpResponseException.class::cast) .map(response -> response.getResponseHeaders().getFirst("Retry-After")) .map(parser::parse) - //TODO: workaround for DelayablePolicy line 52 NPE in Durations.ofSafeNanos( .orElse(Duration.ofMinutes(-1)); } diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java index c818fe792..6fc7c4101 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java @@ -45,7 +45,7 @@ final class FailsafePluginBackupRequestTest { .requestFactory(factory) .baseUrl(driver.getBaseUrl()) .plugin(new FailsafePlugin() - .withPolicy(new BackupRequest<>(1, SECONDS, Duration.of(1, ChronoUnit.SECONDS)))) + .withPolicy(new BackupRequest<>(1, SECONDS))) .build(); @AfterEach @@ -128,7 +128,7 @@ void shouldSendBackupRequestForCustomSafeDetectedRequest() throws Throwable { .requestFactory(factory) .baseUrl(driver.getBaseUrl()) .plugin(new FailsafePlugin() - .withPolicy(new BackupRequest<>(1, SECONDS, Duration.of(1, ChronoUnit.SECONDS)), arguments -> + .withPolicy(new BackupRequest<>(1, SECONDS), arguments -> arguments.getHeaders() .getOrDefault("Allow-Backup-Request", emptyList()).contains("true"))) .build(); diff --git a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java index bd3f59cce..24b610090 100644 --- a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java +++ b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java @@ -155,7 +155,7 @@ public static Plugin createBackupRequestPlugin( return new FailsafePlugin() .withPolicy(RequestPolicies.of( - new BackupRequest<>(delay.getAmount(), delay.getUnit(), delay.toDuration()), + new BackupRequest<>(delay.getAmount(), delay.getUnit()), new IdempotencyPredicate())) .withDecorator(composite(decorators)); } diff --git a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java index a6f1dc5fa..8a02ea45c 100644 --- a/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java +++ b/riptide-spring-boot-autoconfigure/src/test/java/org/zalando/riptide/autoconfigure/ManualConfiguration.java @@ -169,7 +169,7 @@ public List examplePlugins(final MeterRegistry meterRegistry, final Logb .withPredicate(alwaysTrue())), new AuthorizationPlugin(new PlatformCredentialsAuthorizationProvider("example")), new FailsafePlugin() - .withPolicy(new BackupRequest<>(10, MILLISECONDS, Duration.of(10, MILLIS))), + .withPolicy(new BackupRequest<>(10, MILLISECONDS)), new FailsafePlugin() .withPolicy(Timeout.of(Duration.ofSeconds(3))), new OriginalStackTracePlugin(), From a6fc49f232a74808fa58c520e8c4afe1df698efa Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 11:32:18 +0200 Subject: [PATCH 15/27] failsafe 3 - fix build --- cve-suppressions.xml | 1 + .../zalando/riptide/failsafe/RateLimitResetDelayFunction.java | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cve-suppressions.xml b/cve-suppressions.xml index 8a47242c2..2c84bad69 100644 --- a/cve-suppressions.xml +++ b/cve-suppressions.xml @@ -34,6 +34,7 @@ CVE-2021-4277 CVE-2022-3064 CVE-2021-4235 + CVE-2022-45688 diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java index 2d4aa82d6..d38b5f460 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/RateLimitResetDelayFunction.java @@ -31,7 +31,6 @@ public RateLimitResetDelayFunction(final Clock clock) { )); } - //TODO: check getLastException usage @Override public Duration get(final ExecutionContext context) { return ofNullable(context) From 46a12991becd71f7cfd1e6efdc9b40c058c8a54b Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 12:20:57 +0200 Subject: [PATCH 16/27] failsafe 3 - fix build --- .../zalando/riptide/failsafe/CheckedPredicateConverterTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java index 1ac2af1cd..735e62bdc 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java @@ -14,7 +14,6 @@ class CheckedPredicateConverterTest { void shouldConvertToEquivalentPredicate() throws Throwable { Predicate biggerThan5 = i -> i > 5; CheckedPredicate checkedPredicate = toCheckedPredicate(biggerThan5); - assertFalse(checkedPredicate.test(1)); assertTrue(checkedPredicate.test(10)); } From 2a577f8a1f3216f589009335c80b65a534660ecc Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 16:57:06 +0200 Subject: [PATCH 17/27] failsafe 3 - minor fixes --- .../org/zalando/riptide/autoconfigure/FailsafePluginFactory.java | 1 - 1 file changed, 1 deletion(-) diff --git a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java index 24b610090..53f343032 100644 --- a/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java +++ b/riptide-spring-boot-autoconfigure/src/main/java/org/zalando/riptide/autoconfigure/FailsafePluginFactory.java @@ -59,7 +59,6 @@ public static Plugin createCircuitBreakerPlugin( .withDecorator(composite(decorators)); } - //TODO: add more properties in config for more flexible CircuitBreaker configuration public static CircuitBreaker createCircuitBreaker( final Client client, final CircuitBreakerListener listener) { From d533d1d72e04923158a25bbc32d3541c1d0191d8 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 17:59:32 +0200 Subject: [PATCH 18/27] failsafe 3 - fix docs --- riptide-failsafe/README.md | 45 +++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/riptide-failsafe/README.md b/riptide-failsafe/README.md index b95d5b3e1..b588f3b2a 100644 --- a/riptide-failsafe/README.md +++ b/riptide-failsafe/README.md @@ -11,7 +11,7 @@ and a circuit breaker to every remote call. ## Example ```java -Http.builder() +Http.builder().asyncRequestFactory(asyncRequestFactory) .plugin(new FailsafePlugin() .withPolicy(circuitBreaker) .withPolicy(new RetryRequestPolicy(retryPolicy))) @@ -45,21 +45,23 @@ Add the following dependency to your project: The failsafe plugin will not perform retries nor apply circuit breakers unless they were explicitly configured: ```java -Http.builder() +Http.builder().asyncRequestFactory(asyncRequestFactory) .plugin(new FailsafePlugin() .withPolicy( new RetryRequestPolicy( - new RetryPolicy() - .withDelay(Duration.ofMillis(25)) - .withDelay(new RetryAfterDelayFunction(clock)) - .withMaxRetries(4)) + RetryPolicy.builder() + .withDelay(Duration.ofMillis(25)) + .withDelayFn(new RetryAfterDelayFunction(clock)) + .withMaxRetries(4) + .build()) .withListener(myRetryListener)) .withPolicy( - new CircuitBreaker() + CircuitBreaker.builder() .withFailureThreshold(3, 10) .withSuccessThreshold(5) - .withDelay(Duration.ofMinutes(1))) - .build(); + .withDelay(Duration.ofMinutes(1)) + .build())) + .build(); ``` Please visit the [Failsafe readme](https://github.com/jhalterman/failsafe#readme) in order to see possible configurations. @@ -70,9 +72,10 @@ Please visit the [Failsafe readme](https://github.com/jhalterman/failsafe#readme You'll need to register `RetryException` in order for the `retry()` route to work: ```java -new RetryPolicy() +RetryPolicy.builder() .handle(SocketTimeoutException.class) - .handle(RetryException.class); + .handle(RetryException.class) + .build(); ``` Failsafe supports dynamically computed delays using a custom function. @@ -82,14 +85,15 @@ Riptide: Failsafe offers implementations that understand: - [`X-RateLimit-Reset` (RESTful API Guidelines)](https://opensource.zalando.com/restful-api-guidelines/#153) ```java -Http.builder() +Http.builder().asyncRequestFactory(asyncRequestFactory) .plugin(new FailsafePlugin() - .withPolicy(new RetryPolicy() - .withDelay(composite( + .withPolicy(RetryPolicy.builder() + .withDelayFn(new CompositeDelayFunction<>(Arrays.asList( new RetryAfterDelayFunction(clock), new RateLimitResetDelayFunction(clock) - )) - .withMaxDuration(Duration.ofSeconds(5)))) + ))) + .withMaxDuration(Duration.ofSeconds(5)) + .build())) .build(); ``` @@ -104,7 +108,7 @@ Failsafe and Spring Boot. The `BackupRequest` policy implements the [*backup request*][abstract] pattern, also known as [*hedged requests*][article]: ```java -Http.builder() +Http.builder().asyncRequestFactory(asyncRequestFactory) .plugin(new FailsafePlugin() .withPolicy(new BackupRequest(1, SECONDS))) .build(); @@ -165,9 +169,10 @@ http.post("/subscriptions/{id}/cursors", subscriptionId) In case those options are insufficient you may specify your own method detector: ```java -Http.builder() - .plugin(new FailsafePlugin(ImmutableList.of(retryPolicy)) - .withIdempontentMethodDetector(new CustomIdempotentMethodDetector())) +Http.builder().asyncRequestFactory(asyncRequestFactory) + .plugin(new FailsafePlugin() + .withPolicy(retryPolicy) + .withDecorator(new CustomIdempotentMethodDetector())) .build(); ``` From 2da55e643f5d2d44ef738c1ad1aca180663032bc Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 18:24:34 +0200 Subject: [PATCH 19/27] failsafe 3 - fix docs --- MIGRATION.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/MIGRATION.md b/MIGRATION.md index 5fe8530e9..a36bd6b73 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,3 +1,18 @@ +# Riptide 4.0 Migration Guide + +## Failsafe + +**Failsafe version was upgrade from 2.4.3 to 3.3.0** + +There are many breaking changes between Failsafe version 2.4.3 and version 3.3.0, +see [Failsafe CHANGELOG](https://github.com/failsafe-lib/failsafe/blob/master/CHANGELOG.md#330) for all details. +Here are some of the breaking changes that `riptide-failsafe` users need to pay special attention to: + +- The maven group id for Failsafe has changed to `dev.failsafe` +- All files have been moved to the `dev.failsafe` package +- All policies now use a builder API instead of constructors +- `DelayFunction` has been removed, `ContextualSupplier` should be used instead since it provides access to the same information. + # Riptide 3.0 Migration Guide ## Before You Start From 7ff6773e64d6f6ee22ac767e2fff6e083637d74b Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Tue, 28 Feb 2023 18:39:13 +0200 Subject: [PATCH 20/27] failsafe 3 - fix docs --- MIGRATION.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index a36bd6b73..915e3c59c 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -5,13 +5,15 @@ **Failsafe version was upgrade from 2.4.3 to 3.3.0** There are many breaking changes between Failsafe version 2.4.3 and version 3.3.0, -see [Failsafe CHANGELOG](https://github.com/failsafe-lib/failsafe/blob/master/CHANGELOG.md#330) for all details. -Here are some of the breaking changes that `riptide-failsafe` users need to pay special attention to: +see [Failsafe CHANGELOG](https://github.com/failsafe-lib/failsafe/blob/master/CHANGELOG.md#330) for all details. +Here are some of the breaking changes that can affect `riptide-failsafe` users: - The maven group id for Failsafe has changed to `dev.failsafe` - All files have been moved to the `dev.failsafe` package +- `Scheduler`, `DefaultScheduledFuture` and `PolicyExecutor` were moved to the spi package - All policies now use a builder API instead of constructors -- `DelayFunction` has been removed, `ContextualSupplier` should be used instead since it provides access to the same information. +- `DelayFunction` interface has been removed, `ContextualSupplier` should be used instead since it provides access to the same information +- `CircuitBreakerBuilder` `onOpen`, `onClose`, and `onHalfOpen` methods now accept a `EventListener` argument # Riptide 3.0 Migration Guide From 76aa240d66fd6e6380d5d2fc9e3e93b16b4a4772 Mon Sep 17 00:00:00 2001 From: Semernitskaya Date: Wed, 8 Mar 2023 15:50:41 +0200 Subject: [PATCH 21/27] Update MIGRATION.md Co-authored-by: Christoph Berg --- MIGRATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIGRATION.md b/MIGRATION.md index 915e3c59c..1c0f07a70 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -13,7 +13,7 @@ Here are some of the breaking changes that can affect `riptide-failsafe` users: - `Scheduler`, `DefaultScheduledFuture` and `PolicyExecutor` were moved to the spi package - All policies now use a builder API instead of constructors - `DelayFunction` interface has been removed, `ContextualSupplier` should be used instead since it provides access to the same information -- `CircuitBreakerBuilder` `onOpen`, `onClose`, and `onHalfOpen` methods now accept a `EventListener` argument +- `CircuitBreakerBuilder` `onOpen`, `onClose`, and `onHalfOpen` methods now accept an `EventListener` argument # Riptide 3.0 Migration Guide From 2bb5fe345aa0e09115384c2d93fa1aea9f729313 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 8 Mar 2023 15:58:08 +0200 Subject: [PATCH 22/27] failsafe 3 - fixes after CR --- .../main/java/org/zalando/riptide/failsafe/BackupRequest.java | 1 - .../zalando/riptide/failsafe/CheckedPredicateConverterTest.java | 2 +- .../riptide/failsafe/FailsafePluginBackupRequestTest.java | 2 -- .../org/zalando/riptide/micrometer/MicrometerPluginTest.java | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java index 8c2c7f3ce..2721ae8e2 100644 --- a/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java +++ b/riptide-failsafe/src/main/java/org/zalando/riptide/failsafe/BackupRequest.java @@ -25,7 +25,6 @@ public BackupRequest(long delay, TimeUnit unit) { } @Override - @SuppressWarnings("unchecked") public PolicyExecutor toExecutor(int policyIndex) { return create(policyIndex); } diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java index 735e62bdc..1b3e8d255 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java @@ -18,4 +18,4 @@ void shouldConvertToEquivalentPredicate() throws Throwable { assertTrue(checkedPredicate.test(10)); } -} \ No newline at end of file +} diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java index 6fc7c4101..0b5002df1 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/FailsafePluginBackupRequestTest.java @@ -12,8 +12,6 @@ import org.zalando.riptide.httpclient.ApacheClientHttpRequestFactory; import java.io.IOException; -import java.time.Duration; -import java.time.temporal.ChronoUnit; import java.util.concurrent.CompletionException; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; diff --git a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java index 91c15bb95..7c1cd7918 100644 --- a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java +++ b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java @@ -61,7 +61,6 @@ final class MicrometerPluginTest { private final MeterRegistry registry = new SimpleMeterRegistry(); - private final Http unit = Http.builder() .executor(Executors.newSingleThreadExecutor()) .requestFactory(factory) From 0f506a2ad27e8f6afdce6ec1a454e1a8e7f6d4d0 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 8 Mar 2023 15:59:54 +0200 Subject: [PATCH 23/27] failsafe 3 - fixes after CR --- .../riptide/failsafe/CheckedPredicateConverterTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java index 1b3e8d255..b2d51c168 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java @@ -5,7 +5,8 @@ import java.util.function.Predicate; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.zalando.riptide.failsafe.CheckedPredicateConverter.toCheckedPredicate; class CheckedPredicateConverterTest { From d5f54e66909f0b90b960f31770dd00580706d273 Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 8 Mar 2023 16:31:11 +0200 Subject: [PATCH 24/27] failsafe 3 - fixes after CR --- docs/resilience.md | 12 +++++++----- riptide-failsafe/README.md | 10 +++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/resilience.md b/docs/resilience.md index 6fb1b63e4..6c7bf5e97 100644 --- a/docs/resilience.md +++ b/docs/resilience.md @@ -34,11 +34,13 @@ riptide.clients: The [riptide-faults](../riptide-faults) module provides a set `TransientFaults` predicates that detects transient faults: ```java -Http.builder() - .plugin(new FailsafePlugin() - .withPolicy(new RetryRequestPolicy( - new RetryPolicy().handleIf(transientSocketFaults())) -)) +Http.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) + .plugin(new FailsafePlugin() + .withPolicy(new RetryRequestPolicy( + RetryPolicy.builder() + .handleIf(CheckedPredicateConverter.toCheckedPredicate(transientSocketFaults())) + .build()) + )); ``` ```yaml diff --git a/riptide-failsafe/README.md b/riptide-failsafe/README.md index b588f3b2a..6627d30bb 100644 --- a/riptide-failsafe/README.md +++ b/riptide-failsafe/README.md @@ -11,7 +11,7 @@ and a circuit breaker to every remote call. ## Example ```java -Http.builder().asyncRequestFactory(asyncRequestFactory) +Http.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) .plugin(new FailsafePlugin() .withPolicy(circuitBreaker) .withPolicy(new RetryRequestPolicy(retryPolicy))) @@ -45,7 +45,7 @@ Add the following dependency to your project: The failsafe plugin will not perform retries nor apply circuit breakers unless they were explicitly configured: ```java -Http.builder().asyncRequestFactory(asyncRequestFactory) +Http.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) .plugin(new FailsafePlugin() .withPolicy( new RetryRequestPolicy( @@ -85,7 +85,7 @@ Riptide: Failsafe offers implementations that understand: - [`X-RateLimit-Reset` (RESTful API Guidelines)](https://opensource.zalando.com/restful-api-guidelines/#153) ```java -Http.builder().asyncRequestFactory(asyncRequestFactory) +Http.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) .plugin(new FailsafePlugin() .withPolicy(RetryPolicy.builder() .withDelayFn(new CompositeDelayFunction<>(Arrays.asList( @@ -108,7 +108,7 @@ Failsafe and Spring Boot. The `BackupRequest` policy implements the [*backup request*][abstract] pattern, also known as [*hedged requests*][article]: ```java -Http.builder().asyncRequestFactory(asyncRequestFactory) +Http.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) .plugin(new FailsafePlugin() .withPolicy(new BackupRequest(1, SECONDS))) .build(); @@ -169,7 +169,7 @@ http.post("/subscriptions/{id}/cursors", subscriptionId) In case those options are insufficient you may specify your own method detector: ```java -Http.builder().asyncRequestFactory(asyncRequestFactory) +Http.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()) .plugin(new FailsafePlugin() .withPolicy(retryPolicy) .withDecorator(new CustomIdempotentMethodDetector())) From f9c8706a071a88abd787318a36371a4f9a2f72ac Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Wed, 8 Mar 2023 16:39:35 +0200 Subject: [PATCH 25/27] failsafe 3 - fix build --- cve-suppressions.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/cve-suppressions.xml b/cve-suppressions.xml index c6d0c0a6a..233c55b63 100644 --- a/cve-suppressions.xml +++ b/cve-suppressions.xml @@ -35,6 +35,7 @@ CVE-2022-3064 CVE-2021-4235 CVE-2022-45688 + CVE-2020-8908 From 93bc51abedd3898fad85b6b886a72f3008f675bc Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Thu, 9 Mar 2023 17:09:24 +0200 Subject: [PATCH 26/27] failsafe 3 - fixes after CR --- .../org/zalando/riptide/micrometer/MicrometerPluginTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java index 7c1cd7918..2abf67bf7 100644 --- a/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java +++ b/riptide-micrometer/src/test/java/org/zalando/riptide/micrometer/MicrometerPluginTest.java @@ -81,7 +81,6 @@ final class MicrometerPluginTest { @Test void shouldRecordSuccessResponseMetric() { - driver.addExpectation(onRequestTo("/foo"), giveEmptyResponse().withStatus(200)); From 43102e4b45c80101d4faabc429088c148e0ff8dc Mon Sep 17 00:00:00 2001 From: Olga Semernitskaia Date: Thu, 9 Mar 2023 17:11:10 +0200 Subject: [PATCH 27/27] failsafe 3 - fixes after CR --- .../zalando/riptide/failsafe/CheckedPredicateConverterTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java index b2d51c168..e32b8aec6 100644 --- a/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java +++ b/riptide-failsafe/src/test/java/org/zalando/riptide/failsafe/CheckedPredicateConverterTest.java @@ -18,5 +18,4 @@ void shouldConvertToEquivalentPredicate() throws Throwable { assertFalse(checkedPredicate.test(1)); assertTrue(checkedPredicate.test(10)); } - }