aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ConfigVerification.java3
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/ConfigConvergenceChecker.java9
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/HttpProxy.java7
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/LogRetriever.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/SecretStoreValidator.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/SimpleHttpFetcher.java17
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/TesterClient.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterDeploymentMetricsRetriever.java11
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterProtonMetricsRetriever.java19
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/metrics/MetricsV2Handler.java4
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/metrics/PrometheusV1Handler.java4
-rw-r--r--container-core/src/test/java/com/yahoo/jdisc/http/server/jetty/SimpleHttpClient.java2
-rw-r--r--http-client/src/main/java/ai/vespa/hosted/client/AbstractHttpClient.java2
-rw-r--r--http-client/src/main/java/ai/vespa/hosted/client/HttpClient.java2
-rw-r--r--http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java71
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/HttpMetricFetcher.java15
-rw-r--r--orchestrator/src/main/java/com/yahoo/vespa/orchestrator/controller/RetryingClusterControllerClientFactory.java12
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/ApacheCluster.java11
-rw-r--r--vespaclient-java/src/main/java/com/yahoo/vespa/filedistribution/status/FileDistributionStatusClient.java3
20 files changed, 113 insertions, 87 deletions
diff --git a/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ConfigVerification.java b/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ConfigVerification.java
index 0def84ef789..89d949a5052 100644
--- a/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ConfigVerification.java
+++ b/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ConfigVerification.java
@@ -8,7 +8,6 @@ import com.yahoo.slime.SlimeUtils;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager;
import java.io.IOException;
import java.util.ArrayList;
@@ -38,7 +37,7 @@ public class ConfigVerification {
for (String arg : args) {
configservers.add(prefix + arg + ":" + port + "/config/v2/tenant/" + tenant + "/application/" + appName + "/environment/" + environment + "/region/" + region + "/instance/" + instance + "/?recursive=true");
}
- try (CloseableHttpClient httpClient = VespaHttpClientBuilder.create(BasicHttpClientConnectionManager::new).build()) {
+ try (CloseableHttpClient httpClient = VespaHttpClientBuilder.custom().build().build()) {
System.exit(compareConfigs(listConfigs(configservers, httpClient), httpClient));
}
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index b11355df689..ca06fe202d9 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -214,7 +214,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
public static class Builder {
private TenantRepository tenantRepository;
private Optional<Provisioner> hostProvisioner;
- private HttpProxy httpProxy = new HttpProxy(new SimpleHttpFetcher());
+ private HttpProxy httpProxy = new HttpProxy(new SimpleHttpFetcher(Duration.ofSeconds(30)));
private Clock clock = Clock.systemUTC();
private ConfigserverConfig configserverConfig = new ConfigserverConfig.Builder().build();
private Orchestrator orchestrator;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ConfigConvergenceChecker.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ConfigConvergenceChecker.java
index 4e02964fa58..132d3d913e7 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ConfigConvergenceChecker.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ConfigConvergenceChecker.java
@@ -14,6 +14,7 @@ import com.yahoo.config.model.api.ServiceInfo;
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
+import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
@@ -280,23 +281,23 @@ public class ConfigConvergenceChecker extends AbstractComponent {
}
}
- @SuppressWarnings("deprecation")
private static RequestConfig createRequestConfig(Duration timeout) {
return RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.ofSeconds(1))
.setResponseTimeout(Timeout.ofMilliseconds(timeout.toMillis()))
- .setConnectTimeout(Timeout.ofSeconds(1))
.build();
}
- @SuppressWarnings("deprecation")
private static CloseableHttpAsyncClient createHttpClient() {
return VespaAsyncHttpClientBuilder
.create(tlsStrategy ->
PoolingAsyncClientConnectionManagerBuilder.create()
.setMaxConnTotal(100)
.setMaxConnPerRoute(10)
- .setConnectionTimeToLive(TimeValue.ofMilliseconds(1))
+ .setDefaultConnectionConfig(ConnectionConfig.custom()
+ .setTimeToLive(TimeValue.ofMilliseconds(1))
+ .setConnectTimeout(Timeout.ofSeconds(1))
+ .build())
.setTlsStrategy(tlsStrategy)
.build())
.setIOReactorConfig(IOReactorConfig.custom()
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/HttpProxy.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/HttpProxy.java
index 1168898d126..0aa86ab211a 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/HttpProxy.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/HttpProxy.java
@@ -21,18 +21,15 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
+import java.time.Duration;
import java.util.List;
-import java.util.logging.Logger;
import static java.nio.charset.StandardCharsets.UTF_8;
public class HttpProxy {
-
- private static final Logger logger = Logger.getLogger(HttpProxy.class.getName());
-
private final HttpFetcher fetcher;
- @Inject public HttpProxy(NodeHostnameVerifier verifier) { this(new SimpleHttpFetcher(verifier)); }
+ @Inject public HttpProxy(NodeHostnameVerifier verifier) { this(new SimpleHttpFetcher(Duration.ofSeconds(30), verifier)); }
public HttpProxy(HttpFetcher fetcher) { this.fetcher = fetcher; }
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/LogRetriever.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/LogRetriever.java
index 17a3b186beb..bd36ff88aeb 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/LogRetriever.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/LogRetriever.java
@@ -18,7 +18,7 @@ import java.util.Optional;
*/
public class LogRetriever {
- private final CloseableHttpClient httpClient = VespaHttpClientBuilder.create().build();
+ private final CloseableHttpClient httpClient = VespaHttpClientBuilder.custom().build().build();
@SuppressWarnings("deprecation")
public HttpResponse getLogs(String logServerUri, Optional<Instant> deployTime) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SecretStoreValidator.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SecretStoreValidator.java
index 78fdf0a4a02..c4d849c3be0 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SecretStoreValidator.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SecretStoreValidator.java
@@ -33,7 +33,7 @@ public class SecretStoreValidator {
private static final String PROTOCOL = "http://";
private static final String AWS_PARAMETER_VALIDATION_HANDLER_POSTFIX = ":4080/validate-secret-store";
private final SecretStore secretStore;
- private final CloseableHttpClient httpClient = VespaHttpClientBuilder.create().build();
+ private final CloseableHttpClient httpClient = VespaHttpClientBuilder.custom().build().build();
public SecretStoreValidator(SecretStore secretStore) {
this.secretStore = secretStore;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SimpleHttpFetcher.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SimpleHttpFetcher.java
index da4e5d24c48..7bab17b2814 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SimpleHttpFetcher.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SimpleHttpFetcher.java
@@ -8,14 +8,13 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
-import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.util.Timeout;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.URI;
+import java.time.Duration;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -24,13 +23,14 @@ public class SimpleHttpFetcher implements HttpFetcher {
private final CloseableHttpClient client;
- public SimpleHttpFetcher() { this(null); }
+ public SimpleHttpFetcher(Duration connectTimeout) { this(connectTimeout, null); }
- public SimpleHttpFetcher(NodeHostnameVerifier verifier) {
- HttpClientBuilder b = verifier != null
- ? VespaHttpClientBuilder.create(PoolingHttpClientConnectionManager::new, verifier::verify)
- : VespaHttpClientBuilder.create();
- this.client = b.build();
+ public SimpleHttpFetcher(Duration connectTimeout, NodeHostnameVerifier verifier) {
+ VespaHttpClientBuilder builder = VespaHttpClientBuilder.custom().setConnectTimeout(Timeout.of(connectTimeout));
+ if (verifier != null) {
+ builder.set(verifier::verify);
+ }
+ this.client = builder.build().build();
}
@Override
@@ -41,7 +41,6 @@ public class SimpleHttpFetcher implements HttpFetcher {
request.addHeader("Connection", "Close");
request.setConfig(
RequestConfig.custom()
- .setConnectTimeout(Timeout.ofMilliseconds(params.readTimeoutMs))
.setResponseTimeout(Timeout.ofMilliseconds(params.readTimeoutMs))
.build());
try (CloseableHttpResponse response = client.execute(request)) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/TesterClient.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/TesterClient.java
index 4b339f72fa6..74dbe05ba62 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/TesterClient.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/TesterClient.java
@@ -23,7 +23,7 @@ import java.util.logging.Logger;
*/
public class TesterClient {
- private final CloseableHttpClient httpClient = VespaHttpClientBuilder.create().build();
+ private final CloseableHttpClient httpClient = VespaHttpClientBuilder.custom().build().build();
private static final Logger logger = Logger.getLogger(TesterClient.class.getName());
public HttpResponse getStatus(String testerHostname, int port) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterDeploymentMetricsRetriever.java b/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterDeploymentMetricsRetriever.java
index 548ea8046d4..f52f0783f62 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterDeploymentMetricsRetriever.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterDeploymentMetricsRetriever.java
@@ -55,17 +55,14 @@ public class ClusterDeploymentMetricsRetriever {
private static final ExecutorService executor = Executors.newFixedThreadPool(10, new DaemonThreadFactory("cluster-deployment-metrics-retriever-"));
- @SuppressWarnings("deprecation")
private static final CloseableHttpClient httpClient =
- VespaHttpClientBuilder
- .create(registry -> new PoolingHttpClientConnectionManager(registry,
- null,
- null,
- TimeValue.ofMinutes(1)))
+ VespaHttpClientBuilder.custom()
+ .setConnectTimeout(Timeout.ofSeconds(10))
+ .set(registry -> new PoolingHttpClientConnectionManager(registry, null, null, TimeValue.ofMinutes(1)))
+ .build()
.setDefaultRequestConfig(
RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.ofSeconds(60))
- .setConnectTimeout(Timeout.ofSeconds(10))
.setResponseTimeout(Timeout.ofSeconds(10))
.build())
.build();
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterProtonMetricsRetriever.java b/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterProtonMetricsRetriever.java
index 0dbe0131e9b..edc0e18edc7 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterProtonMetricsRetriever.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/metrics/ClusterProtonMetricsRetriever.java
@@ -12,7 +12,6 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.util.Timeout;
@@ -27,15 +26,15 @@ public class ClusterProtonMetricsRetriever {
private static final Logger log = Logger.getLogger(ClusterProtonMetricsRetriever.class.getName());
- @SuppressWarnings("deprecation")
- private static final CloseableHttpClient httpClient = VespaHttpClientBuilder
- .create(PoolingHttpClientConnectionManager::new)
- .setDefaultRequestConfig(
- RequestConfig.custom()
- .setConnectTimeout(Timeout.ofSeconds(10))
- .setResponseTimeout(Timeout.ofSeconds(10))
- .build())
- .build();
+ private static final CloseableHttpClient httpClient =
+ VespaHttpClientBuilder
+ .custom()
+ .setConnectTimeout(Timeout.ofSeconds(10))
+ .build()
+ .setDefaultRequestConfig(RequestConfig.custom()
+ .setResponseTimeout(Timeout.ofSeconds(10))
+ .build())
+ .build();
public Map<String, ProtonMetricsAggregator> requestMetricsGroupedByCluster(Collection<URI> hosts) {
diff --git a/container-core/src/main/java/com/yahoo/container/handler/metrics/MetricsV2Handler.java b/container-core/src/main/java/com/yahoo/container/handler/metrics/MetricsV2Handler.java
index 4a74d841ce2..1a8341072aa 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/metrics/MetricsV2Handler.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/metrics/MetricsV2Handler.java
@@ -61,12 +61,10 @@ public class MetricsV2Handler extends HttpHandlerBase {
}
}
- @SuppressWarnings("deprecation")
private static CloseableHttpClient createHttpClient() {
- return VespaHttpClientBuilder.create()
+ return VespaHttpClientBuilder.custom().setConnectTimeout(HTTP_CONNECT_TIMEOUT, MILLISECONDS).build()
.setUserAgent("application-metrics-retriever")
.setDefaultRequestConfig(RequestConfig.custom()
- .setConnectTimeout(HTTP_CONNECT_TIMEOUT, MILLISECONDS)
.setResponseTimeout(HTTP_SOCKET_TIMEOUT, MILLISECONDS)
.build())
.build();
diff --git a/container-core/src/main/java/com/yahoo/container/handler/metrics/PrometheusV1Handler.java b/container-core/src/main/java/com/yahoo/container/handler/metrics/PrometheusV1Handler.java
index f830a55e940..b30d5886a03 100644
--- a/container-core/src/main/java/com/yahoo/container/handler/metrics/PrometheusV1Handler.java
+++ b/container-core/src/main/java/com/yahoo/container/handler/metrics/PrometheusV1Handler.java
@@ -62,12 +62,10 @@ public class PrometheusV1Handler extends HttpHandlerBase {
}
}
- @SuppressWarnings("deprecation")
private static CloseableHttpClient createHttpClient() {
- return VespaHttpClientBuilder.create()
+ return VespaHttpClientBuilder.custom().setConnectTimeout(HTTP_CONNECT_TIMEOUT, MILLISECONDS).build()
.setUserAgent("application-prometheus-receiver")
.setDefaultRequestConfig(RequestConfig.custom()
- .setConnectTimeout(HTTP_CONNECT_TIMEOUT, MILLISECONDS)
.setResponseTimeout(HTTP_SOCKET_TIMEOUT, MILLISECONDS)
.build())
.build();
diff --git a/container-core/src/test/java/com/yahoo/jdisc/http/server/jetty/SimpleHttpClient.java b/container-core/src/test/java/com/yahoo/jdisc/http/server/jetty/SimpleHttpClient.java
index 39f3c7154f3..a91a200f9cc 100644
--- a/container-core/src/test/java/com/yahoo/jdisc/http/server/jetty/SimpleHttpClient.java
+++ b/container-core/src/test/java/com/yahoo/jdisc/http/server/jetty/SimpleHttpClient.java
@@ -5,6 +5,7 @@ import org.apache.hc.client5.http.SystemDefaultDnsResolver;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.classic.methods.HttpUriRequest;
+import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.entity.GzipCompressingEntity;
import org.apache.hc.client5.http.entity.mime.FormBodyPart;
import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
@@ -71,6 +72,7 @@ public class SimpleHttpClient implements AutoCloseable {
new DefaultHostnameVerifier());
PoolingHttpClientConnectionManager connManager = PoolingHttpClientConnectionManagerBuilder.create()
.setSSLSocketFactory(sslConnectionFactory)
+ .setDefaultConnectionConfig(ConnectionConfig.custom().build())
.setDnsResolver(new SystemDefaultDnsResolver() {
@Override
public InetAddress[] resolve(String host) throws UnknownHostException {
diff --git a/http-client/src/main/java/ai/vespa/hosted/client/AbstractHttpClient.java b/http-client/src/main/java/ai/vespa/hosted/client/AbstractHttpClient.java
index c62be40f1db..aab4bf710c1 100644
--- a/http-client/src/main/java/ai/vespa/hosted/client/AbstractHttpClient.java
+++ b/http-client/src/main/java/ai/vespa/hosted/client/AbstractHttpClient.java
@@ -114,7 +114,6 @@ public abstract class AbstractHttpClient implements HttpClient {
throw new IllegalStateException("No hosts to perform the request against");
}
- @SuppressWarnings("deprecation")
private HttpClientContext contextWithTimeout(RequestBuilder builder) {
HttpClientContext context = HttpClientContext.create();
RequestConfig config = builder.config;
@@ -122,7 +121,6 @@ public abstract class AbstractHttpClient implements HttpClient {
Optional<Duration> remaining = builder.deadline.timeLeftOrThrow();
if (remaining.isPresent()) {
config = RequestConfig.copy(config)
- .setConnectTimeout(min(config.getConnectTimeout(), remaining.get()))
.setConnectionRequestTimeout(min(config.getConnectionRequestTimeout(), remaining.get()))
.setResponseTimeout(min(config.getResponseTimeout(), remaining.get()))
.build();
diff --git a/http-client/src/main/java/ai/vespa/hosted/client/HttpClient.java b/http-client/src/main/java/ai/vespa/hosted/client/HttpClient.java
index fadffef2a87..2d1e80101cf 100644
--- a/http-client/src/main/java/ai/vespa/hosted/client/HttpClient.java
+++ b/http-client/src/main/java/ai/vespa/hosted/client/HttpClient.java
@@ -36,10 +36,8 @@ import static java.util.Objects.requireNonNull;
*/
public interface HttpClient extends Closeable {
- @SuppressWarnings("deprecation")
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.ofSeconds(5))
- .setConnectTimeout(Timeout.ofSeconds(5))
.setRedirectsEnabled(false)
.build();
diff --git a/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java b/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java
index a33c4c119c2..743ad1e8f6f 100644
--- a/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java
+++ b/http-utils/src/main/java/ai/vespa/util/http/hc5/VespaHttpClientBuilder.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package ai.vespa.util.http.hc5;
+import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.io.HttpClientConnectionManager;
@@ -10,9 +11,13 @@ import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.core5.http.config.Registry;
import org.apache.hc.core5.http.config.RegistryBuilder;
+import org.apache.hc.core5.util.TimeValue;
+import org.apache.hc.core5.util.Timeout;
import javax.net.ssl.HostnameVerifier;
+import java.util.concurrent.TimeUnit;
+
import static com.yahoo.security.tls.MixedMode.PLAINTEXT_CLIENT_MIXED_SERVER;
import static com.yahoo.security.tls.TransportSecurityUtils.getInsecureMixedMode;
import static com.yahoo.security.tls.TransportSecurityUtils.getSystemTlsContext;
@@ -20,36 +25,65 @@ import static com.yahoo.security.tls.TransportSecurityUtils.isTransportSecurityE
/**
* Sync HTTP client builder <em>for internal Vespa communications over http/https.</em>
- *
* Configures Vespa mTLS and handles TLS mixed mode automatically.
- * Custom connection managers must be configured through {@link #create(HttpClientConnectionManagerFactory)}.
+ * Custom connection managers must be configured through {@link #set(HttpClientConnectionManagerFactory)}.
*
* @author jonmv
*/
public class VespaHttpClientBuilder {
+ private HttpClientConnectionManagerFactory connectionManagerFactory = PoolingHttpClientConnectionManager::new;
+ private HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
+ private boolean rewriteHttpToHttps = true;
+ private final ConnectionConfig.Builder connectionConfigBuilder = ConnectionConfig.custom();
public interface HttpClientConnectionManagerFactory {
- HttpClientConnectionManager create(Registry<ConnectionSocketFactory> socketFactories);
+ PoolingHttpClientConnectionManager create(Registry<ConnectionSocketFactory> socketFactories);
+ }
+
+ private VespaHttpClientBuilder() {
}
- public static HttpClientBuilder create() {
- return create(PoolingHttpClientConnectionManager::new);
+ public static VespaHttpClientBuilder custom() {
+ return new VespaHttpClientBuilder();
}
- public static HttpClientBuilder create(HttpClientConnectionManagerFactory connectionManagerFactory) {
- return create(connectionManagerFactory, new NoopHostnameVerifier());
+ public VespaHttpClientBuilder set(HttpClientConnectionManagerFactory connectionManagerFactory) {
+ this.connectionManagerFactory = connectionManagerFactory;
+ return this;
}
- public static HttpClientBuilder create(HttpClientConnectionManagerFactory connectionManagerFactory,
- HostnameVerifier hostnameVerifier) {
- return create(connectionManagerFactory, hostnameVerifier, true);
+ public VespaHttpClientBuilder set(HostnameVerifier hostnameVerifier) {
+ this.hostnameVerifier = hostnameVerifier;
+ return this;
+ }
+ public VespaHttpClientBuilder setRewriteHttpToHttps(boolean enable) {
+ this.rewriteHttpToHttps = enable;
+ return this;
+ }
+ public VespaHttpClientBuilder setConnectTimeout(long connectTimeout, TimeUnit timeUnit) {
+ connectionConfigBuilder.setConnectTimeout(connectTimeout, timeUnit);
+ return this;
+ }
+ public VespaHttpClientBuilder setConnectTimeout(Timeout connectTimeout) {
+ connectionConfigBuilder.setConnectTimeout(connectTimeout);
+ return this;
+ }
+ public VespaHttpClientBuilder setSocketTimeout(long connectTimeout, TimeUnit timeUnit) {
+ connectionConfigBuilder.setConnectTimeout(connectTimeout, timeUnit);
+ return this;
+ }
+ public VespaHttpClientBuilder setValidateAfterInactivity(TimeValue validateAfterInactivity) {
+ connectionConfigBuilder.setValidateAfterInactivity(validateAfterInactivity);
+ return this;
+ }
+ public VespaHttpClientBuilder setSocketTimeout(Timeout connectTimeout) {
+ connectionConfigBuilder.setConnectTimeout(connectTimeout);
+ return this;
}
- public static HttpClientBuilder create(HttpClientConnectionManagerFactory connectionManagerFactory,
- HostnameVerifier hostnameVerifier,
- boolean rewriteHttpToHttps) {
+ public HttpClientBuilder build() {
HttpClientBuilder builder = HttpClientBuilder.create();
- addSslSocketFactory(builder, connectionManagerFactory, hostnameVerifier);
+ addSslSocketFactory(builder, new HttpClientConnectionManagerFactoryProxy(), hostnameVerifier);
if (rewriteHttpToHttps)
addHttpsRewritingRoutePlanner(builder);
@@ -61,6 +95,15 @@ public class VespaHttpClientBuilder {
return builder;
}
+ private class HttpClientConnectionManagerFactoryProxy implements HttpClientConnectionManagerFactory {
+ @Override
+ public PoolingHttpClientConnectionManager create(Registry<ConnectionSocketFactory> socketFactories) {
+ PoolingHttpClientConnectionManager manager = connectionManagerFactory.create(socketFactories);
+ manager.setDefaultConnectionConfig(connectionConfigBuilder.build());
+ return manager;
+ }
+ }
+
private static void addSslSocketFactory(HttpClientBuilder builder, HttpClientConnectionManagerFactory connectionManagerFactory,
HostnameVerifier hostnameVerifier) {
getSystemTlsContext().ifPresent(tlsContext -> {
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/HttpMetricFetcher.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/HttpMetricFetcher.java
index f766bebe4a2..d0cabef12b4 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/HttpMetricFetcher.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/HttpMetricFetcher.java
@@ -7,8 +7,6 @@ import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
-import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
-import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.util.Timeout;
import java.io.IOException;
@@ -81,19 +79,14 @@ public abstract class HttpMetricFetcher {
}
}
- @SuppressWarnings("deprecation")
private static CloseableHttpClient createHttpClient() {
- return VespaHttpClientBuilder.create(registry -> {
- var mgr = new PoolingHttpClientConnectionManager(registry);
- mgr.setDefaultSocketConfig(SocketConfig.custom()
- .setSoTimeout(Timeout.ofMilliseconds(SOCKET_TIMEOUT))
- .build());
- return mgr;
- })
+ return VespaHttpClientBuilder.custom()
+ .setConnectTimeout(Timeout.ofMilliseconds(CONNECTION_TIMEOUT))
+ .setSocketTimeout(Timeout.ofMilliseconds(CONNECTION_TIMEOUT))
+ .build()
.setUserAgent("metrics-proxy-http-client")
.setDefaultRequestConfig(RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.ofMilliseconds(SOCKET_TIMEOUT))
- .setConnectTimeout(Timeout.ofMilliseconds(CONNECTION_TIMEOUT))
.setResponseTimeout(Timeout.ofMilliseconds(SOCKET_TIMEOUT))
.build())
.build();
diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/controller/RetryingClusterControllerClientFactory.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/controller/RetryingClusterControllerClientFactory.java
index 479d6bfe079..5bd4e03642e 100644
--- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/controller/RetryingClusterControllerClientFactory.java
+++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/controller/RetryingClusterControllerClientFactory.java
@@ -8,6 +8,7 @@ import com.yahoo.component.annotation.Inject;
import com.yahoo.component.AbstractComponent;
import com.yahoo.vespa.applicationmodel.HostName;
import org.apache.hc.core5.http.message.BasicHeader;
+import org.apache.hc.core5.util.Timeout;
import java.io.IOException;
import java.util.List;
@@ -25,10 +26,13 @@ public class RetryingClusterControllerClientFactory extends AbstractComponent im
@Inject
public RetryingClusterControllerClientFactory() {
- this(AbstractHttpClient.wrapping(VespaHttpClientBuilder.create()
- .setUserAgent("orchestrator-cluster-controller-client")
- .setDefaultHeaders(List.of(new BasicHeader("Accept", "application/json")))
- .build()));
+ this(AbstractHttpClient.wrapping(VespaHttpClientBuilder
+ .custom()
+ .setConnectTimeout(Timeout.ofSeconds(5))
+ .build()
+ .setUserAgent("orchestrator-cluster-controller-client")
+ .setDefaultHeaders(List.of(new BasicHeader("Accept", "application/json")))
+ .build()));
}
RetryingClusterControllerClientFactory(HttpClient client) {
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/ApacheCluster.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/ApacheCluster.java
index a097c01b76b..8b0509dc788 100644
--- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/ApacheCluster.java
+++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/impl/ApacheCluster.java
@@ -9,6 +9,7 @@ import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
+import org.apache.hc.client5.http.impl.async.MinimalH2AsyncClient;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.ContentType;
@@ -175,17 +176,17 @@ class ApacheCluster implements Cluster {
if (builder.hostnameVerifier != null)
tlsStrategyBuilder.setHostnameVerifier(builder.hostnameVerifier);
- var client = HttpAsyncClients.createHttp2Minimal(H2Config.custom()
+ MinimalH2AsyncClient client = HttpAsyncClients.createHttp2Minimal(H2Config.custom()
.setMaxConcurrentStreams(builder.maxStreamsPerConnection)
.setCompressionEnabled(true)
.setPushEnabled(false)
.setInitialWindowSize(Integer.MAX_VALUE)
.build(),
IOReactorConfig.custom()
- .setIoThreadCount(2)
- .setTcpNoDelay(true)
- .setSoTimeout(Timeout.ofSeconds(10))
- .build(),
+ .setIoThreadCount(2)
+ .setTcpNoDelay(true)
+ .setSoTimeout(Timeout.ofSeconds(10))
+ .build(),
tlsStrategyBuilder.build());
client.setConnectionConfigResolver(host -> connectionConfig);
return client;
diff --git a/vespaclient-java/src/main/java/com/yahoo/vespa/filedistribution/status/FileDistributionStatusClient.java b/vespaclient-java/src/main/java/com/yahoo/vespa/filedistribution/status/FileDistributionStatusClient.java
index eb26fdaaccc..6ab3394b2e6 100644
--- a/vespaclient-java/src/main/java/com/yahoo/vespa/filedistribution/status/FileDistributionStatusClient.java
+++ b/vespaclient-java/src/main/java/com/yahoo/vespa/filedistribution/status/FileDistributionStatusClient.java
@@ -75,11 +75,10 @@ public class FileDistributionStatusClient {
private String doHttpRequest() {
Timeout timeoutInMillis = Timeout.ofMilliseconds((long) (timeout * 1000));
RequestConfig config = custom()
- .setConnectTimeout(timeoutInMillis)
.setConnectionRequestTimeout(timeoutInMillis)
.setResponseTimeout(timeoutInMillis)
.build();
- try (CloseableHttpClient httpClient = VespaHttpClientBuilder.create().build()) {
+ try (CloseableHttpClient httpClient = VespaHttpClientBuilder.custom().setConnectTimeout(timeoutInMillis).build().build()) {
URI statusUri = createStatusApiUri();
if (debug)
System.out.println("URI:" + statusUri);