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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]