On 02/03/2016 12:34 PM, Yann Ylavic wrote: > On Wed, Feb 3, 2016 at 11:53 AM, Plüm, Rüdiger, Vodafone Group > <ruediger.pl...@vodafone.com> wrote: >> >>> -----Original Message----- >>> From: Yann Ylavic [mailto:ylavic....@gmail.com] >>> Sent: Mittwoch, 3. Februar 2016 11:41 >>> To: httpd-dev >>> Subject: Re: HTTPS connections lock-up with 2.4.18 >>> >>> On Wed, Feb 3, 2016 at 11:29 AM, Plüm, Rüdiger, Vodafone Group >>> <ruediger.pl...@vodafone.com> wrote: >>>> Which MPM is used? Event or something different? >>>> There a differences on how c->data_in_input_filters is handled by >>> different MPM's. >>>> On sync MPM's like worker there is an explicit flush if c- >>>> data_in_input_filters is zero, >>>> the event MPM though only relies on WRITE_COMPLETION. >>> >>> Hmm, ap_process_request() really checks for c->data_in_input_filters >>> to determine whether it should flush or not. >>> So I don't see it depending on the MPM. >> >> It does, because ap_process_request is only called by sync MPMs. >> Event calls ap_process_async_request only. See ap_process_http_connection in >> http_core.c > > Oh right, sorry, I completely misread your message and thought you > were saying that sync MPMs do flush unconditionally :/ > > But still event should (try to) flush pending data when in > WRITE_COMPLETION while c->data_in_output_filters (calling the > core_output_filter() with NULL brigade). > So I don't see why the response is not flushed on the network before > entering READ_REQUEST_LINE or CHECK_REQUEST_LINE_READABLE states.
I do not get this either, but maybe some additional debug messages in ap_core_output_filter / send_brigade_nonblocking will help us understanding this. Something like this: Index: server/core_filters.c =================================================================== --- server/core_filters.c (revision 1728304) +++ server/core_filters.c (working copy) @@ -465,6 +465,12 @@ */ if (new_bb == NULL) { + apr_off_t blen; + + rv = apr_brigade_length(bb, 1, &blen); + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, rv, c, + "core_output_filter: writing data to the network: Brigade length: %" APR_OFF_T_FMT, + blen); rv = send_brigade_nonblocking(net->client_socket, bb, &(ctx->bytes_written), c); if (rv != APR_SUCCESS && !APR_STATUS_IS_EAGAIN(rv)) { @@ -702,6 +708,10 @@ } if (nvec > 0) { + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, + "send_brigade_nonblocking: calling writev_nonblocking, nvec: %" + APR_SIZE_T_FMT " , bytes_written: %" APR_SIZE_T_FMT, + nvec, *bytes_written); rv = writev_nonblocking(s, vec, nvec, bb, bytes_written, c); if (rv != APR_SUCCESS) { return rv; Regards Rüdiger