mturk 2004/08/06 04:43:53 Modified: ajp/proxy proxy_util.c Log: A lot :) Make the things work... Revision Changes Path 1.19 +70 -40 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.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- proxy_util.c 6 Aug 2004 05:42:14 -0000 1.18 +++ proxy_util.c 6 Aug 2004 11:43:53 -0000 1.19 @@ -996,7 +996,7 @@ char *c, *uri = apr_pstrdup(p, url); int i; - c = strchr(url, ':'); + c = strchr(uri, ':'); if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0') return NULL; /* remove path from uri */ @@ -1020,7 +1020,7 @@ int port; apr_status_t rc = 0; - c = strchr(url, ':'); + c = strchr(uri, ':'); if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0') return "Bad syntax for a remote proxy server"; /* remove path from uri */ @@ -1032,14 +1032,12 @@ if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) { return "Bad syntax for a remote proxy server (bad port number)"; } - *q = '\0'; } else port = -1; ap_str_tolower(uri); *balancer = apr_array_push(conf->balancers); - (*balancer)->name = apr_pstrdup(p, uri); - *c = '\0'; + (*balancer)->name = uri; (*balancer)->workers = apr_array_make(p, 5, sizeof(proxy_runtime_worker)); /* XXX Is this a right place to create mutex */ #if APR_HAS_THREADS @@ -1061,21 +1059,31 @@ char *c, *uri = apr_pstrdup(p, url); int i; - c = strchr(url, ':'); + c = strchr(uri, ':'); if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0') return NULL; /* remove path from uri */ if ((c = strchr(c + 3, '/'))) *c = '\0'; + worker = (proxy_worker *)conf->workers->elts; for (i = 0; i < conf->workers->nelts; i++) { - if (strcasecmp(worker->name, uri) == 0) + if (strcasecmp(worker->name, uri) == 0) { return worker; + } worker++; } return NULL; } +static apr_status_t conn_pool_cleanup(void *thepool) +{ + proxy_conn_pool *cp = (proxy_conn_pool *)thepool; + /* Close the socket */ + cp->addr = NULL; + return APR_SUCCESS; +} + static void init_conn_pool(apr_pool_t *p, proxy_worker *worker) { apr_pool_t *pool; @@ -1091,29 +1099,12 @@ * proxy_conn_pool is permanently attached to the worker. */ cp = (proxy_conn_pool *)apr_pcalloc(p, sizeof(proxy_conn_pool)); - cp->pool = pool; -#if APR_HAS_THREADS - { - int mpm_threads; - ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads); - if (mpm_threads > 1) { - /* Set hard max to no more then mpm_threads */ - if (worker->hmax == 0 || worker->hmax > mpm_threads) - worker->hmax = mpm_threads; - if (worker->smax == 0 || worker->smax > worker->hmax) - worker->smax = worker->hmax; - /* Set min to be lower then smax */ - if (worker->min > worker->smax) - worker->min = worker->smax; - } - else { - /* This will supress the apr_reslist creation */ - worker->min = worker->smax = worker->hmax = 0; - } - } -#endif - + cp->pool = pool; worker->cp = cp; + apr_pool_cleanup_register(p, (void *)cp, + conn_pool_cleanup, + apr_pool_cleanup_null); + } PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker, @@ -1136,13 +1127,13 @@ if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) { return "Bad syntax for a remote proxy server (bad port number)"; } - *q = '\0'; } else port = -1; ap_str_tolower(uri); *worker = apr_array_push(conf->workers); - (*worker)->name = apr_pstrdup(p, url); + memset(*worker, 0, sizeof(proxy_worker)); + (*worker)->name = (*worker)->hostname = apr_pstrdup(p, uri); *c = '\0'; (*worker)->scheme = uri; if (port == -1) @@ -1321,6 +1312,7 @@ if (conn->sock) apr_socket_close(conn->sock); conn->sock = NULL; + conn->pool = NULL; return APR_SUCCESS; } @@ -1332,7 +1324,6 @@ if (conn->sock) apr_socket_close(conn->sock); conn->sock = NULL; - } conn->connection = NULL; ap_proxy_release_connection(NULL, conn, NULL); @@ -1359,7 +1350,8 @@ *resource = conn; /* register the pool cleanup */ apr_pool_cleanup_register(ctx, (void *)conn, - proxy_conn_cleanup, apr_pool_cleanup_null); + proxy_conn_cleanup, + apr_pool_cleanup_null); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "proxy: socket is constructed"); @@ -1374,11 +1366,20 @@ proxy_conn_rec *conn = (proxy_conn_rec *)resource; server_rec *s = (server_rec *)params; - apr_pool_destroy(conn->pool); +#if 0 + if (conn->sock) + apr_socket_close(conn->sock); + conn->sock = NULL; + apr_pool_cleanup_kill(conn->pool, conn, proxy_conn_cleanup); +#endif + if (conn->pool) + apr_pool_destroy(conn->pool); + conn->pool = NULL; +#if 0 if (s != NULL) ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "proxy: socket is destructed"); - +#endif return APR_SUCCESS; } @@ -1387,6 +1388,7 @@ */ PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn) { + if (conn->worker && conn->worker->cp) conn->worker->cp->conn = NULL; return connection_destructor(conn, NULL, NULL); @@ -1395,7 +1397,25 @@ static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s) { apr_status_t rv; + #if APR_HAS_THREADS + int mpm_threads; + + ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads); + if (mpm_threads > 1) { + /* Set hard max to no more then mpm_threads */ + if (worker->hmax == 0 || worker->hmax > mpm_threads) + worker->hmax = mpm_threads; + if (worker->smax == 0 || worker->smax > worker->hmax) + worker->smax = worker->hmax; + /* Set min to be lower then smax */ + if (worker->min > worker->smax) + worker->min = worker->smax; + } + else { + /* This will supress the apr_reslist creation */ + worker->min = worker->smax = worker->hmax = 0; + } if (worker->hmax) { rv = apr_reslist_create(&(worker->cp->res), worker->min, worker->smax, @@ -1424,6 +1444,17 @@ server_rec *s) { apr_status_t rv; + + if (!worker->status) { + if ((rv = init_conn_worker(worker, s)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "proxy: %s: failed to initialize worker for (%s)", + proxy_function, worker->hostname); + return DECLINED; + } + /* TODO: make worker status codes */ + worker->status = 1; + } #if APR_HAS_THREADS if (worker->hmax) { rv = apr_reslist_acquire(worker->cp->res, (void **)conn); @@ -1474,7 +1505,7 @@ apr_pool_cleanup_kill(conn->connection->pool, conn, connection_cleanup); #if APR_HAS_THREADS - if (worker->hmax) { + if (worker->hmax && worker->cp->res) { rv = apr_reslist_release(worker->cp->res, (void *)conn); } else @@ -1491,7 +1522,7 @@ return OK; } -PROXY_DECLARE(apr_status_t) +PROXY_DECLARE(int) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, @@ -1691,7 +1722,6 @@ PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, - int close_on_recycle, conn_rec *c, server_rec *s) { @@ -1733,7 +1763,6 @@ /* TODO: See if this will break FTP */ ap_proxy_ssl_disable(conn->connection); } - conn->close_on_recycle = close_on_recycle; ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "proxy: %s: connection complete to %pI (%s)", @@ -1745,7 +1774,8 @@ /* register the connection cleanup to client connection * so that the connection can be closed or reused */ - apr_pool_cleanup_register(c->pool, (void *)conn, connection_cleanup, + apr_pool_cleanup_register(conn->connection->pool, (void *)conn, + connection_cleanup, apr_pool_cleanup_null); return OK;
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]