]> granicus.if.org Git - apache/commitdiff
When the proxy closes the backend connection early, force a setaside on
authorGraham Leggett <minfrin@apache.org>
Tue, 16 Nov 2010 12:08:38 +0000 (12:08 +0000)
committerGraham Leggett <minfrin@apache.org>
Tue, 16 Nov 2010 12:08:38 +0000 (12:08 +0000)
any buckets still outstanding to ensure they've been copied out of the
backend connection's pool and it is safe to release the backend connection.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1035605 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/mod_proxy_http.c

index e2204a6c93dbcf6569c9d505fddabc02ce44d9f8..573812474882786fa6f9d0f3135f1c949fc72b19 100644 (file)
@@ -1902,7 +1902,6 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
 
                     /* Switch the allocator lifetime of the buckets */
                     ap_proxy_buckets_lifetime_transform(r, bb, pass_bb);
-                    apr_brigade_cleanup(bb);
 
                     /* found the last brigade? */
                     if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(pass_bb))) {
@@ -1910,6 +1909,23 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
                         /* signal that we must leave */
                         finish = TRUE;
 
+                        /* the brigade may contain transient buckets that contain
+                         * data that lives only as long as the backend connection.
+                         * Force a setaside so these transient buckets become heap
+                         * buckets that live as long as the request.
+                         */
+                        for (e = APR_BRIGADE_FIRST(pass_bb); e
+                                != APR_BRIGADE_SENTINEL(pass_bb); e
+                                = APR_BUCKET_NEXT(e)) {
+                            apr_bucket_setaside(e, r->pool);
+                        }
+
+                        /* finally it is safe to clean up the brigade from the
+                         * connection pool, as we have forced a setaside on all
+                         * buckets.
+                         */
+                        apr_brigade_cleanup(bb);
+
                         /* make sure we release the backend connection as soon
                          * as we know we are done, so that the backend isn't
                          * left waiting for a slow client to eventually
@@ -1930,6 +1946,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
 
                     /* make sure we always clean up after ourselves */
                     apr_brigade_cleanup(pass_bb);
+                    apr_brigade_cleanup(bb);
 
                 } while (!finish);
             }