This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/master by this push:
     new 2236835  Fix one potential cause of multiple threads processing a 
connection.
2236835 is described below

commit 223683574d33d980edf0ff0431cf55eba2ab7d53
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jun 4 12:30:33 2019 +0100

    Fix one potential cause of multiple threads processing a connection.
    
    If an InternalUpgradeHandler supports async I/O it will initiate further
    I/O so ensure the Protocol loop exists and the socket is put into the
    long poll state.
---
 java/org/apache/coyote/AbstractProtocol.java                       | 7 +++++++
 .../apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java   | 4 ++++
 java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java         | 4 +++-
 java/org/apache/coyote/http2/Http2UpgradeHandler.java              | 7 +------
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/java/org/apache/coyote/AbstractProtocol.java 
b/java/org/apache/coyote/AbstractProtocol.java
index c6df8d6..174c899 100644
--- a/java/org/apache/coyote/AbstractProtocol.java
+++ b/java/org/apache/coyote/AbstractProtocol.java
@@ -39,6 +39,7 @@ import javax.management.ObjectName;
 import javax.servlet.http.HttpUpgradeHandler;
 import javax.servlet.http.WebConnection;
 
+import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler;
 import org.apache.juli.logging.Log;
 import org.apache.tomcat.InstanceManager;
 import org.apache.tomcat.util.ExceptionUtils;
@@ -904,6 +905,12 @@ public abstract class AbstractProtocol<S> implements 
ProtocolHandler,
                                     
upgradeToken.getContextBind().unbind(false, oldCL);
                                 }
                             }
+                            if (httpUpgradeHandler instanceof 
InternalHttpUpgradeHandler) {
+                                if (((InternalHttpUpgradeHandler) 
httpUpgradeHandler).hasAsyncIO()) {
+                                    // The handler will initiate all further 
I/O
+                                    state = SocketState.LONG;
+                                }
+                            }
                         }
                     }
                 } while ( state == SocketState.UPGRADING);
diff --git 
a/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java 
b/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java
index 936784e..8c5ce39 100644
--- a/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java
+++ b/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java
@@ -37,4 +37,8 @@ public interface InternalHttpUpgradeHandler extends 
HttpUpgradeHandler {
     void setSslSupport(SSLSupport sslSupport);
 
     void pause();
+
+    default boolean hasAsyncIO() {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java 
b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
index fde2bb6..969bfda 100644
--- a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
@@ -80,11 +80,13 @@ public class Http2AsyncUpgradeHandler extends 
Http2UpgradeHandler {
         return new AsyncPingManager();
     }
 
+
     @Override
-    boolean hasAsyncIO() {
+    public boolean hasAsyncIO() {
         return true;
     }
 
+
     @Override
     protected void processConnection(WebConnection webConnection,
             Stream stream) {
diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java 
b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
index 665b1a0..71a5c1b 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -730,11 +730,6 @@ class Http2UpgradeHandler extends AbstractStream 
implements InternalHttpUpgradeH
     }
 
 
-    boolean hasAsyncIO() {
-        return false;
-    }
-
-
     protected void processWrites() throws IOException {
         synchronized (socketWrapper) {
             if (socketWrapper.flush(false)) {
@@ -822,7 +817,7 @@ class Http2UpgradeHandler extends AbstractStream implements 
InternalHttpUpgradeH
                                 // Close the stream (in app code so need to
                                 // signal to app stream is closing)
                                 stream.doWriteTimeout();
-                                }
+                            }
                         } catch (InterruptedException e) {
                             throw new IOException(sm.getString(
                                     
"upgradeHandler.windowSizeReservationInterrupted", connectionId,


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to