From ee083cb1446074fef0c72f06ab1bb37eaf28247a Mon Sep 17 00:00:00 2001 From: David Smiley Date: Tue, 17 Mar 2026 00:21:48 -0400 Subject: [PATCH] JettySolrRunner: catch TimeoutException from Jetty 12 graceful shutdown Jetty 12's Server.doStop() throws TimeoutException when graceful shutdown exceeds the 15-second stop timeout. This was propagating uncaught, skipping all forceful cleanup (qtp stop, rte stop, server join), causing thread leaks and cascading test failures like LB2SolrClientTest flakiness on CI. Co-Authored-By: Claude Opus 4.6 --- .../src/java/org/apache/solr/embedded/JettySolrRunner.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java b/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java index e4224e44e6c8..04c948b99c2c 100644 --- a/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java +++ b/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java @@ -49,6 +49,7 @@ import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.apache.solr.client.solrj.SolrClient; @@ -676,7 +677,11 @@ public synchronized void stop() throws Exception { QueuedThreadPool qtp = (QueuedThreadPool) server.getThreadPool(); ReservedThreadExecutor rte = qtp.getBean(ReservedThreadExecutor.class); - server.stop(); + try { + server.stop(); + } catch (TimeoutException e) { + log.warn("Jetty server graceful stop timed out; proceeding with forceful cleanup", e); + } // stop timeout is 0, so we will interrupt right away while (!qtp.isStopped()) {