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
> <[email protected]> wrote:
>>
>>> -----Original Message-----
>>> From: Yann Ylavic [mailto:[email protected]]
>>> 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
>>> <[email protected]> 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