]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
*) mod_http2: removing bucket splitting into an extra recv brigade.
authorStefan Eissing <icing@apache.org>
Wed, 21 Sep 2022 11:23:24 +0000 (11:23 +0000)
committerStefan Eissing <icing@apache.org>
Wed, 21 Sep 2022 11:23:24 +0000 (11:23 +0000)
     buckets are always received as a whole now, even if the total size
     exceeds the receivers specified length. This simplifies the internal
     handling and, since these buckets already exist, lead to less memory
     consumption overall.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1904189 13f79535-47bb-0310-9956-ffa450edef68

modules/http2/h2_bucket_beam.c
modules/http2/h2_bucket_beam.h

index 05ca623c583f8c7cbaea92c26fe895828553176e..657d62f825a4daffa9aebb70224aabc8857093a7 100644 (file)
@@ -170,8 +170,7 @@ static apr_size_t calc_space_left(h2_bucket_beam *beam)
 
 static int buffer_is_empty(h2_bucket_beam *beam)
 {
-    return ((!beam->recv_buffer || APR_BRIGADE_EMPTY(beam->recv_buffer))
-            && H2_BLIST_EMPTY(&beam->buckets_to_send));
+    return H2_BLIST_EMPTY(&beam->buckets_to_send);
 }
 
 static apr_status_t wait_not_empty(h2_bucket_beam *beam, conn_rec *c, apr_read_type_e block)
@@ -236,31 +235,6 @@ static void h2_blist_cleanup(h2_blist *bl)
     }
 }
 
-static void recv_buffer_cleanup(h2_bucket_beam *beam)
-{
-    apr_bucket_brigade *bb = beam->recv_buffer;
-
-    beam->recv_buffer = NULL;
-
-    if (bb && !APR_BRIGADE_EMPTY(bb)) {
-        apr_off_t bblen = 0;
-        
-        apr_brigade_length(bb, 0, &bblen);
-        beam->recv_bytes += bblen;
-        
-        /* need to do this unlocked since bucket destroy might 
-         * call this beam again. */
-        apr_thread_mutex_unlock(beam->lock);
-        apr_brigade_destroy(bb);
-        apr_thread_mutex_lock(beam->lock);
-
-        apr_thread_cond_broadcast(beam->change);
-        if (beam->recv_cb) {
-            beam->recv_cb(beam->recv_ctx, beam);
-        }
-    }
-}
-
 static void beam_shutdown(h2_bucket_beam *beam, apr_shutdown_how_e how)
 {
     if (!beam->pool) {
@@ -274,12 +248,6 @@ static void beam_shutdown(h2_bucket_beam *beam, apr_shutdown_how_e how)
         beam->recv_cb = NULL;
     }
 
-    /* shutdown receiver (or both)? */
-    if (how != APR_SHUTDOWN_WRITE) {
-        recv_buffer_cleanup(beam);
-        beam->recv_cb = NULL;
-    }
-
     /* shutdown sender (or both)? */
     if (how != APR_SHUTDOWN_READ) {
         h2_blist_cleanup(&beam->buckets_to_send);
@@ -603,21 +571,6 @@ transfer:
 
     ap_assert(beam->pool);
 
-    /* transfer enough buckets from our receiver brigade, if we have one */
-    while (remain >= 0
-           && beam->recv_buffer
-           && !APR_BRIGADE_EMPTY(beam->recv_buffer)) {
-
-        brecv = APR_BRIGADE_FIRST(beam->recv_buffer);
-        if (brecv->length > 0 && remain <= 0) {
-            break;
-        }
-        APR_BUCKET_REMOVE(brecv);
-        APR_BRIGADE_INSERT_TAIL(bb, brecv);
-        remain -= brecv->length;
-        ++transferred;
-    }
-
     /* transfer from our sender brigade, transforming sender buckets to
      * receiver ones until we have enough */
     while (remain >= 0 && !H2_BLIST_EMPTY(&beam->buckets_to_send)) {
@@ -713,24 +666,6 @@ transfer:
         ++consumed_buckets;
     }
 
-    if (remain < 0) {
-        /* too much, put some back into out recv_buffer */
-        remain = readbytes;
-        for (brecv = APR_BRIGADE_FIRST(bb);
-             brecv != APR_BRIGADE_SENTINEL(bb);
-             brecv = APR_BUCKET_NEXT(brecv)) {
-            remain -= (beam->tx_mem_limits? bucket_mem_used(brecv)
-                       : (apr_off_t)brecv->length);
-            if (remain < 0) {
-                apr_bucket_split(brecv, (apr_size_t)((apr_off_t)brecv->length+remain));
-                beam->recv_buffer = apr_brigade_split_ex(bb,
-                                                         APR_BUCKET_NEXT(brecv),
-                                                         beam->recv_buffer);
-                break;
-            }
-        }
-    }
-
     if (beam->recv_cb && consumed_buckets > 0) {
         beam->recv_cb(beam->recv_ctx, beam);
     }
@@ -834,8 +769,7 @@ apr_off_t h2_beam_get_mem_used(h2_bucket_beam *beam)
 
 static int is_empty(h2_bucket_beam *beam)
 {
-    return (H2_BLIST_EMPTY(&beam->buckets_to_send)
-            && (!beam->recv_buffer || APR_BRIGADE_EMPTY(beam->recv_buffer)));
+    return H2_BLIST_EMPTY(&beam->buckets_to_send);
 }
 
 int h2_beam_empty(h2_bucket_beam *beam)
index dced250dba7891494c0a64f19149707411317ed3..934a893d9915f8e681f6b4626fc9f4d3eee9f0e7 100644 (file)
@@ -48,9 +48,7 @@ struct h2_bucket_beam {
     apr_pool_t *pool;
     h2_blist buckets_to_send;
     h2_blist buckets_consumed;
-    apr_bucket_brigade *recv_buffer;
-    apr_pool_t *recv_pool;
-    
+
     apr_size_t max_buf_size;
     apr_interval_time_t timeout;