From 29121126c57008e9b4955a4eb64ffe8eedce18da Mon Sep 17 00:00:00 2001 From: Chris Darroch Date: Sat, 2 Dec 2006 06:25:07 +0000 Subject: [PATCH] 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. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@481509 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 4 ++++ modules/database/mod_dbd.c | 26 ++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 2f13b168a6..6ea700a49f 100644 --- 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] diff --git a/modules/database/mod_dbd.c b/modules/database/mod_dbd.c index 624869c2b7..9356ce775d 100644 --- a/modules/database/mod_dbd.c +++ b/modules/database/mod_dbd.c @@ -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); -- 2.40.0