From 9b88623aef8bb62ca69eb4d9f414477902ea6724 Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Thu, 23 Oct 2025 15:02:54 +0200 Subject: [PATCH 1/2] warn the first time the TCCL fails to be set Signed-off-by: Ludovic Orban --- .../jetty/server/handler/ContextHandler.java | 14 ++++++++++++-- .../jetty/server/handler/ContextHandlerTest.java | 12 ++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index 462cb8209a2..4fa75749624 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -28,6 +28,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Predicate; @@ -133,6 +134,7 @@ public static ContextHandler getContextHandler(Request request) private final MimeTypes.Wrapper _mimeTypes = new MimeTypes.Wrapper(); private final List _contextListeners = new CopyOnWriteArrayList<>(); private final List _vhosts = new ArrayList<>(); + private final AtomicBoolean _enterScopeSetClassloaderFailed = new AtomicBoolean(); private String _displayName; private String _contextPath = "/"; @@ -634,8 +636,16 @@ protected ClassLoader enterScope(Request contextRequest) } catch (Throwable x) { - if (LOG.isDebugEnabled()) - LOG.debug("error setting a context classloader on thread {}", Thread.currentThread(), x); + // Log as warning the first time it happens. + if (_enterScopeSetClassloaderFailed.compareAndSet(false, true)) + { + LOG.warn("Error setting a context classloader on thread {}", Thread.currentThread(), x); + } + else + { + if (LOG.isDebugEnabled()) + LOG.debug("Error setting a context classloader on thread {}", Thread.currentThread(), x); + } } } notifyEnterScope(contextRequest); diff --git a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java index 02cb70aa595..af4592b5dc5 100644 --- a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java +++ b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java @@ -193,7 +193,8 @@ public boolean handle(Request request, Response response, Callback callback) thr @Override public void run() { - try (Blocker.Callback cb = Blocker.callback()) + try (StacklessLogging ignore = new StacklessLogging(ContextHandler.class); + Blocker.Callback cb = Blocker.callback()) { // When a classloader is configured, Response.write() tries to set it as the context classloader. response.write(true, ByteBuffer.allocate(32), cb); @@ -209,6 +210,12 @@ public void run() } } + @Override + public ClassLoader getContextClassLoader() + { + return null; + } + @Override public void setContextClassLoader(ClassLoader cl) { @@ -258,7 +265,8 @@ public boolean handle(Request request, Response response, Callback callback) thr @Override public void completed(Integer result, Object attachment) { - try (Blocker.Callback cb = Blocker.callback()) + try (StacklessLogging ignore = new StacklessLogging(ContextHandler.class); + Blocker.Callback cb = Blocker.callback()) { // When a classloader is configured, Response.write() tries to set it as the context classloader. response.write(true, ByteBuffer.allocate(32), cb); From ed0af072fe0e4ea6499e0c7f4cefefc64c4996a0 Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Thu, 23 Oct 2025 18:21:45 +0200 Subject: [PATCH 2/2] handle review comments Signed-off-by: Ludovic Orban --- .../eclipse/jetty/server/handler/ContextHandler.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index 4fa75749624..cf2c2b270cd 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -637,15 +637,11 @@ protected ClassLoader enterScope(Request contextRequest) catch (Throwable x) { // Log as warning the first time it happens. + String msg = "Error setting a context classloader on thread {}"; if (_enterScopeSetClassloaderFailed.compareAndSet(false, true)) - { - LOG.warn("Error setting a context classloader on thread {}", Thread.currentThread(), x); - } - else - { - if (LOG.isDebugEnabled()) - LOG.debug("Error setting a context classloader on thread {}", Thread.currentThread(), x); - } + LOG.warn(msg, Thread.currentThread(), x); + else if (LOG.isDebugEnabled()) + LOG.debug(msg, Thread.currentThread(), x); } } notifyEnterScope(contextRequest);