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:

            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);
                    }
                }
            }

Reply via email to