diff options
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); |