From c25b89a72006389fa9c651a7325e020374fc3edd Mon Sep 17 00:00:00 2001 From: "William A. Rowe Jr" Date: Wed, 11 Aug 2004 22:30:06 +0000 Subject: [PATCH] Added acquire timeout for obtaining resources from reslist. The timeout is in milliseconds to enable quick return in case the reslist is exceded the maximum number of connections. Submitted by: mturk git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@104591 13f79535-47bb-0310-9956-ffa450edef68 --- modules/proxy/mod_proxy.c | 9 ++++++++- modules/proxy/mod_proxy.h | 3 ++- modules/proxy/proxy_util.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index f661f4cd9d..5d863b2e38 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -92,7 +92,7 @@ static const char *set_worker_param(proxy_worker *worker, else if (!strcasecmp(key, "ttl")) { ival = atoi(val); if (ival < 1) - return "ttl must be al least one second"; + return "ttl must be at least one second"; worker->ttl = apr_time_from_sec(ival); } else if (!strcasecmp(key, "min")) { @@ -114,6 +114,13 @@ static const char *set_worker_param(proxy_worker *worker, return "smax must be a positive number"; worker->smax = ival; } + else if (!strcasecmp(key, "acquire")) { + ival = atoi(val); + if (ival < 1) + return "acquire must be at least one mili second"; + worker->acquire = apr_time_make(0, ival * 1000); + worker->acquire_set = 1; + } else { return "unknown parameter"; } diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 2207323088..06eb00a2eb 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -228,7 +228,8 @@ struct proxy_worker { apr_interval_time_t ttl; /* maximum amount of time in seconds a connection * may be available while exceeding the soft limit */ apr_interval_time_t timeout; /* connection timeout */ - + apr_interval_time_t acquire; /* acquire timeout when the maximum number of connections is exceeded */ + char acquire_set; proxy_conn_pool *cp; /* Connection pool to use */ void *opaque; /* per scheme worker data */ }; diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 8a39c43b02..09f3bfa915 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1364,6 +1364,37 @@ static apr_status_t connection_destructor(void *resource, void *params, return APR_SUCCESS; } +/* low level connection acquire/release functions + * they are hiding apr_reslist for nothreaded or prefork servers. + */ +static apr_status_t acquire_connection_low(proxy_conn_rec **conn, proxy_worker *worker) +{ + apr_status_t rv; +#if APR_HAS_THREADS + if (worker->hmax) { + rv = apr_reslist_acquire(worker->cp->res, (void **)conn); + } + else +#endif + { + *conn = worker->cp->conn; + rv = APR_SUCCESS; + } + return rv; +} + +static apr_status_t release_connection_low(proxy_conn_rec *conn, proxy_worker *worker) +{ + apr_status_t rv = APR_SUCCESS; +#if APR_HAS_THREADS + if (worker->hmax) { + rv = apr_reslist_release(worker->cp->res, (void *)conn); + } +#endif + return rv; +} + + static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s) { apr_status_t rv; @@ -1374,6 +1405,11 @@ static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s) worker->hmax, worker->ttl, connection_constructor, connection_destructor, s, worker->cp->pool); +#if (APR_MAJOR_VERSION > 0) + /* Set the acquire timeout */ + if (rv == APR_SUCCESS && worker->acquire_set) + apr_reslist_timeout_set(worker->cp->res, worker->acquire); +#endif } else #endif -- 2.50.1