aboutsummaryrefslogtreecommitdiffstats
path: root/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java58
1 files changed, 38 insertions, 20 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java
index 67dcb6744ce..4a9c530d9c9 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java
@@ -106,8 +106,10 @@ public class ConfigServerApiImpl implements ConfigServerApi {
HttpUriRequest createRequest(URI configServerUri) throws JsonProcessingException, UnsupportedEncodingException;
}
- private <T> T tryAllConfigServers(CreateRequest requestFactory, Class<T> wantedReturnType) {
+ private <T> T tryAllConfigServers(CreateRequest requestFactory, Class<T> wantedReturnType, Params<T> params) {
+ T lastResult = null;
Exception lastException = null;
+
for (URI configServer : configServers) {
var request = Exceptions.uncheck(() -> requestFactory.createRequest(configServer));
try (CloseableHttpResponse response = client.execute(request)) {
@@ -115,15 +117,26 @@ public class ConfigServerApiImpl implements ConfigServerApi {
HttpException.handleStatusCode(response.getStatusLine().getStatusCode(),
request.getMethod() + " " + request.getURI() +
" failed with response '" + responseBody + "'");
+
+ T result;
try {
- return mapper.readValue(responseBody, wantedReturnType);
+ result = mapper.readValue(responseBody, wantedReturnType);
} catch (IOException e) {
throw new UncheckedIOException("Failed parse response from config server", e);
}
+
+ if (params.getRetryPolicy().tryNextConfigServer(result)) {
+ lastResult = result;
+ lastException = null;
+ } else {
+ return result;
+ }
} catch (HttpException e) {
if (!e.isRetryable()) throw e;
+ lastResult = null;
lastException = e;
} catch (Exception e) {
+ lastResult = null;
lastException = e;
if (configServers.size() == 1) break;
@@ -136,6 +149,11 @@ public class ConfigServerApiImpl implements ConfigServerApi {
}
}
+ if (lastResult != null) {
+ logger.warning("Giving up after trying all config servers: returning result: " + lastResult);
+ return lastResult;
+ }
+
String prefix = configServers.size() == 1 ?
"Request against " + configServers.get(0) + " failed: " :
"All requests against the config servers (" + configServers + ") failed, last as follows: ";
@@ -143,8 +161,8 @@ public class ConfigServerApiImpl implements ConfigServerApi {
}
@Override
- public <T> T put(String path, Optional<Object> bodyJsonPojo, Class<T> wantedReturnType, Params paramsOrNull) {
- Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(paramsOrNull);
+ public <T> T put(String path, Optional<Object> bodyJsonPojo, Class<T> wantedReturnType, Params<T> params) {
+ Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(params);
return tryAllConfigServers(configServer -> {
HttpPut put = new HttpPut(configServer.resolve(path));
requestConfigOverride.ifPresent(put::setConfig);
@@ -153,51 +171,51 @@ public class ConfigServerApiImpl implements ConfigServerApi {
put.setEntity(new StringEntity(mapper.writeValueAsString(bodyJsonPojo.get())));
}
return put;
- }, wantedReturnType);
+ }, wantedReturnType, params);
}
@Override
- public <T> T patch(String path, Object bodyJsonPojo, Class<T> wantedReturnType, Params paramsOrNull) {
- Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(paramsOrNull);
+ public <T> T patch(String path, Object bodyJsonPojo, Class<T> wantedReturnType, Params<T> params) {
+ Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(params);
return tryAllConfigServers(configServer -> {
HttpPatch patch = new HttpPatch(configServer.resolve(path));
requestConfigOverride.ifPresent(patch::setConfig);
setContentTypeToApplicationJson(patch);
patch.setEntity(new StringEntity(mapper.writeValueAsString(bodyJsonPojo)));
return patch;
- }, wantedReturnType);
+ }, wantedReturnType, params);
}
@Override
- public <T> T delete(String path, Class<T> wantedReturnType, Params paramsOrNull) {
- Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(paramsOrNull);
+ public <T> T delete(String path, Class<T> wantedReturnType, Params<T> params) {
+ Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(params);
return tryAllConfigServers(configServer -> {
HttpDelete delete = new HttpDelete(configServer.resolve(path));
requestConfigOverride.ifPresent(delete::setConfig);
return delete;
- }, wantedReturnType);
+ }, wantedReturnType, params);
}
@Override
- public <T> T get(String path, Class<T> wantedReturnType, Params paramsOrNull) {
- Optional<RequestConfig> requestConfig = getRequestConfigOverride(paramsOrNull);
+ public <T> T get(String path, Class<T> wantedReturnType, Params<T> params) {
+ Optional<RequestConfig> requestConfig = getRequestConfigOverride(params);
return tryAllConfigServers(configServer -> {
HttpGet get = new HttpGet(configServer.resolve(path));
requestConfig.ifPresent(get::setConfig);
return get;
- }, wantedReturnType);
+ }, wantedReturnType, params);
}
@Override
- public <T> T post(String path, Object bodyJsonPojo, Class<T> wantedReturnType, Params paramsOrNull) {
- Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(paramsOrNull);
+ public <T> T post(String path, Object bodyJsonPojo, Class<T> wantedReturnType, Params<T> params) {
+ Optional<RequestConfig> requestConfigOverride = getRequestConfigOverride(params);
return tryAllConfigServers(configServer -> {
HttpPost post = new HttpPost(configServer.resolve(path));
requestConfigOverride.ifPresent(post::setConfig);
setContentTypeToApplicationJson(post);
post.setEntity(new StringEntity(mapper.writeValueAsString(bodyJsonPojo)));
return post;
- }, wantedReturnType);
+ }, wantedReturnType, params);
}
@Override
@@ -235,12 +253,12 @@ public class ConfigServerApiImpl implements ConfigServerApi {
.build();
}
- private static Optional<RequestConfig> getRequestConfigOverride(Params paramsOrNull) {
- if (paramsOrNull == null) return Optional.empty();
+ private static <T> Optional<RequestConfig> getRequestConfigOverride(Params<T> params) {
+ if (params.getConnectionTimeout().isEmpty()) return Optional.empty();
RequestConfig.Builder builder = RequestConfig.copy(DEFAULT_REQUEST_CONFIG);
- paramsOrNull.getConnectionTimeout().ifPresent(connectionTimeout -> {
+ params.getConnectionTimeout().ifPresent(connectionTimeout -> {
builder.setConnectTimeout((int) connectionTimeout.toMillis());
builder.setSocketTimeout((int) connectionTimeout.toMillis());
});