diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java index 771cc50..50cb5a6 100644 --- a/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -130,6 +130,7 @@ AsyncContextImpl asyncConImpl = request.getAsyncContextInternal(); req.getRequestProcessor().setWorkerThreadName(THREAD_NAME.get()); + req.setRequestThread(); try { if (!request.isAsync()) { @@ -341,6 +342,7 @@ boolean postParseSuccess = false; req.getRequestProcessor().setWorkerThreadName(THREAD_NAME.get()); + req.setRequestThread(); try { // Parse and set Catalina and configuration specific diff --git a/java/org/apache/catalina/connector/InputBuffer.java b/java/org/apache/catalina/connector/InputBuffer.java index de306f5..ac1b816 100644 --- a/java/org/apache/catalina/connector/InputBuffer.java +++ b/java/org/apache/catalina/connector/InputBuffer.java @@ -32,7 +32,6 @@ import org.apache.catalina.security.SecurityUtil; import org.apache.coyote.ActionCode; -import org.apache.coyote.ContainerThreadMarker; import org.apache.coyote.Request; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -266,7 +265,7 @@ // If this is a non-container thread, need to trigger a read // which will eventually lead to a call to onAllDataRead() via a // container thread. - if (!ContainerThreadMarker.isContainerThread()) { + if (!coyoteRequest.isRequestThread()) { coyoteRequest.action(ActionCode.DISPATCH_READ, null); coyoteRequest.action(ActionCode.DISPATCH_EXECUTE, null); } diff --git a/java/org/apache/coyote/Request.java b/java/org/apache/coyote/Request.java index 08dc535..0cb4dbe 100644 --- a/java/org/apache/coyote/Request.java +++ b/java/org/apache/coyote/Request.java @@ -172,6 +172,7 @@ private long bytesRead=0; // Time of the request - useful to avoid repeated calls to System.currentTime private long startTimeNanos = -1; + private long threadId = 0; private int available = 0; private final RequestInfo reqProcessorMX=new RequestInfo(this); @@ -238,7 +239,7 @@ fireListener = true; } action(ActionCode.DISPATCH_READ, null); - if (!ContainerThreadMarker.isContainerThread()) { + if (!isRequestThread()) { // Not on a container thread so need to execute the dispatch action(ActionCode.DISPATCH_EXECUTE, null); } @@ -737,6 +738,18 @@ this.startTimeNanos = startTimeNanos; } + public long getThreadId() { + return threadId; + } + + public void setRequestThread() { + threadId = Thread.currentThread().getId(); + } + + public boolean isRequestThread() { + return Thread.currentThread().getId() == threadId; + } + // -------------------- Per-Request "notes" -------------------- @@ -828,6 +841,7 @@ allDataReadEventSent.set(false); startTimeNanos = -1; + threadId = 0; } // -------------------- Info -------------------- diff --git a/java/org/apache/coyote/Response.java b/java/org/apache/coyote/Response.java index 604415a..388ac64 100644 --- a/java/org/apache/coyote/Response.java +++ b/java/org/apache/coyote/Response.java @@ -737,7 +737,7 @@ fireListener = true; } action(ActionCode.DISPATCH_WRITE, null); - if (!ContainerThreadMarker.isContainerThread()) { + if (!req.isRequestThread()) { // Not on a container thread so need to execute the dispatch action(ActionCode.DISPATCH_EXECUTE, null); } diff --git a/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java b/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java index a9d631c..9c5f524 100644 --- a/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java +++ b/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java @@ -52,7 +52,6 @@ import jakarta.servlet.http.HttpServletResponse; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.apache.catalina.Context; @@ -929,7 +928,6 @@ } - @Ignore @Test public void testDelayedNBWrite() throws Exception { Tomcat tomcat = getTomcatInstance(); @@ -979,7 +977,7 @@ try { ByteChunk result = new ByteChunk(); int rc = getUrl(url, result, null); - Assert.assertTrue(rc == HttpServletResponse.SC_OK); + Assert.assertEquals(HttpServletResponse.SC_OK, rc); Assert.assertTrue(result.toString().contains("OK")); } catch (Throwable e) { e.printStackTrace();