aboutsummaryrefslogtreecommitdiffstats
path: root/vespa-feed-client
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-08-12 09:31:29 +0200
committerJon Marius Venstad <venstad@gmail.com>2021-08-12 09:31:29 +0200
commit0ea67e1afc23644f7635ed80c6d311ee53b3f817 (patch)
tree1ccc3b933ab51cb8bff65640acec123e471f21b7 /vespa-feed-client
parent5f2c15f97fe6551805f6356b2012b81218ff5ca3 (diff)
Use overloads for http error response / io exception
Diffstat (limited to 'vespa-feed-client')
-rw-r--r--vespa-feed-client/abi-spec.json7
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/FeedClient.java8
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/GracePeriodCircuitBreaker.java11
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpRequestStrategy.java4
-rw-r--r--vespa-feed-client/src/test/java/ai/vespa/feed/client/GracePeriodCircuitBreakerTest.java5
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");