You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2019/04/29 15:15:08 UTC

[tomcat] branch master updated: Tolerate concurrency

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

remm 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 a19e8fe  Tolerate concurrency
a19e8fe is described below

commit a19e8fed4ab2935a0b3d7c37cc9330da8f9fa759
Author: remm <re...@apache.org>
AuthorDate: Mon Apr 29 17:14:54 2019 +0200

    Tolerate concurrency
    
    The read call may return not_done by checking a semaphore, which allows
    safe concurrent use of the API. However, if the buffers of a pending
    read are concurrently cleared, then this may cause an underflow error
    and this is discarding one of the API benefits. This seems to be a very
    rare scenario. Adding some checks and sync would be expensive so this
    might not be a win. Will have to verify performance however ...
---
 java/org/apache/coyote/http2/Http2AsyncParser.java | 8 ++------
 webapps/docs/changelog.xml                         | 4 ++++
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/java/org/apache/coyote/http2/Http2AsyncParser.java b/java/org/apache/coyote/http2/Http2AsyncParser.java
index 2c764f8..5438b40 100644
--- a/java/org/apache/coyote/http2/Http2AsyncParser.java
+++ b/java/org/apache/coyote/http2/Http2AsyncParser.java
@@ -33,16 +33,12 @@ class Http2AsyncParser extends Http2Parser {
     private final SocketWrapperBase<?> socketWrapper;
     private final Http2AsyncUpgradeHandler upgradeHandler;
     private Throwable error = null;
-    private final ByteBuffer header;
-    private final ByteBuffer framePaylod;
 
     Http2AsyncParser(String connectionId, Input input, Output output, SocketWrapperBase<?> socketWrapper, Http2AsyncUpgradeHandler upgradeHandler) {
         super(connectionId, input, output);
         this.socketWrapper = socketWrapper;
         socketWrapper.getSocketBufferHandler().expand(input.getMaxFrameSize());
         this.upgradeHandler = upgradeHandler;
-        header = ByteBuffer.allocate(9);
-        framePaylod = ByteBuffer.allocate(input.getMaxFrameSize());
     }
 
 
@@ -54,8 +50,8 @@ class Http2AsyncParser extends Http2Parser {
             return super.readFrame(block, expected);
         }
         handleAsyncException();
-        header.clear();
-        framePaylod.clear();
+        ByteBuffer header = ByteBuffer.allocate(9);
+        ByteBuffer framePaylod = ByteBuffer.allocate(input.getMaxFrameSize());
         FrameCompletionHandler handler = new FrameCompletionHandler(expected, header, framePaylod);
         CompletionState state =
                 socketWrapper.read(BlockingMode.NON_BLOCK, socketWrapper.getReadTimeout(), TimeUnit.MILLISECONDS, null, handler, handler, header, framePaylod);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 0ddcac8..9522873 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -138,6 +138,10 @@
         Associate BlockPoller thread name with its NIO connector for better
         readability. (remm)
       </fix>
+      <fix>
+        The async HTTP/2 frame parser should tolerate concurrency so clearing
+        shared buffers before attempting a read is not possible. (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Other">


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