diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-06-03 17:31:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-03 17:31:06 +0200 |
commit | 5c5baf210916120f22d289d4cabb14cee2c95069 (patch) | |
tree | 02e268c5118e3395c652452a7f39c2d396f6d929 | |
parent | 6a49d9f3d265bcb29fc062c16a58ff32f16c1fbb (diff) | |
parent | c56c5cbbc42d5c9c6ffc7cab80ee4d051a402610 (diff) |
Merge pull request #18111 from vespa-engine/bjorncs/http2-stream-idle-timeout
Bjorncs/http2 stream idle timeout
5 files changed, 53 insertions, 6 deletions
diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json index efe6701342f..02d43104a3f 100644 --- a/container-core/abi-spec.json +++ b/container-core/abi-spec.json @@ -1039,6 +1039,7 @@ "public com.yahoo.jdisc.http.ConnectorConfig$Builder maxRequestsPerConnection(int)", "public com.yahoo.jdisc.http.ConnectorConfig$Builder maxConnectionLife(double)", "public com.yahoo.jdisc.http.ConnectorConfig$Builder http2Enabled(boolean)", + "public com.yahoo.jdisc.http.ConnectorConfig$Builder http2(com.yahoo.jdisc.http.ConnectorConfig$Http2$Builder)", "public final boolean dispatchGetConfig(com.yahoo.config.ConfigInstance$Producer)", "public final java.lang.String getDefMd5()", "public final java.lang.String getDefName()", @@ -1053,7 +1054,8 @@ "public com.yahoo.jdisc.http.ConnectorConfig$TlsClientAuthEnforcer$Builder tlsClientAuthEnforcer", "public com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder healthCheckProxy", "public com.yahoo.jdisc.http.ConnectorConfig$ProxyProtocol$Builder proxyProtocol", - "public com.yahoo.jdisc.http.ConnectorConfig$SecureRedirect$Builder secureRedirect" + "public com.yahoo.jdisc.http.ConnectorConfig$SecureRedirect$Builder secureRedirect", + "public com.yahoo.jdisc.http.ConnectorConfig$Http2$Builder http2" ] }, "com.yahoo.jdisc.http.ConnectorConfig$HealthCheckProxy$Builder": { @@ -1089,6 +1091,37 @@ ], "fields": [] }, + "com.yahoo.jdisc.http.ConnectorConfig$Http2$Builder": { + "superClass": "java.lang.Object", + "interfaces": [ + "com.yahoo.config.ConfigBuilder" + ], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>()", + "public void <init>(com.yahoo.jdisc.http.ConnectorConfig$Http2)", + "public com.yahoo.jdisc.http.ConnectorConfig$Http2$Builder streamIdleTimeout(double)", + "public com.yahoo.jdisc.http.ConnectorConfig$Http2$Builder maxConcurrentStreams(int)", + "public com.yahoo.jdisc.http.ConnectorConfig$Http2 build()" + ], + "fields": [] + }, + "com.yahoo.jdisc.http.ConnectorConfig$Http2": { + "superClass": "com.yahoo.config.InnerNode", + "interfaces": [], + "attributes": [ + "public", + "final" + ], + "methods": [ + "public void <init>(com.yahoo.jdisc.http.ConnectorConfig$Http2$Builder)", + "public double streamIdleTimeout()", + "public int maxConcurrentStreams()" + ], + "fields": [] + }, "com.yahoo.jdisc.http.ConnectorConfig$Producer": { "superClass": "java.lang.Object", "interfaces": [ @@ -1361,7 +1394,8 @@ "public com.yahoo.jdisc.http.ConnectorConfig$SecureRedirect secureRedirect()", "public int maxRequestsPerConnection()", "public double maxConnectionLife()", - "public boolean http2Enabled()" + "public boolean http2Enabled()", + "public com.yahoo.jdisc.http.ConnectorConfig$Http2 http2()" ], "fields": [ "public static final java.lang.String CONFIG_DEF_MD5", diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java index fc39de72018..4ad39f91a83 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ConnectorFactory.java @@ -75,7 +75,7 @@ public class ConnectorFactory { connector.setName(connectorConfig.name()); connector.setAcceptQueueSize(connectorConfig.acceptQueueSize()); connector.setReuseAddress(connectorConfig.reuseAddress()); - connector.setIdleTimeout(idleTimeoutInMillis()); + connector.setIdleTimeout(toMillis(connector.getIdleTimeout())); return connector; } @@ -162,8 +162,8 @@ public class ConnectorFactory { private HTTP2ServerConnectionFactory newHttp2ConnectionFactory() { HTTP2ServerConnectionFactory factory = new HTTP2ServerConnectionFactory(newHttpConfiguration()); - factory.setStreamIdleTimeout(idleTimeoutInMillis()); - factory.setMaxConcurrentStreams(4096); + factory.setStreamIdleTimeout(toMillis(connectorConfig.http2().streamIdleTimeout())); + factory.setMaxConcurrentStreams(connectorConfig.http2().maxConcurrentStreams()); return factory; } @@ -194,6 +194,6 @@ public class ConnectorFactory { || (config.implicitTlsEnabled() && TransportSecurityUtils.isTransportSecurityEnabled()); } - private long idleTimeoutInMillis() { return (long) (connectorConfig.idleTimeout() * 1000.0); } + private static long toMillis(double seconds) { return (long)(seconds * 1000); } } diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java index 7828751df5a..ba292062197 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/HttpRequestDispatch.java @@ -26,6 +26,7 @@ import java.time.Instant; import java.util.Arrays; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -119,6 +120,10 @@ class HttpRequestDispatch { error, () -> "Network connection was unexpectedly terminated: " + parent.jettyRequest.getRequestURI()); parent.metricReporter.prematurelyClosed(); + } else if (isErrorOfType(error, TimeoutException.class)) { + log.log(Level.FINE, + error, + () -> "Request/stream was timed out by Jetty: " + parent.jettyRequest.getRequestURI()); } else if (!isErrorOfType(error, OverloadException.class, BindingNotFoundException.class, RequestException.class)) { log.log(Level.WARNING, "Request failed: " + parent.jettyRequest.getRequestURI(), error); } diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletResponseController.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletResponseController.java index 31fa9e9ebaa..d61a3745653 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletResponseController.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletResponseController.java @@ -20,6 +20,7 @@ import java.nio.ByteBuffer; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; @@ -75,6 +76,9 @@ public class ServletResponseController { return HttpServletResponse.SC_NOT_FOUND; } else if (t instanceof RequestException) { return ((RequestException)t).getResponseStatus(); + } else if (t instanceof TimeoutException) { + // E.g stream idle timeout for HTTP/2 + return HttpServletResponse.SC_SERVICE_UNAVAILABLE; } else { return HttpServletResponse.SC_INTERNAL_SERVER_ERROR; } diff --git a/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def b/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def index 09b883a620e..0b01f690aea 100644 --- a/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def +++ b/container-core/src/main/resources/configdefinitions/jdisc.http.jdisc.http.connector.def @@ -128,3 +128,7 @@ maxConnectionLife double default=0.0 # Enable HTTP/2 (in addition to HTTP/1.1 using ALPN) http2Enabled bool default=true + +http2.streamIdleTimeout double default=600 + +http2.maxConcurrentStreams int default=4096 |