Author: remm Date: Thu Nov 16 14:11:53 2017 New Revision: 1815456 URL: http://svn.apache.org/viewvc?rev=1815456&view=rev Log: Improvement on header write sync.
Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java?rev=1815456&r1=1815455&r2=1815456&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java Thu Nov 16 14:11:53 2017 @@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit; import org.apache.coyote.Adapter; import org.apache.coyote.ProtocolException; import org.apache.coyote.Request; +import org.apache.tomcat.util.http.MimeHeaders; import org.apache.tomcat.util.net.SendfileState; import org.apache.tomcat.util.net.SocketWrapperBase; import org.apache.tomcat.util.net.SocketWrapperBase.BlockingMode; @@ -149,6 +150,28 @@ public class Http2AsyncUpgradeHandler ex @Override + void writeHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, + boolean endOfStream, int payloadSize) throws IOException { + // This ensures the Stream processing thread has control of the socket. + ByteBuffer[] bufs = null; + synchronized (socketWrapper) { + AsyncHeaderFrameBuffers headerFrameBuffers = (AsyncHeaderFrameBuffers) + doWriteHeaders(stream, pushedStreamId, mimeHeaders, endOfStream, payloadSize); + bufs = headerFrameBuffers.bufs.toArray(BYTEBUFFER_ARRAY); + } + if (bufs != null) { + socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), + TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, + applicationErrorCompletion, bufs); + handleAsyncException(); + } + if (endOfStream) { + stream.sentEndOfStream(); + } + } + + + @Override protected HeaderFrameBuffers getHeaderFrameBuffers(int initialPayloadSize) { return new AsyncHeaderFrameBuffers(initialPayloadSize); } @@ -451,10 +474,6 @@ public class Http2AsyncUpgradeHandler ex @Override public void endHeaders() throws IOException { - socketWrapper.write(BlockingMode.SEMI_BLOCK, protocol.getWriteTimeout(), - TimeUnit.MILLISECONDS, null, SocketWrapperBase.COMPLETE_WRITE, - applicationErrorCompletion, bufs.toArray(BYTEBUFFER_ARRAY)); - handleAsyncException(); } @Override @@ -470,6 +489,7 @@ public class Http2AsyncUpgradeHandler ex @Override public void expandPayload() { payloadSize = payloadSize * 2; + payload = ByteBuffer.allocate(payloadSize); } } } 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=1815456&r1=1815455&r2=1815456&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Thu Nov 16 14:11:53 2017 @@ -539,7 +539,7 @@ class Http2UpgradeHandler extends Abstra * Separate method to allow Http2AsyncUpgradeHandler to call this code * without synchronizing on socketWrapper since it doesn't need to. */ - void doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, + protected HeaderFrameBuffers doWriteHeaders(Stream stream, int pushedStreamId, MimeHeaders mimeHeaders, boolean endOfStream, int payloadSize) throws IOException { if (log.isDebugEnabled()) { @@ -549,7 +549,7 @@ class Http2UpgradeHandler extends Abstra } if (!stream.canWrite()) { - return; + return null; } HeaderFrameBuffers headerFrameBuffers = getHeaderFrameBuffers(payloadSize); @@ -598,9 +598,9 @@ class Http2UpgradeHandler extends Abstra } } headerFrameBuffers.endHeaders(); + return headerFrameBuffers; } - protected HeaderFrameBuffers getHeaderFrameBuffers(int initialPayloadSize) { return new DefaultHeaderFrameBuffers(initialPayloadSize); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org