mturk       2004/08/05 12:09:13

  Modified:    ajp/proxy proxy_util.c mod_proxy.h
  Log:
  Added acquire and release connection functions.
  The acquire pulls the connection from the pool.
  The release returns the connection to the pool.
  
  Revision  Changes    Path
  1.17      +66 -54    jakarta-tomcat-connectors/ajp/proxy/proxy_util.c
  
  Index: proxy_util.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/proxy_util.c,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- proxy_util.c      5 Aug 2004 18:32:57 -0000       1.16
  +++ proxy_util.c      5 Aug 2004 19:09:13 -0000       1.17
  @@ -1366,83 +1366,102 @@
       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 @@
   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 @@
           }
   
   #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 @@
               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)
   {
  
  
  
  1.23      +5 -5      jakarta-tomcat-connectors/ajp/proxy/mod_proxy.h
  
  Index: mod_proxy.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/mod_proxy.h,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- mod_proxy.h       5 Aug 2004 18:32:57 -0000       1.22
  +++ mod_proxy.h       5 Aug 2004 19:09:13 -0000       1.23
  @@ -360,12 +360,12 @@
   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;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to