From: Ruediger Pluem Date: Tue, 19 Dec 2006 21:56:16 +0000 (+0000) Subject: Merge r484978,r484787,r484792 from trunk: X-Git-Tag: 2.2.4~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7abbccf5b5fe3ac983d677b55381951b09acf33d;p=thirdparty%2Fapache%2Fhttpd.git Merge r484978,r484787,r484792 from trunk: * Isolate the unlock return vals * Log when the lock fails. * Failure to unlock is very nasty, so log it to help with troubleshooting. Submitted by: jim Reviewed by: jim, rpluem, wrowe git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@488822 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/STATUS b/STATUS index 70fbd992617..4f7ab7a0b27 100644 --- a/STATUS +++ b/STATUS @@ -86,16 +86,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: http://mail-archives.apache.org/mod_mbox//httpd-dev/200609.mbox/%3c1404e5910609091218p84f4d2flc1000764b4966727@mail.gmail.com%3e +1: trawick, wrowe, jerenkrantz - * mod_proxy: Log unlock errors (as we do with locking errors). - Add additional clarification on where the error occurred. - Trunk version of patch: - http://svn.apache.org/viewvc?view=rev&revision=484792 - http://svn.apache.org/viewvc?view=rev&revision=484787 - http://svn.apache.org/viewvc?view=rev&revision=484978 - 2.2.x version of patch: - For r484787, see: http://people.apache.org/~jim/patches/lock.txt - otherwise, trunk version works. - +1: jim, rpluem, wrowe PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index 7f55deacbaa..02f5ac3a3e2 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -280,9 +280,13 @@ static proxy_worker *find_best_worker(proxy_balancer *balancer, request_rec *r) { proxy_worker *candidate = NULL; + apr_status_t rv; - if (PROXY_THREAD_LOCK(balancer) != APR_SUCCESS) + if ((rv = PROXY_THREAD_LOCK(balancer)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: BALANCER: (%s). Lock failed for find_best_worker()", balancer->name); return NULL; + } candidate = (*balancer->lbmethod->finder)(balancer, r); @@ -294,7 +298,10 @@ static proxy_worker *find_best_worker(proxy_balancer *balancer, return NULL; */ - PROXY_THREAD_UNLOCK(balancer); + if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: BALANCER: (%s). Unlock failed for find_best_worker()", balancer->name); + } if (candidate == NULL) { /* All the workers are in error state or disabled. @@ -382,7 +389,8 @@ static int proxy_balancer_pre_request(proxy_worker **worker, */ if ((rv = PROXY_THREAD_LOCK(*balancer)) != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "proxy: BALANCER: lock"); + "proxy: BALANCER: (%s). Lock failed for pre_request", + (*balancer)->name); return DECLINED; } if (runtime) { @@ -416,11 +424,19 @@ static int proxy_balancer_pre_request(proxy_worker **worker, ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, "proxy: BALANCER: (%s). All workers are in error state for route (%s)", (*balancer)->name, route); - PROXY_THREAD_UNLOCK(*balancer); + if ((rv = PROXY_THREAD_UNLOCK(*balancer)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: BALANCER: (%s). Unlock failed for pre_request", + (*balancer)->name); + } return HTTP_SERVICE_UNAVAILABLE; } - PROXY_THREAD_UNLOCK(*balancer); + if ((rv = PROXY_THREAD_UNLOCK(*balancer)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: BALANCER: (%s). Unlock failed for pre_request", + (*balancer)->name); + } if (!*worker) { runtime = find_best_worker(*balancer, r); if (!runtime) { @@ -485,7 +501,8 @@ static int proxy_balancer_post_request(proxy_worker *worker, if ((rv = PROXY_THREAD_LOCK(balancer)) != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, - "proxy: BALANCER: lock"); + "proxy: BALANCER: (%s). Lock failed for post_request", + balancer->name); return HTTP_INTERNAL_SERVER_ERROR; } /* TODO: calculate the bytes transferred @@ -496,7 +513,11 @@ static int proxy_balancer_post_request(proxy_worker *worker, * track on that. */ - PROXY_THREAD_UNLOCK(balancer); + if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: BALANCER: (%s). Unlock failed for post_request", + balancer->name); + } ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy_balancer_post_request for (%s)", balancer->name); diff --git a/modules/proxy/mod_proxy_ftp.c b/modules/proxy/mod_proxy_ftp.c index 63775f3b806..03cb0953de2 100644 --- a/modules/proxy/mod_proxy_ftp.c +++ b/modules/proxy/mod_proxy_ftp.c @@ -763,6 +763,7 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, apr_status_t rv; conn_rec *origin, *data = NULL; apr_status_t err = APR_SUCCESS; + apr_status_t uerr = APR_SUCCESS; apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc); char *buf, *connectname; apr_port_t connectport; @@ -916,7 +917,10 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, address_pool); if (worker->is_address_reusable && !worker->cp->addr) { worker->cp->addr = connect_addr; - PROXY_THREAD_UNLOCK(worker); + if ((uerr = PROXY_THREAD_UNLOCK(worker)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, uerr, r->server, + "proxy: FTP: unlock"); + } } /* * get all the possible IP addresses for the destname and loop through diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 0f87b07cdac..c9c6213900e 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1840,6 +1840,7 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, { int server_port; apr_status_t err = APR_SUCCESS; + apr_status_t uerr = APR_SUCCESS; /* * Break up the URL to determine the host to connect to @@ -1922,7 +1923,10 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, conn->port, 0, worker->cp->pool); conn->addr = worker->cp->addr; - PROXY_THREAD_UNLOCK(worker); + if ((uerr = PROXY_THREAD_UNLOCK(worker)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, uerr, r->server, + "proxy: unlock"); + } } else conn->addr = worker->cp->addr;