From 4c9cb54ed8fd305bd53f04425a49baa3ed8a51bf Mon Sep 17 00:00:00 2001 From: Ed Shryane Date: Mon, 3 Feb 2025 19:20:45 +0100 Subject: [PATCH 1/5] Set Jetty server stop timeout --- .../java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java index 33496f4c87..42c162d39a 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java @@ -222,6 +222,9 @@ private Server createServer() { server.setHandler(handlers); server.setStopAtShutdown(false); + LOGGER.info("Server stop timeout was {}ms", server.getStopTimeout()); + server.setStopTimeout(10_000L); + server.setRequestLog(createRequestLog()); if (rewriteEngineEnabled) { From c492c163cc506f3152c35d37db49c90c2490529b Mon Sep 17 00:00:00 2001 From: Ed Shryane Date: Mon, 3 Feb 2025 19:49:32 +0100 Subject: [PATCH 2/5] Set Jetty connector shutdown idle timeout --- .../java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java index 42c162d39a..1213a5261d 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java @@ -262,6 +262,7 @@ private Connector createInsecureConnector(final Server server, final HttpConfigu httpConfiguration.setIdleTimeout(idleTimeout * 1000L); httpConfiguration.setUriCompliance(UriCompliance.LEGACY); final ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration), new HTTP2CServerConnectionFactory(httpConfiguration)); + connector.setShutdownIdleTimeout(10_000L); connector.setPort(this.port); return connector; } @@ -344,6 +345,7 @@ protected TrustManagerFactory getTrustManagerFactoryInstance() { final ServerConnector sslConnector = new ServerConnector(server, sslConnectionFactory, alpn, h2, new HttpConnectionFactory(httpsConfiguration)); sslConnector.setPort(port); + sslConnector.setShutdownIdleTimeout(10_000L); return sslConnector; } From 494a954e0b34c25f7da42cc3b954430c0a36e454 Mon Sep 17 00:00:00 2001 From: Ed Shryane Date: Mon, 3 Feb 2025 20:06:48 +0100 Subject: [PATCH 3/5] Set Jetty stop at shutdown --- .../net/ripe/db/whois/api/httpserver/JettyBootstrap.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java index 1213a5261d..0ff87ec5a5 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java @@ -221,9 +221,8 @@ private Server createServer() { setConnectors(server); server.setHandler(handlers); - server.setStopAtShutdown(false); - LOGGER.info("Server stop timeout was {}ms", server.getStopTimeout()); - server.setStopTimeout(10_000L); + server.setStopAtShutdown(true); + server.setStopTimeout(20_000L); server.setRequestLog(createRequestLog()); From 365210693417957c6e8d3057454e806d3480c09d Mon Sep 17 00:00:00 2001 From: Ed Shryane Date: Mon, 3 Feb 2025 20:21:48 +0100 Subject: [PATCH 4/5] Dont stop immediately --- .../net/ripe/db/whois/api/httpserver/JettyBootstrap.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java index 0ff87ec5a5..bad8412ef1 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java @@ -221,8 +221,8 @@ private Server createServer() { setConnectors(server); server.setHandler(handlers); - server.setStopAtShutdown(true); - server.setStopTimeout(20_000L); + server.setStopAtShutdown(false); // don't stop immediately + server.setStopTimeout(30_000L); server.setRequestLog(createRequestLog()); @@ -261,7 +261,7 @@ private Connector createInsecureConnector(final Server server, final HttpConfigu httpConfiguration.setIdleTimeout(idleTimeout * 1000L); httpConfiguration.setUriCompliance(UriCompliance.LEGACY); final ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration), new HTTP2CServerConnectionFactory(httpConfiguration)); - connector.setShutdownIdleTimeout(10_000L); + connector.setShutdownIdleTimeout(20_000L); connector.setPort(this.port); return connector; } @@ -344,7 +344,7 @@ protected TrustManagerFactory getTrustManagerFactoryInstance() { final ServerConnector sslConnector = new ServerConnector(server, sslConnectionFactory, alpn, h2, new HttpConnectionFactory(httpsConfiguration)); sslConnector.setPort(port); - sslConnector.setShutdownIdleTimeout(10_000L); + sslConnector.setShutdownIdleTimeout(20_000L); return sslConnector; } From 6045f25f6f7990180e0a6740f983312fa7a04703 Mon Sep 17 00:00:00 2001 From: Ed Shryane Date: Tue, 4 Feb 2025 09:21:11 +0100 Subject: [PATCH 5/5] Delay Jetty shutdown --- .../db/whois/api/httpserver/JettyBootstrap.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java index bad8412ef1..adfbea95e2 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java @@ -1,5 +1,6 @@ package net.ripe.db.whois.api.httpserver; +import com.google.common.util.concurrent.Uninterruptibles; import io.netty.handler.ssl.util.TrustManagerFactoryWrapper; import jakarta.servlet.DispatcherType; import net.ripe.db.whois.api.httpserver.dos.WhoisDoSFilter; @@ -46,6 +47,8 @@ import java.util.Collection; import java.util.EnumSet; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; // TODO: [ES] remove duplicate code from InternalJettyBootstrap in whois-internal @Component @@ -260,7 +263,12 @@ private void setConnectors(final Server server) { private Connector createInsecureConnector(final Server server, final HttpConfiguration httpConfiguration) { httpConfiguration.setIdleTimeout(idleTimeout * 1000L); httpConfiguration.setUriCompliance(UriCompliance.LEGACY); - final ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration), new HTTP2CServerConnectionFactory(httpConfiguration)); + final ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration), new HTTP2CServerConnectionFactory(httpConfiguration)) { + @Override + public CompletableFuture shutdown() { + return CompletableFuture.runAsync(() -> {Uninterruptibles.sleepUninterruptibly(20_000L, TimeUnit.MILLISECONDS);}); + } + }; connector.setShutdownIdleTimeout(20_000L); connector.setPort(this.port); return connector; @@ -342,7 +350,12 @@ protected TrustManagerFactory getTrustManagerFactoryInstance() { final SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(sslContextFactory, alpn.getProtocol()); - final ServerConnector sslConnector = new ServerConnector(server, sslConnectionFactory, alpn, h2, new HttpConnectionFactory(httpsConfiguration)); + final ServerConnector sslConnector = new ServerConnector(server, sslConnectionFactory, alpn, h2, new HttpConnectionFactory(httpsConfiguration)) { + @Override + public CompletableFuture shutdown() { + return CompletableFuture.runAsync(() -> {Uninterruptibles.sleepUninterruptibly(20_000L, TimeUnit.MILLISECONDS);}); + } + }; sslConnector.setPort(port); sslConnector.setShutdownIdleTimeout(20_000L); return sslConnector;