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

Reply via email to