]> granicus.if.org Git - apache/commitdiff
Merge r1828879 from trunk:
authorYann Ylavic <ylavic@apache.org>
Tue, 29 May 2018 21:09:31 +0000 (21:09 +0000)
committerYann Ylavic <ylavic@apache.org>
Tue, 29 May 2018 21:09:31 +0000 (21:09 +0000)
On the trunk:

mod_http2: always wake up any conditional waits when streams are aborted. Fixes race conditions where timeouts would trigger instead.

Submitted by: icing
Reviewed by: icing, jim, ylavic

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1832487 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/http2/h2_bucket_beam.c

diff --git a/CHANGES b/CHANGES
index 9468c3ded7f280f7df4c8accc977172657236b43..e63f78f40fcecdb914b8fb5f69fa962abcf08f36 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.4.34
 
+  *) mod_http2: Fix unnecessary timeout waits in case streams are aborted.
+     [Stefan Eissing]
+
   *) mod_proxy: Do not restrict the maximum pool size for backend connections
      any longer by the maximum number of threads per process and use a better
      default if mod_http2 is loaded.
index 6b6750d1fa17eab440a58175b697f894b03d283b..7653ec1092e537ec3616333f79370e47e5000f19 100644 (file)
@@ -550,6 +550,7 @@ static void recv_buffer_cleanup(h2_bucket_beam *beam, h2_beam_lock *bl)
         apr_brigade_destroy(bb);
         if (bl) enter_yellow(beam, bl);
         
+        apr_thread_cond_broadcast(beam->change);
         if (beam->cons_ev_cb) { 
             beam->cons_ev_cb(beam->cons_ctx, beam);
         }
@@ -707,12 +708,10 @@ void h2_beam_abort(h2_bucket_beam *beam)
     h2_beam_lock bl;
     
     if (beam && enter_yellow(beam, &bl) == APR_SUCCESS) {
-        if (!beam->aborted) {
-            beam->aborted = 1;
-            r_purge_sent(beam);
-            h2_blist_cleanup(&beam->send_list);
-            report_consumption(beam, &bl);
-        }
+        beam->aborted = 1;
+        r_purge_sent(beam);
+        h2_blist_cleanup(&beam->send_list);
+        report_consumption(beam, &bl);
         apr_thread_cond_broadcast(beam->change);
         leave_yellow(beam, &bl);
     }