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

Reply via email to