From: William A. Rowe Jr Date: Wed, 11 Aug 2004 22:37:08 +0000 (+0000) Subject: Added acquire and release connection functions. X-Git-Tag: post_ajp_proxy~32 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6cc26c2656427dafb20ff53fbe8e283b629812db;p=apache Added acquire and release connection functions. The acquire pulls the connection from the pool. The release returns the connection to the pool. Submitted by: mturk git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@104598 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 4002c6f37b..508faf67b1 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -360,12 +360,12 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker, proxy_balancer ** PROXY_DECLARE(apr_status_t) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn, apr_pool_t *ppool, apr_uri_t *uri, char **url, const char *proxyname, apr_port_t proxyport, char *server_portstr, int server_portstr_size); -PROXY_DECLARE(apr_status_t) ap_proxy_destroy_connection(proxy_conn_rec *conn); +PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function, proxy_conn_rec **conn, proxy_worker *worker, server_rec *s); +PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function, proxy_conn_rec *conn, server_rec *s); PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn); -PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, - proxy_server_conf *conf, server_rec *s); -PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, - proxy_server_conf *conf, conn_rec *c, server_rec *s); +PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, server_rec *s); +PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, conn_rec *c, server_rec *s); + /* For proxy_util */ extern module PROXY_DECLARE_DATA proxy_module; diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 4546ef653e..11fadb55e8 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1366,83 +1366,102 @@ static apr_status_t connection_destructor(void *resource, void *params, return APR_SUCCESS; } -/* Destroy the connection */ -PROXY_DECLARE(apr_status_t) ap_proxy_destroy_connection(proxy_conn_rec *conn) -{ - return connection_destructor(conn, NULL, NULL); -} - -/* Destroy the connection */ +/* Close the connection + * The proxy_conn_rec from now on can not be used + */ PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn) { - apr_status_t rv = APR_EOF; - /* Close the socket */ - if (conn->sock) - rv = apr_socket_close(conn->sock); - conn->sock = NULL; - return rv; + if (conn->worker && conn->worker->cp) + conn->worker->cp->conn = NULL; + return connection_destructor(conn, NULL, NULL); } -/* 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) +static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s) { apr_status_t rv; #if APR_HAS_THREADS if (worker->hmax) { - rv = apr_reslist_acquire(worker->cp->res, (void **)conn); + rv = apr_reslist_create(&(worker->cp->res), + worker->min, worker->smax, + 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 { - *conn = worker->cp->conn; - worker->cp->conn = NULL; + + connection_constructor((void **)&(worker->cp->conn), s, worker->cp->pool); rv = APR_SUCCESS; } return rv; } -static apr_status_t release_connection_low(proxy_conn_rec *conn, proxy_worker *worker) +PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function, + proxy_conn_rec **conn, + proxy_worker *worker, + server_rec *s) { - apr_status_t rv = APR_SUCCESS; + apr_status_t rv; #if APR_HAS_THREADS if (worker->hmax) { - rv = apr_reslist_release(worker->cp->res, (void *)conn); + rv = apr_reslist_acquire(worker->cp->res, (void **)conn); } else #endif { - worker->cp->conn = conn; + /* create the new connection if the previous was destroyed */ + if (!worker->cp->conn) + connection_constructor((void **)conn, s, worker->cp->pool); + else { + *conn = worker->cp->conn; + worker->cp->conn = NULL; + } + rv = APR_SUCCESS; } - return rv; -} + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "proxy: %s: failed to acquire connection for (%s)", + proxy_function, worker->hostname); + return DECLINED; + } + return OK; +} -static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s) +PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function, + proxy_conn_rec *conn, + server_rec *s) { - apr_status_t rv; + apr_status_t rv = APR_SUCCESS; + proxy_worker *worker = conn->worker; + + if (!worker) { + /* something bad happened. Obviously bug. + * for now make a core dump. + */ + } #if APR_HAS_THREADS if (worker->hmax) { - rv = apr_reslist_create(&(worker->cp->res), - worker->min, worker->smax, - 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 + rv = apr_reslist_release(worker->cp->res, (void *)conn); } else #endif { - - connection_constructor((void **)&(worker->cp->conn), s, worker->cp->pool); - rv = APR_SUCCESS; + worker->cp->conn = conn; } - return rv; + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "proxy: %s: failed to acquire connection for (%s)", + proxy_function, conn->hostname); + return DECLINED; + } + return OK; } PROXY_DECLARE(apr_status_t) @@ -1554,7 +1573,6 @@ static int is_socket_connected(apr_socket_t *sock) PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, - proxy_server_conf *conf, server_rec *s) { apr_status_t rv; @@ -1592,9 +1610,9 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, } #if !defined(TPF) && !defined(BEOS) - if (conf->recv_buffer_size > 0 && + if (worker->recv_buffer_size > 0 && (rv = apr_socket_opt_set(newsock, APR_SO_RCVBUF, - conf->recv_buffer_size))) { + worker->recv_buffer_size))) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, "apr_socket_opt_set(SO_RCVBUF): Failed to set " "ProxyReceiveBufferSize, using default"); @@ -1637,21 +1655,15 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, continue; } - conn->sock = newsock; - conn->worker = worker; - /* XXX: the hostname will go from proxy_conn_rec - * keep for now. - * We will 'optimize' later, both code and unneeded data - */ - conn->hostname = worker->hostname; - connected = 1; + conn->sock = newsock; + conn->worker = worker; + connected = 1; } return connected ? OK : DECLINED; } PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, - proxy_server_conf *conf, conn_rec *c, server_rec *s) {