On Thu, Jun 6, 2019 at 10:46 PM <ma...@apache.org> wrote:

> 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
>
> commit e967bbc7f106f8ec5384a294d98d5cbc44b474f1
> Author: Mark Thomas <ma...@apache.org>
> AuthorDate: Thu Jun 6 21:45:30 2019 +0100
>
>     Remove a source of potential deadlocks
>
>     SocketWrapperBase.vectoredOperation acquires the (read|write) Semaphore
>     and then locks the SocketWrapper during completion before the Semaphore
>     is release. If the SocketWrapper is locked on some, but not all, paths
>     before acquiring the Semaphore, a deadlock becomes possible.
>
>     Fixed by removing the initial lock on SocketWrapper since the
> Semaphores
>     make it unnecessary.
>

I wished it worked, as this sync lowers performance a lot, but
unfortunately it doesn't. The lock ensures that HPACK behaves and that
everything gets written in order, more or less.
Details and test is in https://bz.apache.org/bugzilla/show_bug.cgi?id=61740
It fails again after removing the sync.

Rémy


> ---
>  .../apache/coyote/http2/Http2AsyncUpgradeHandler.java   | 17
> +++++++----------
>  webapps/docs/changelog.xml                              |  9 +++++++++
>  2 files changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
> b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
> index 969bfda..8a57c53 100644
> --- a/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
> +++ b/java/org/apache/coyote/http2/Http2AsyncUpgradeHandler.java
> @@ -169,16 +169,13 @@ public class Http2AsyncUpgradeHandler extends
> Http2UpgradeHandler {
>      @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.
> -        synchronized (socketWrapper) {
> -            AsyncHeaderFrameBuffers headerFrameBuffers =
> (AsyncHeaderFrameBuffers)
> -                    doWriteHeaders(stream, pushedStreamId, mimeHeaders,
> endOfStream, payloadSize);
> -            if (headerFrameBuffers != null) {
> -                socketWrapper.write(BlockingMode.SEMI_BLOCK,
> protocol.getWriteTimeout(),
> -                        TimeUnit.MILLISECONDS, null,
> SocketWrapperBase.COMPLETE_WRITE,
> -                        applicationErrorCompletion,
> headerFrameBuffers.bufs.toArray(BYTEBUFFER_ARRAY));
> -                handleAsyncException();
> -            }
> +        AsyncHeaderFrameBuffers headerFrameBuffers =
> (AsyncHeaderFrameBuffers)
> +                doWriteHeaders(stream, pushedStreamId, mimeHeaders,
> endOfStream, payloadSize);
> +        if (headerFrameBuffers != null) {
> +            socketWrapper.write(BlockingMode.SEMI_BLOCK,
> protocol.getWriteTimeout(),
> +                    TimeUnit.MILLISECONDS, null,
> SocketWrapperBase.COMPLETE_WRITE,
> +                    applicationErrorCompletion,
> headerFrameBuffers.bufs.toArray(BYTEBUFFER_ARRAY));
> +            handleAsyncException();
>          }
>          if (endOfStream) {
>              stream.sentEndOfStream();
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
> index 7f55e3d..d65a1f3 100644
> --- a/webapps/docs/changelog.xml
> +++ b/webapps/docs/changelog.xml
> @@ -45,6 +45,15 @@
>    issues do not "pop up" wrt. others).
>  -->
>  <section name="Tomcat 9.0.22 (markt)" rtext="in development">
> +  <subsection name="Coyote">
> +    <changelog>
> +      <fix>
> +        Remove a source of potential deadlocks when using HTTP/2 when the
> +        Connector is configured with <code>useAsyncIO</code> as
> +        <code>true</code>. (markt)
> +      </fix>
> +    </changelog>
> +  </subsection>
>  </section>
>  <section name="Tomcat 9.0.21 (markt)" rtext="release in progress">
>    <subsection name="Catalina">
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>
>

Reply via email to