Author: markt
Date: Sat Aug 11 15:55:17 2018
New Revision: 1837871
URL: http://svn.apache.org/viewvc?rev=1837871&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62614
HTTP/2 was not triggering calls to onWritePossible() after isReady() returned
false and the window size was subsequently increased
Modified:
tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
tomcat/trunk/java/org/apache/coyote/http2/Stream.java
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1837871&r1=1837870&r2=1837871&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Sat Aug
11 15:55:17 2018
@@ -34,10 +34,12 @@ import java.util.concurrent.atomic.Atomi
import javax.servlet.http.WebConnection;
+import org.apache.coyote.ActionCode;
import org.apache.coyote.Adapter;
import org.apache.coyote.CloseNowException;
import org.apache.coyote.ProtocolException;
import org.apache.coyote.Request;
+import org.apache.coyote.Response;
import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler;
import org.apache.coyote.http2.HpackDecoder.HeaderEmitter;
import org.apache.coyote.http2.HpackEncoder.State;
@@ -804,8 +806,23 @@ class Http2UpgradeHandler extends Abstra
if (streamsToNotify != null) {
for (AbstractStream stream : streamsToNotify) {
- synchronized (stream) {
- stream.notifyAll();
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("upgradeHandler.releaseBacklog",
+ connectionId, stream.getIdentifier()));
+ }
+ Response coyoteResponse = ((Stream)
stream).getCoyoteResponse();
+ if (coyoteResponse.getWriteListener() == null) {
+ // Blocking, so use notify to release StreamOutputBuffer
+ synchronized (stream) {
+ stream.notifyAll();
+ }
+ } else {
+ // Non-blocking so dispatch
+ coyoteResponse.action(ActionCode.DISPATCH_WRITE, null);
+ // Need to explicitly execute dispatches on the
+ // StreamProcessor as this thread is being processed by an
+ // UpgradeProcessor which won't see this dispatch
+ coyoteResponse.action(ActionCode.DISPATCH_EXECUTE, null);
}
}
}
Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1837871&r1=1837870&r2=1837871&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties [UTF-8]
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties [UTF-8]
Sat Aug 11 15:55:17 2018
@@ -128,6 +128,7 @@ upgradeHandler.pruneIncomplete=Connectio
upgradeHandler.pruneStart=Connection [{0}] Starting pruning of old streams.
Limit is [{1}] + 10% and there are currently [{2}] streams.
upgradeHandler.pruned=Connection [{0}] Pruned completed stream [{1}]
upgradeHandler.prunedPriority=Connection [{0}] Pruned unused stream [{1}] that
may have been part of the priority tree
+upgradeHandler.releaseBacklog=Connection [{0}], Stream [{1}] released from
backlog
upgradeHandler.rst.debug=Connection [{0}], Stream [{1}], Error [{2}], Message
[{3}], RST (closing stream)
upgradeHandler.sendPrefaceFail=Connection [{0}], Failed to send preface to
client
upgradeHandler.socketCloseFailed=Error closing socket
Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1837871&r1=1837870&r2=1837871&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Sat Aug 11 15:55:17
2018
@@ -196,7 +196,17 @@ class Stream extends AbstractStream impl
boolean notify = getWindowSize() < 1;
super.incrementWindowSize(windowSizeIncrement);
if (notify && getWindowSize() > 0) {
- notifyAll();
+ if (coyoteResponse.getWriteListener() == null) {
+ // Blocking, so use notify to release StreamOutputBuffer
+ notifyAll();
+ } else {
+ // Non-blocking so dispatch
+ coyoteResponse.action(ActionCode.DISPATCH_WRITE, null);
+ // Need to explicitly execute dispatches on the StreamProcessor
+ // as this thread is being processed by an UpgradeProcessor
+ // which won't see this dispatch
+ coyoteResponse.action(ActionCode.DISPATCH_EXECUTE, null);
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]