On 10/26/2008 04:58 PM, Jim Jagielski wrote:
> 
> On Oct 25, 2008, at 11:17 AM, Ruediger Pluem wrote:
> 
>>
>>
>> On 10/19/2008 03:06 PM, Ruediger Pluem wrote:
>>
>>> Another maybe funny sidenote: Because of the way the read method on
>>> socket buckets
>>> work and the way the core input filter works, the ap_get_brigade call
>>> when processing
>>> the http body of the backend response in mod_proxy_http never returns
>>> a brigade that
>>> contains more then 8k of data no matter what you set for
>>> ProxyIOBufferSize.
>>> And this is the case since 2.0.x days. So the optimization was always
>>> limited to
>>> sending at most 8k and in this case the TCP buffer (the send buffer)
>>> should have
>>> fixed this in many cases.
>>
>> The following patch should fix the above thing. Comments?
>>
>> Index: server/core_filters.c
>> ===================================================================
>> --- server/core_filters.c       (Revision 707744)
>> +++ server/core_filters.c       (Arbeitskopie)
>> @@ -267,6 +267,35 @@
>>             return APR_SUCCESS;
>>         }
>>
>> +        /* Have we read as much data as we wanted (be greedy)? */
>> +        if (len < readbytes) {
>> +            apr_size_t bucket_len;
>> +
>> +            rv = APR_SUCCESS;
>> +            /* We already registered the data in e in len */
>> +            e = APR_BUCKET_NEXT(e);
>> +            while ((len < readbytes) && (rv == APR_SUCCESS)
>> +                   && (e != APR_BRIGADE_SENTINEL(ctx->b))) {
>> +                /* Check for the availability of buckets with known
>> length */
>> +                if (e->length != -1) {
>> +                    len += e->length;
>> +                    e = APR_BUCKET_NEXT(e);
>> +                    continue;
>> +                }
>> +                /*
>> +                 * Read from bucket, but non blocking. If there isn't
>> any
>> +                 * more data, well than this is fine as well, we will
>> +                 * not wait for more since we already got some and we
>> are
>> +                 * only checking if there isn't more.
>> +                 */
>> +                rv = apr_bucket_read(e, &str, &bucket_len,
>> APR_NONBLOCK_READ);
>> +                if (rv == APR_SUCCESS) {
>> +                    len += bucket_len;
>> +                    e = APR_BUCKET_NEXT(e);
>> +                }
>> +            }
>>
> 
> +1 for the concept, but I'm not sure I like the logic flow
> of the continue. This is really an if/else so how about:

Sure it is an if/else. I don't care very much whether it is continue
of if/else. It just saved some indenting. So It can be in the
way you proposed below.

> 
>             while ((len < readbytes) && (rv == APR_SUCCESS)
>                    && (e != APR_BRIGADE_SENTINEL(ctx->b))) {
>                 /* Check for the availability of buckets with known
> length */
>                 if (e->length != -1) {
>                     len += e->length;
>                     e = APR_BUCKET_NEXT(e);
>                 } else {
>                     /*
>                      * Read from bucket, but non blocking. If there
> isn't any
>                      * more data, well than this is fine as well, we will
>                      * not wait for more since we already got some and
> we are
>                      * only checking if there isn't more.
>                      */
>                     rv = apr_bucket_read(e, &str, &bucket_len,
> APR_NONBLOCK_READ);
>                     if (rv == APR_SUCCESS) {
>                         len += bucket_len;
>                         e = APR_BUCKET_NEXT(e);
>                     }
>                 }
>             }

Regards

RĂ¼diger

Reply via email to