This is an automated email from the ASF dual-hosted git repository. amagyar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push: new 5e4741d20 KNOX-3000 - Add configurable socket / read timeout parameter to discovery client (#833) 5e4741d20 is described below commit 5e4741d20e23378aeb31896aedab073ae9408f3a Author: Attila Magyar <m.magy...@gmail.com> AuthorDate: Thu Jan 18 17:53:50 2024 +0100 KNOX-3000 - Add configurable socket / read timeout parameter to discovery client (#833) --- .../ClouderaManagerServiceDiscoveryMessages.java | 3 +++ .../topology/discovery/cm/DiscoveryApiClient.java | 23 +++++++++++++++------- .../gateway/config/impl/GatewayConfigImpl.java | 22 +++++++++++++++++++++ .../org/apache/knox/gateway/GatewayTestConfig.java | 14 +++++++++++++ .../apache/knox/gateway/config/GatewayConfig.java | 5 +++++ 5 files changed, 60 insertions(+), 7 deletions(-) diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java index c86fe2912..3bed0b53a 100644 --- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java +++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java @@ -279,4 +279,7 @@ public interface ClouderaManagerServiceDiscoveryMessages { @Message(level = MessageLevel.DEBUG, text = "Found downscale event for role: {0} hosts: {1}") void foundDownScaleEvent(String role, Set<String> hosts); + + @Message(level = MessageLevel.DEBUG, text = "Service discovery client connect timeout {0} ms, read timeout {1} ms, write timeout {2} ms") + void discoveryClientTimeout(long connectTimeout, long readTimeout, long writeTimeout); } diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java index b1c9eacf1..5a74a9cc8 100644 --- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java +++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/DiscoveryApiClient.java @@ -24,10 +24,16 @@ import java.security.KeyStore; import java.util.Arrays; import java.util.List; import java.util.Set; - +import java.util.concurrent.TimeUnit; import javax.net.ssl.SSLContext; import javax.security.auth.Subject; +import com.cloudera.api.swagger.client.ApiClient; +import com.cloudera.api.swagger.client.Pair; +import com.cloudera.api.swagger.client.auth.Authentication; +import com.cloudera.api.swagger.client.auth.HttpBasicAuth; +import com.squareup.okhttp.ConnectionSpec; +import com.squareup.okhttp.OkHttpClient; import org.apache.knox.gateway.config.ConfigurationException; import org.apache.knox.gateway.config.GatewayConfig; import org.apache.knox.gateway.i18n.messages.MessagesFactory; @@ -38,12 +44,6 @@ import org.apache.knox.gateway.topology.discovery.cm.auth.AuthUtils; import org.apache.knox.gateway.topology.discovery.cm.auth.SpnegoAuthInterceptor; import org.apache.knox.gateway.util.TruststoreSSLContextUtils; -import com.cloudera.api.swagger.client.ApiClient; -import com.cloudera.api.swagger.client.Pair; -import com.cloudera.api.swagger.client.auth.Authentication; -import com.cloudera.api.swagger.client.auth.HttpBasicAuth; -import com.squareup.okhttp.ConnectionSpec; - /** * Cloudera Manager ApiClient extension for service discovery. */ @@ -134,10 +134,19 @@ public class DiscoveryApiClient extends ApiClient { getHttpClient().interceptors().add(spnegoInterceptor); } } + configureTimeouts(gatewayConfig); configureSsl(gatewayConfig, trustStore); } + private void configureTimeouts(GatewayConfig config) { + OkHttpClient client = getHttpClient(); + client.setConnectTimeout(config.getServiceDiscoveryConnectTimeoutMillis(), TimeUnit.MILLISECONDS); + client.setReadTimeout(config.getServiceDiscoveryReadTimeoutMillis(), TimeUnit.MILLISECONDS); + client.setWriteTimeout(config.getServiceDiscoveryWriteTimeoutMillis(), TimeUnit.MILLISECONDS); + log.discoveryClientTimeout(client.getConnectTimeout(), client.getReadTimeout(), client.getWriteTimeout()); + } + @Override public String buildUrl(String path, List<Pair> queryParams) { // If kerberos is enabled, then for every request, we're going to include a doAs query param diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java b/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java index 3d3848921..f924d9773 100644 --- a/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java +++ b/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java @@ -287,6 +287,13 @@ public class GatewayConfigImpl extends Configuration implements GatewayConfig { private static final String CLOUDERA_MANAGER_ADVANCED_SERVICE_DISCOVERY_CONF_MONITOR_INTERVAL = GATEWAY_CONFIG_FILE_PREFIX + ".cloudera.manager.advanced.service.discovery.config.monitor.interval"; private static final String CLOUDERA_MANAGER_SERVICE_DISCOVERY_REPOSITORY_CACHE_ENTRY_TTL = GATEWAY_CONFIG_FILE_PREFIX + ".cloudera.manager.service.discovery.repository.cache.entry.ttl"; private static final String CLOUDERA_MANAGER_SERVICE_DISCOVERY_MAX_RETRY_ATTEMPS = GATEWAY_CONFIG_FILE_PREFIX + ".cloudera.manager.service.discovery.maximum.retry.attemps"; + private static final String CLOUDERA_MANAGER_SERVICE_DISCOVERY_CONNECT_TIMEOUT = GATEWAY_CONFIG_FILE_PREFIX + ".cloudera.manager.service.discovery.connect.timeout.ms"; + private static final String CLOUDERA_MANAGER_SERVICE_DISCOVERY_READ_TIMEOUT = GATEWAY_CONFIG_FILE_PREFIX + ".cloudera.manager.service.discovery.read.timeout.ms"; + private static final String CLOUDERA_MANAGER_SERVICE_DISCOVERY_WRITE_TIMEOUT = GATEWAY_CONFIG_FILE_PREFIX + ".cloudera.manager.service.discovery.write.timeout.ms"; + + private static final long CLOUDERA_MANAGER_SERVICE_DISCOVERY_CONNECT_TIMEOUT_DEFAULT = 10000; + private static final long CLOUDERA_MANAGER_SERVICE_DISCOVERY_READ_TIMEOUT_DEFAULT = 10000; + private static final long CLOUDERA_MANAGER_SERVICE_DISCOVERY_WRITE_TIMEOUT_DEFAULT = 10000; private static final String KNOX_TOKEN_EVICTION_INTERVAL = GATEWAY_CONFIG_FILE_PREFIX + ".knox.token.eviction.interval"; private static final String KNOX_TOKEN_EVICTION_GRACE_PERIOD = GATEWAY_CONFIG_FILE_PREFIX + ".knox.token.eviction.grace.period"; @@ -1501,6 +1508,21 @@ public class GatewayConfigImpl extends Configuration implements GatewayConfig { return getPathAliases(".application"); } + @Override + public long getServiceDiscoveryConnectTimeoutMillis() { + return getLong(CLOUDERA_MANAGER_SERVICE_DISCOVERY_CONNECT_TIMEOUT, CLOUDERA_MANAGER_SERVICE_DISCOVERY_CONNECT_TIMEOUT_DEFAULT); + } + + @Override + public long getServiceDiscoveryReadTimeoutMillis() { + return getLong(CLOUDERA_MANAGER_SERVICE_DISCOVERY_READ_TIMEOUT, CLOUDERA_MANAGER_SERVICE_DISCOVERY_READ_TIMEOUT_DEFAULT); + } + + @Override + public long getServiceDiscoveryWriteTimeoutMillis() { + return getLong(CLOUDERA_MANAGER_SERVICE_DISCOVERY_WRITE_TIMEOUT, CLOUDERA_MANAGER_SERVICE_DISCOVERY_WRITE_TIMEOUT_DEFAULT); + } + private Map<String, Collection<String>> getPathAliases(String qualifier) { final String prefix = GATEWAY_CONFIG_FILE_PREFIX + qualifier + DEPLOYMENT_PATH_ALIAS; final Map<String, Collection<String>> pathAliases = new HashMap<>(); diff --git a/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java b/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java index 3162f7140..bf53c50da 100644 --- a/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java +++ b/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java @@ -1067,4 +1067,18 @@ public class GatewayTestConfig extends Configuration implements GatewayConfig { return Collections.emptyMap(); } + @Override + public long getServiceDiscoveryConnectTimeoutMillis() { + return -1; + } + + @Override + public long getServiceDiscoveryReadTimeoutMillis() { + return -1; + } + + @Override + public long getServiceDiscoveryWriteTimeoutMillis() { + return -1; + } } diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java b/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java index 83d1bb926..7159ebf27 100644 --- a/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java +++ b/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java @@ -898,4 +898,9 @@ public interface GatewayConfig { Map<String, Collection<String>> getApplicationPathAliases(); + long getServiceDiscoveryConnectTimeoutMillis(); + + long getServiceDiscoveryReadTimeoutMillis(); + + long getServiceDiscoveryWriteTimeoutMillis(); }