You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2021/07/21 17:34:16 UTC
[tomcat] 05/05: Fix BZ 65454. Correct a timing issue that could
delay a request
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 0f2e084d1583cfa4c00cec1958ec30113fb4f41e
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Jul 21 17:45:01 2021 +0100
Fix BZ 65454. Correct a timing issue that could delay a request
https://bz.apache.org/bugzilla/show_bug.cgi?id=65454
If the work queue is not empty, it is likely that a task was added to
the work queue between this thread timing out and the worker count being
decremented a few lines above this comment. In this case, create a
replacement worker so that the task isn't held in the queue waiting for
one of the other workers to finish.
---
java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java | 10 ++++++++--
webapps/docs/changelog.xml | 6 ++++++
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
index 7b1ec55..8771c22 100644
--- a/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
+++ b/java/org/apache/tomcat/util/threads/ThreadPoolExecutor.java
@@ -1050,8 +1050,14 @@ public class ThreadPoolExecutor extends AbstractExecutorService {
if (min == 0 && ! workQueue.isEmpty()) {
min = 1;
}
- if (workerCountOf(c) >= min)
- {
+ // https://bz.apache.org/bugzilla/show_bug.cgi?id=65454
+ // If the work queue is not empty, it is likely that a task was
+ // added to the work queue between this thread timing out and
+ // the worker count being decremented a few lines above this
+ // comment. In this case, create a replacement worker so that
+ // the task isn't held in the queue waiting for one of the other
+ // workers to finish.
+ if (workerCountOf(c) >= min && workQueue.isEmpty()) {
return; // replacement not needed
}
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 3838cf3..cafd371 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -146,6 +146,12 @@
associated with the response until the connection timed out at which
point the final packet would be sent and the connection closed. (markt)
</fix>
+ <fix>
+ <bug>65454</bug>: Fix a race condition that could result in a delay to
+ a new request. The new request could be queued to wait for an existing
+ request to finish processing rather than the thread pool creating a new
+ thread to process the new request. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org