You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Yann Ylavic <yl...@gmail.com> on 2020/03/22 17:43:07 UTC

Re: worker MPM test failures (was Re: Still Failing: apache/httpd#190 (trunk - 894b6a1))

On Thu, Jan 23, 2020 at 8:23 AM Pluem, Ruediger, Vodafone Group
<ru...@vodafone.com> wrote:
> >
> > https://github.com/apache/httpd/pull/88
>
> Anyone had a look?

If I understand the patch correctly, ap_request_core_filter() would
let everything through on EOR, regardless of potential morphing
buckets set aside?
So if ap_request_core_filter() yields because of network contention,
setting aside all the remaining buckets (say including a morphing
one), and then ap_process_request_after_handler() sends the EOR (the
handler has finished sending everything on its side), it seems that
ap_request_core_filter() won't play its role anymore?
This plus the fact that ap_request_core_filter() filters "stack up"
for each request, so the oldest request's filter may setaside data for
newer ones, with its own (wrong) request pool.

How about we use a single ap_request_core_filter() for all the
requests, at AP_FTYPE_CONNECTION level, and have it "detect" requests
based on SOR/EOR ranges, where the SOR (Start Of Request) bucket is to
be inserted by the AP_FTYPE_PROTOCOL module (e.g.
ap_http_header_filter for http) before sending any data pertaining to
its request?

It tried that in the attached patch, it passes the test framework and
Joe's reproducer.
Thoughts?

Regards,
Yann.

Re: worker MPM test failures (was Re: Still Failing: apache/httpd#190 (trunk - 894b6a1))

Posted by Ruediger Pluem <rp...@apache.org>.

On 3/22/20 6:43 PM, Yann Ylavic wrote:
> +        APR_BRIGADE_INSERT_TAIL(ctx->tmp_bb, bucket);
> +        if (do_pass
> +                || APR_BRIGADE_EMPTY(ctx->bb)
> +                || (bucket->length == (apr_size_t)-1)

How can we have a bucket length of -1 here?
What about flush buckets? Shouldn't they cause a passing here as well?

> +                || (tmp_bb_len += bucket->length) >=
> +                        conf->flush_max_threshold) {
> +            rv = ap_pass_brigade(f->next, ctx->tmp_bb);
> +            apr_brigade_cleanup(ctx->tmp_bb);
> +            if (status == APR_SUCCESS) {
> +                status = rv;
>              }

Regards

RĂ¼diger