From 170e0f792bd18ff031677890ba2fe50eb7a376c1 Mon Sep 17 00:00:00 2001 From: Mark Thomas Date: Tue, 29 Mar 2022 19:15:37 +0100 Subject: [PATCH] Improve the recycling of Processor objects to make it more robust. --- java/org/apache/coyote/AbstractProtocol.java | 32 ++++++++++--------- .../tomcat/util/net/SocketWrapperBase.java | 17 +++++++--- webapps/docs/changelog.xml | 4 +++ 3 files changed, 33 insertions(+), 20 deletions(-) Index: apache-tomcat-9.0.43-src/java/org/apache/coyote/AbstractProtocol.java =================================================================== --- apache-tomcat-9.0.43-src.orig/java/org/apache/coyote/AbstractProtocol.java +++ apache-tomcat-9.0.43-src/java/org/apache/coyote/AbstractProtocol.java @@ -794,7 +794,11 @@ public abstract class AbstractProtocol socketWrapper) { - Processor processor = (Processor) socketWrapper.getCurrentProcessor(); - socketWrapper.setCurrentProcessor(null); + Processor processor = (Processor) socketWrapper.takeCurrentProcessor(); release(processor); } Index: apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SocketWrapperBase.java =================================================================== --- apache-tomcat-9.0.43-src.orig/java/org/apache/tomcat/util/net/SocketWrapperBase.java +++ apache-tomcat-9.0.43-src/java/org/apache/tomcat/util/net/SocketWrapperBase.java @@ -29,6 +29,7 @@ import java.util.concurrent.RejectedExec import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -104,10 +105,12 @@ public abstract class SocketWrapperBase< protected volatile OperationState writeOperation = null; /** - * The org.apache.coyote.Processor instance currently associated - * with the wrapper. + * The org.apache.coyote.Processor instance currently associated with the + * wrapper. Only populated when required to maintain wrapper<->Processor + * mapping between calls to + * {@link AbstractEndpoint.Handler#process(SocketWrapperBase, SocketEvent)}. */ - protected Object currentProcessor = null; + private final AtomicReference currentProcessor = new AtomicReference<>(); public SocketWrapperBase(E socket, AbstractEndpoint endpoint) { this.socket = socket; @@ -134,11 +137,15 @@ public abstract class SocketWrapperBase< } public Object getCurrentProcessor() { - return currentProcessor; + return currentProcessor.get(); } public void setCurrentProcessor(Object currentProcessor) { - this.currentProcessor = currentProcessor; + this.currentProcessor.set(currentProcessor); + } + + public Object takeCurrentProcessor() { + return currentProcessor.getAndSet(null); } /** Index: apache-tomcat-9.0.43-src/webapps/docs/changelog.xml =================================================================== --- apache-tomcat-9.0.43-src.orig/webapps/docs/changelog.xml +++ apache-tomcat-9.0.43-src/webapps/docs/changelog.xml @@ -485,6 +485,10 @@ Fix a concurrency issue in the NIO connector that could cause newly created connections to be removed from the poller. (markt) + + Improve the recycling of Processor objects to make it more robust. + (markt) +