]> granicus.if.org Git - apache/commitdiff
Added acquire and release connection functions.
authorWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 11 Aug 2004 22:37:08 +0000 (22:37 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 11 Aug 2004 22:37:08 +0000 (22:37 +0000)
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

modules/proxy/mod_proxy.h
modules/proxy/proxy_util.c

index 4002c6f37bd1ff92df11f4f196084e9e166f1d51..508faf67b1de103fa4dc55cc4efd6c2330b657e6 100644 (file)
@@ -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;
 
index 4546ef653e10783265f3c6a6d24ff6e0898b2adb..11fadb55e88319f0c070770af400336d1b26ec5d 100644 (file)
@@ -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)
 {