diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-08-12 09:31:29 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-08-12 09:31:29 +0200 |
commit | 0ea67e1afc23644f7635ed80c6d311ee53b3f817 (patch) | |
tree | 1ccc3b933ab51cb8bff65640acec123e471f21b7 /vespa-feed-client | |
parent | 5f2c15f97fe6551805f6356b2012b81218ff5ca3 (diff) |
Use overloads for http error response / io exception
Diffstat (limited to 'vespa-feed-client')
5 files changed, 23 insertions, 12 deletions
diff --git a/vespa-feed-client/abi-spec.json b/vespa-feed-client/abi-spec.json index 07d02c81291..808fe152fee 100644 --- a/vespa-feed-client/abi-spec.json +++ b/vespa-feed-client/abi-spec.json @@ -80,8 +80,8 @@ ], "methods": [ "public void success()", - "public void failure()", - "public void failure(java.lang.String)", + "public void failure(ai.vespa.feed.client.HttpResponse)", + "public void failure(java.lang.Throwable)", "public abstract ai.vespa.feed.client.FeedClient$CircuitBreaker$State state()" ], "fields": [ @@ -197,7 +197,8 @@ "methods": [ "public void <init>(java.time.Duration, java.time.Duration)", "public void success()", - "public void failure(java.lang.String)", + "public void failure(ai.vespa.feed.client.HttpResponse)", + "public void failure(java.lang.Throwable)", "public ai.vespa.feed.client.FeedClient$CircuitBreaker$State state()" ], "fields": [] diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/FeedClient.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/FeedClient.java index 6e9572ba154..0089499701f 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/FeedClient.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/FeedClient.java @@ -68,11 +68,11 @@ public interface FeedClient extends Closeable { /** Called by the client whenever a successful response is obtained. */ default void success() { } - /** Called by the client whenever a transient or fatal error occurs. */ - default void failure() { failure(null); } + /** Called by the client whenever an error HTTP response is received. */ + default void failure(HttpResponse response) { } - /** Called by the client whenever a transient or fatal error occurs. */ - default void failure(String message) { } + /** Called by the client whenever an exception occurs trying to obtain a HTTP response. */ + default void failure(Throwable cause) { } /** The current state of the circuit breaker. */ State state(); diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/GracePeriodCircuitBreaker.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/GracePeriodCircuitBreaker.java index ed1ab7113df..2c4641f38d5 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/GracePeriodCircuitBreaker.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/GracePeriodCircuitBreaker.java @@ -55,7 +55,16 @@ public class GracePeriodCircuitBreaker implements FeedClient.CircuitBreaker { } @Override - public void failure(String detail) { + public void failure(HttpResponse response) { + failure(response.toString()); + } + + @Override + public void failure(Throwable cause) { + failure(cause.getMessage()); + } + + private void failure(String detail) { if (failingSinceMillis.compareAndSet(NEVER, clock.getAsLong())) this.detail.set(detail); } diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpRequestStrategy.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpRequestStrategy.java index 51facb0fa0d..58112f86090 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpRequestStrategy.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpRequestStrategy.java @@ -135,7 +135,7 @@ class HttpRequestStrategy implements RequestStrategy { * or the user has turned off retries for this type of operation. */ private boolean retry(HttpRequest request, Throwable thrown, int attempt) { - breaker.failure(thrown.getMessage()); + breaker.failure(thrown); if ( (thrown instanceof IOException) // General IO problems. || (thrown instanceof CancellationException) // TLS session disconnect. || (thrown instanceof CancelledKeyException)) { // Selection cancelled. @@ -163,7 +163,7 @@ class HttpRequestStrategy implements RequestStrategy { return true; } - breaker.failure(response.toString()); + breaker.failure(response); logResponse(FINE, response, request, attempt); if (response.code() == 500 || response.code() == 502 || response.code() == 504) { // Hopefully temporary errors. return retry(request, attempt); diff --git a/vespa-feed-client/src/test/java/ai/vespa/feed/client/GracePeriodCircuitBreakerTest.java b/vespa-feed-client/src/test/java/ai/vespa/feed/client/GracePeriodCircuitBreakerTest.java index 9b30ebfd0aa..ebff2689f1a 100644 --- a/vespa-feed-client/src/test/java/ai/vespa/feed/client/GracePeriodCircuitBreakerTest.java +++ b/vespa-feed-client/src/test/java/ai/vespa/feed/client/GracePeriodCircuitBreakerTest.java @@ -22,6 +22,7 @@ class GracePeriodCircuitBreakerTest { AtomicLong now = new AtomicLong(0); long SECOND = 1000; CircuitBreaker breaker = new GracePeriodCircuitBreaker(now::get, Duration.ofSeconds(1), Duration.ofMinutes(1)); + Throwable error = new Error(); assertEquals(CLOSED, breaker.state(), "Initial state is closed"); @@ -34,7 +35,7 @@ class GracePeriodCircuitBreakerTest { now.addAndGet(100 * SECOND); assertEquals(CLOSED, breaker.state(), "State is closed some time after a success"); - breaker.failure(); + breaker.failure(error); assertEquals(CLOSED, breaker.state(), "State is closed right after a failure"); now.addAndGet(SECOND); @@ -46,7 +47,7 @@ class GracePeriodCircuitBreakerTest { breaker.success(); assertEquals(CLOSED, breaker.state(), "State is closed after a new success"); - breaker.failure(); + breaker.failure(error); now.addAndGet(60 * SECOND); assertEquals(HALF_OPEN, breaker.state(), "State is half-open until doom period has passed"); |