]> granicus.if.org Git - apache/commitdiff
Stash DBD connections in request_config of initial request
authorChris Darroch <chrisd@apache.org>
Sat, 2 Dec 2006 06:25:07 +0000 (06:25 +0000)
committerChris Darroch <chrisd@apache.org>
Sat, 2 Dec 2006 06:25:07 +0000 (06:25 +0000)
only, or else sub-requests and internal redirections may cause
entire DBD pool to be stashed in a single HTTP request.

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

CHANGES
modules/database/mod_dbd.c

diff --git a/CHANGES b/CHANGES
index 2f13b168a6813701e781b09785a75fb6a44ebc48..6ea700a49f87cab4563d91c58afec1bad5ec137a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@
 Changes with Apache 2.3.0
   [Remove entries to the current 2.0 and 2.2 section below, when backported]
 
+  *) mod_dbd: Stash DBD connections in request_config of initial request
+     only, or else sub-requests and internal redirections may cause
+     entire DBD pool to be stashed in a single HTTP request.  [Chris Darroch]
+
   *) mod_cache: Correctly cache objects whose URL query string has been
      modified by mod_rewrite. PR 40805. [Ruediger Pluem]
 
index 624869c2b74da484d371c8f09c8752292574c3ae..9356ce775d5de4f0bbb2e23f903934fc6eae8d2d 100644 (file)
@@ -524,7 +524,18 @@ static apr_status_t dbd_release(void *REQ)
 DBD_DECLARE_NONSTD(ap_dbd_t *) ap_dbd_acquire(request_rec *r)
 {
     svr_cfg *svr;
-    dbd_pool_rec *req = ap_get_module_config(r->request_config, &dbd_module);
+    dbd_pool_rec *req;
+
+    while (!ap_is_initial_req(r)) {
+        if (r->prev) {
+            r = r->prev;
+        }
+        else if (r->main) {
+            r = r->main;
+        }
+    }
+
+    req = ap_get_module_config(r->request_config, &dbd_module);
     if (!req) {
         req = apr_palloc(r->pool, sizeof(dbd_pool_rec));
         req->conn = ap_dbd_open(r->pool, r->server);
@@ -571,7 +582,18 @@ DBD_DECLARE_NONSTD(ap_dbd_t *) ap_dbd_cacquire(conn_rec *c)
 DBD_DECLARE_NONSTD(ap_dbd_t *) ap_dbd_acquire(request_rec *r)
 {
     svr_cfg *svr;
-    ap_dbd_t *ret = ap_get_module_config(r->request_config, &dbd_module);
+    ap_dbd_t *ret;
+
+    while (!ap_is_initial_req(r)) {
+        if (r->prev) {
+            r = r->prev;
+        }
+        else if (r->main) {
+            r = r->main;
+        }
+    }
+
+    ret = ap_get_module_config(r->request_config, &dbd_module);
     if (!ret) {
         svr = ap_get_module_config(r->server->module_config, &dbd_module);
         ret = ap_dbd_open(r->pool, r->server);