> Am 14.10.2021 um 11:07 schrieb Ruediger Pluem <rpl...@apache.org>:
>
>
>
> On 10/12/21 3:34 PM, ic...@apache.org wrote:
>> Author: icing
>> Date: Tue Oct 12 13:34:01 2021
>> New Revision: 1894163
>>
>> URL: http://svn.apache.org/viewvc?rev=1894163&view=rev
>> Log:
>> *) mod_http2:
>> - Fixed an issue since 1.15.24 that "Server" headers in proxied requests
>> were overwritten instead of preserved. [PR by @daum3ns]
>> - Added directove 'H2StreamTimeout' to configure a separate value for
>> HTTP/2
>> streams, overriding server's 'Timeout' configuration. [rpluem]
>> - HTTP/2 connections now use pollsets to monitor the status of the
>> ongoing streams and their main connection when host OS allows this.
>> - Removed work-arounds for older versions of libnghttp2 and checking
>> during configure that at least version 1.15.0 is present.
>> - The HTTP/2 connection state handler, based on an experiment and draft
>> at the IETF http working group (abandoned for some time), has been
>> removed.
>> - H2SerializeHeaders no longer has an effect. A warning is logged when
>> it is
>> set to "on". The switch enabled the internal writing of requests to be
>> parsed
>> by the internal HTTP/1.1 protocol handler and was introduced to avoid
>> potential incompatibilities during the introduction of HTTP/2.
>> - Removed the abort/redo of tasks when mood swings lower the active
>> limit.
>>
>>
>> Added:
>> httpd/httpd/trunk/changes-entries/http2_additions.txt
>> httpd/httpd/trunk/modules/http2/h2_c1.c
>> httpd/httpd/trunk/modules/http2/h2_c1.h
>> httpd/httpd/trunk/modules/http2/h2_c1_io.c
>> httpd/httpd/trunk/modules/http2/h2_c1_io.h
>> httpd/httpd/trunk/modules/http2/h2_c2.c
>> httpd/httpd/trunk/modules/http2/h2_c2.h
>> httpd/httpd/trunk/modules/http2/h2_c2_filter.c
>> httpd/httpd/trunk/modules/http2/h2_c2_filter.h
>> httpd/httpd/trunk/modules/http2/h2_conn_ctx.c
>> httpd/httpd/trunk/modules/http2/h2_conn_ctx.h
>> httpd/httpd/trunk/modules/http2/h2_protocol.c
>> httpd/httpd/trunk/modules/http2/h2_protocol.h
>> Removed:
>> httpd/httpd/trunk/modules/http2/h2_alt_svc.c
>> httpd/httpd/trunk/modules/http2/h2_alt_svc.h
>> httpd/httpd/trunk/modules/http2/h2_conn.c
>> httpd/httpd/trunk/modules/http2/h2_conn.h
>> httpd/httpd/trunk/modules/http2/h2_conn_io.c
>> httpd/httpd/trunk/modules/http2/h2_conn_io.h
>> httpd/httpd/trunk/modules/http2/h2_ctx.c
>> httpd/httpd/trunk/modules/http2/h2_ctx.h
>> httpd/httpd/trunk/modules/http2/h2_filter.c
>> httpd/httpd/trunk/modules/http2/h2_filter.h
>> httpd/httpd/trunk/modules/http2/h2_from_h1.c
>> httpd/httpd/trunk/modules/http2/h2_from_h1.h
>> httpd/httpd/trunk/modules/http2/h2_h2.c
>> httpd/httpd/trunk/modules/http2/h2_h2.h
>> httpd/httpd/trunk/modules/http2/h2_task.c
>> httpd/httpd/trunk/modules/http2/h2_task.h
>> Modified:
>> httpd/httpd/trunk/CMakeLists.txt
>> httpd/httpd/trunk/modules/http2/NWGNUmod_http2
>> httpd/httpd/trunk/modules/http2/config2.m4
>> httpd/httpd/trunk/modules/http2/h2.h
>> httpd/httpd/trunk/modules/http2/h2_bucket_beam.c
>> httpd/httpd/trunk/modules/http2/h2_bucket_beam.h
>> httpd/httpd/trunk/modules/http2/h2_config.c
>> httpd/httpd/trunk/modules/http2/h2_config.h
>> httpd/httpd/trunk/modules/http2/h2_headers.c
>> httpd/httpd/trunk/modules/http2/h2_mplx.c
>> httpd/httpd/trunk/modules/http2/h2_mplx.h
>> httpd/httpd/trunk/modules/http2/h2_proxy_session.c
>> httpd/httpd/trunk/modules/http2/h2_proxy_util.c
>> httpd/httpd/trunk/modules/http2/h2_proxy_util.h
>> httpd/httpd/trunk/modules/http2/h2_push.c
>> httpd/httpd/trunk/modules/http2/h2_request.c
>> httpd/httpd/trunk/modules/http2/h2_request.h
>> httpd/httpd/trunk/modules/http2/h2_session.c
>> httpd/httpd/trunk/modules/http2/h2_session.h
>> httpd/httpd/trunk/modules/http2/h2_stream.c
>> httpd/httpd/trunk/modules/http2/h2_stream.h
>> httpd/httpd/trunk/modules/http2/h2_switch.c
>> httpd/httpd/trunk/modules/http2/h2_util.c
>> httpd/httpd/trunk/modules/http2/h2_util.h
>> httpd/httpd/trunk/modules/http2/h2_version.h
>> httpd/httpd/trunk/modules/http2/h2_workers.c
>> httpd/httpd/trunk/modules/http2/h2_workers.h
>> httpd/httpd/trunk/modules/http2/mod_http2.c
>> httpd/httpd/trunk/modules/http2/mod_http2.dsp
>> httpd/httpd/trunk/modules/http2/mod_proxy_http2.c
>> httpd/httpd/trunk/test/modules/http2/test_105_timeout.py
>> httpd/httpd/trunk/test/modules/http2/test_712_buffering.py
>>
>> Modified: httpd/httpd/trunk/CMakeLists.txt
>> URL:
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/CMakeLists.txt?rev=1894163&r1=1894162&r2=1894163&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/CMakeLists.txt (original)
>> +++ httpd/httpd/trunk/CMakeLists.txt Tue Oct 12 13:34:01 2021
>> @@ -469,18 +469,15 @@ SET(mod_http2_extra_defines ssi
>> SET(mod_http2_extra_includes ${NGHTTP2_INCLUDE_DIR})
>> SET(mod_http2_extra_libs ${NGHTTP2_LIBRARIES})
>> SET(mod_http2_extra_sources
>> - modules/http2/h2_alt_svc.c
>> - modules/http2/h2_bucket_eos.c modules/http2/h2_config.c
>> - modules/http2/h2_conn.c modules/http2/h2_conn_io.c
>> - modules/http2/h2_ctx.c modules/http2/h2_filter.c
>> - modules/http2/h2_from_h1.c modules/http2/h2_h2.c
>> - modules/http2/h2_bucket_beam.c
>> - modules/http2/h2_mplx.c modules/http2/h2_push.c
>> - modules/http2/h2_request.c modules/http2/h2_headers.c
>> - modules/http2/h2_session.c modules/http2/h2_stream.c
>> - modules/http2/h2_switch.c
>> - modules/http2/h2_task.c modules/http2/h2_util.c
>> - modules/http2/h2_workers.c
>> + modules/http2/h2_bucket_beam.c modules/http2/h2_bucket_eos.c
>> + modules/http2/h2_c1.c modules/http2/h2_c1_io.c
>> + modules/http2/h2_c2.c modules/http2/h2_c2_filter.c
>> + modules/http2/h2_config.c modules/http2/h2_conn_ctx.c
>> + modules/http2/h2_headers.c modules/http2/h2_mplx.c
>> + modules/http2/h2_protocol.c modules/http2/h2_push.c
>> + modules/http2/h2_request.c modules/http2/h2_session.c
>> + modules/http2/h2_stream.c modules/http2/h2_switch.c
>> + modules/http2/h2_util.c modules/http2/h2_workers.c
>> )
>> SET(mod_ldap_extra_defines LDAP_DECLARE_EXPORT)
>> SET(mod_ldap_extra_libs wldap32)
>>
>> Added: httpd/httpd/trunk/changes-entries/http2_additions.txt
>> URL:
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/changes-entries/http2_additions.txt?rev=1894163&view=auto
>> ==============================================================================
>> --- httpd/httpd/trunk/changes-entries/http2_additions.txt (added)
>> +++ httpd/httpd/trunk/changes-entries/http2_additions.txt Tue Oct 12
>> 13:34:01 2021
>> @@ -0,0 +1,17 @@
>> + *) mod_http2:
>> + - Fixed an issue since 1.15.24 that "Server" headers in proxied
>> requests
>> + were overwritten instead of preserved. [PR by @daum3ns]
>> + - Added directove 'H2StreamTimeout' to configure a separate value for
>> HTTP/2
>> + streams, overriding server's 'Timeout' configuration. [rpluem]
>> + - HTTP/2 connections now use pollsets to monitor the status of the
>> + ongoing streams and their main connection when host OS allows this.
>> + - Removed work-arounds for older versions of libnghttp2 and checking
>> + during configure that at least version 1.15.0 is present.
>> + - The HTTP/2 connection state handler, based on an experiment and draft
>> + at the IETF http working group (abandoned for some time), has been
>> removed.
>> + - H2SerializeHeaders no longer has an effect. A warning is logged when
>> it is
>> + set to "on". The switch enabled the internal writing of requests to
>> be parsed
>> + by the internal HTTP/1.1 protocol handler and was introduced to avoid
>> + potential incompatibilities during the introduction of HTTP/2.
>> + - Removed the abort/redo of tasks when mood swings lower the active
>> limit.
>> + [Ruediger Pluem, daum3ns, Stefan Eissing]
>> \ No newline at end of file
>>
>> Modified: httpd/httpd/trunk/modules/http2/NWGNUmod_http2
>> URL:
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/NWGNUmod_http2?rev=1894163&r1=1894162&r2=1894163&view=diff
>> ==============================================================================
>
>>
>> Modified: httpd/httpd/trunk/modules/http2/h2.h
>> URL:
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2.h?rev=1894163&r1=1894162&r2=1894163&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/modules/http2/h2.h (original)
>> +++ httpd/httpd/trunk/modules/http2/h2.h Tue Oct 12 13:34:01 2021
>
>> @@ -138,8 +152,7 @@ struct h2_request {
>> apr_table_t *headers;
>>
>> apr_time_t request_time;
>> - unsigned int chunked : 1; /* iff request body needs to be forwarded
>> as chunked */
>> - unsigned int serialize : 1; /* iff this request is written in HTTP/1.1
>> serialization */
>> + int chunked; /* iff request body needs to be forwarded
>> as chunked */
>
> Why not leaving it a bitfield although currently only one bit used? Probably
> we have further flags in the future.
I change that.
>> apr_off_t raw_bytes; /* RAW network bytes that generated this
>> request - if known. */
>> int http_status; /* Store a possible HTTP status code that
>> gets
>> * defined before creating the dummy HTTP/1.1
>
>> Modified: httpd/httpd/trunk/modules/http2/h2_bucket_beam.c
>> URL:
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_bucket_beam.c?rev=1894163&r1=1894162&r2=1894163&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/modules/http2/h2_bucket_beam.c (original)
>> +++ httpd/httpd/trunk/modules/http2/h2_bucket_beam.c Tue Oct 12 13:34:01 2021
>
>> @@ -191,40 +91,53 @@ static apr_bucket *h2_beam_bucket(h2_buc
>> return b;
>> }
>>
>> +static int is_empty(h2_bucket_beam *beam);
>> +static apr_off_t get_buffered_data_len(h2_bucket_beam *beam);
>>
>> -/*******************************************************************************
>> - * bucket beam that can transport buckets across threads
>> -
>> ******************************************************************************/
>> -
>> -static void mutex_leave(apr_thread_mutex_t *lock)
>> +static int h2_blist_count(h2_blist *blist)
>> {
>> - apr_thread_mutex_unlock(lock);
>> -}
>> + apr_bucket *b;
>> + int count = 0;
>>
>> -static apr_status_t mutex_enter(void *ctx, h2_beam_lock *pbl)
>> -{
>> - h2_bucket_beam *beam = ctx;
>> - pbl->mutex = beam->lock;
>> - pbl->leave = mutex_leave;
>> - return apr_thread_mutex_lock(pbl->mutex);
>> + for (b = H2_BLIST_FIRST(blist); b != H2_BLIST_SENTINEL(blist);
>> + b = APR_BUCKET_NEXT(b)) {
>> + ++count;
>> + }
>> + return count;
>> }
>>
>> -static apr_status_t enter_yellow(h2_bucket_beam *beam, h2_beam_lock *pbl)
>> -{
>> - return mutex_enter(beam, pbl);
>> -}
>> +#define H2_BEAM_LOG(beam, c, level, rv, msg, bb) \
>> + do { \
>> + if (APLOG_C_IS_LEVEL((c),(level))) { \
>> + char buffer[4 * 1024]; \
>> + apr_size_t len, bmax = sizeof(buffer)/sizeof(buffer[0]); \
>> + len = bb? h2_util_bb_print(buffer, bmax, "", "", bb) : 0; \
>> + ap_log_cerror(APLOG_MARK, (level), rv, (c), \
>> +
>> "BEAM[%s,%s%sdata=%ld,buckets(send/consumed)=%d/%d]: %s %s", \
>> + (beam)->name, \
>> + (beam)->aborted? "aborted," : "", \
>> + is_empty(beam)? "empty," : "", \
>> + (long)get_buffered_data_len(beam), \
>> + h2_blist_count(&(beam)->buckets_to_send), \
>> + h2_blist_count(&(beam)->buckets_consumed), \
>> + (msg), len? buffer : ""); \
>> + } \
>> + } while (0)
>> +
>>
>> -static void leave_yellow(h2_bucket_beam *beam, h2_beam_lock *pbl)
>> +static int bucket_is_mmap(apr_bucket *b)
>> {
>> - (void)beam;
>> - if (pbl->leave) {
>> - pbl->leave(pbl->mutex);
>> - }
>> +#if APR_HAS_MMAP
>> + return APR_BUCKET_IS_MMAP(b);
>> +#else
>> + /* if it is not defined as enabled, it should always be no */
>> + return 0;
>> +#endif
>> }
>>
>> static apr_off_t bucket_mem_used(apr_bucket *b)
>> {
>> - if (APR_BUCKET_IS_FILE(b)) {
>> + if (APR_BUCKET_IS_FILE(b) || bucket_is_mmap(b)) {
>
> MMaped buckets also consume physical memory once the content was read. Of
> course the pages can be dropped from physical memory
> again if space is needed. Furthermore they consume address space in the
> process, but I admit that this will unlikely cause
> any issues on 64 bit architectures. The only thing that can happen here is
> that people complain about large virtual memory sizes
> of processes which has no real impact in this case.
My (maybe faulty) reasoning here is:
HTTP/2 does not create any FILE or MMAP buckets. It just wants to transfer them
efficiently from c2 to c1. Instead of reading them and copying the chunks, it
apr_mmap_dup() or apr_file_setaside() their content for the receiving bucket
brigade.
This should (as I understand it) not duplicate any memory or use more memory
than in a HTTP/1.1 response (plus the usual h2 overhead).
>
>> return 0;
>> }
>> else {
>> @@ -233,53 +146,37 @@ static apr_off_t bucket_mem_used(apr_buc
>> }
>> }
>>
>> -static int report_consumption(h2_bucket_beam *beam, h2_beam_lock *pbl)
>> +static int report_consumption(h2_bucket_beam *beam, int locked)
>> {
>> int rv = 0;
>> - apr_off_t len = beam->received_bytes - beam->cons_bytes_reported;
>> + apr_off_t len = beam->recv_bytes - beam->recv_bytes_reported;
>> h2_beam_io_callback *cb = beam->cons_io_cb;
>>
>> if (len > 0) {
>> if (cb) {
>> void *ctx = beam->cons_ctx;
>>
>> - if (pbl) leave_yellow(beam, pbl);
>> + if (locked) apr_thread_mutex_unlock(beam->lock);
>> cb(ctx, beam, len);
>> - if (pbl) enter_yellow(beam, pbl);
>> + if (locked) apr_thread_mutex_lock(beam->lock);
>> rv = 1;
>> }
>> - beam->cons_bytes_reported += len;
>> + beam->recv_bytes_reported += len;
>> }
>> return rv;
>> }
>>
>> -static void report_prod_io(h2_bucket_beam *beam, int force, h2_beam_lock
>> *pbl)
>> -{
>> - apr_off_t len = beam->sent_bytes - beam->prod_bytes_reported;
>> - if (force || len > 0) {
>> - h2_beam_io_callback *cb = beam->prod_io_cb;
>> - if (cb) {
>> - void *ctx = beam->prod_ctx;
>> -
>> - leave_yellow(beam, pbl);
>> - cb(ctx, beam, len);
>> - enter_yellow(beam, pbl);
>> - }
>> - beam->prod_bytes_reported += len;
>> - }
>> -}
>> -
>> static apr_size_t calc_buffered(h2_bucket_beam *beam)
>> {
>> apr_size_t len = 0;
>> apr_bucket *b;
>> - for (b = H2_BLIST_FIRST(&beam->send_list);
>> - b != H2_BLIST_SENTINEL(&beam->send_list);
>> + for (b = H2_BLIST_FIRST(&beam->buckets_to_send);
>> + b != H2_BLIST_SENTINEL(&beam->buckets_to_send);
>> b = APR_BUCKET_NEXT(b)) {
>> if (b->length == ((apr_size_t)-1)) {
>> /* do not count */
>> }
>> - else if (APR_BUCKET_IS_FILE(b)) {
>> + else if (APR_BUCKET_IS_FILE(b) || bucket_is_mmap(b)) {
>> /* if unread, has no real mem footprint. */
>
> Same comment as above. No real mem footprint until read, but address space is
> consumed.
>
>> }
>> else {
>
> Regards
>
> RĂ¼diger
>