You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2004/08/06 16:05:46 UTC
cvs commit: jakarta-tomcat-connectors/ajp/proxy proxy_http.c proxy_util.c
mturk 2004/08/06 07:05:46
Modified: ajp/proxy proxy_http.c proxy_util.c
Log:
Fix the assertion bug for reslist caused by returning the
same connection back to the pool twice.
Revision Changes Path
1.3 +8 -13 jakarta-tomcat-connectors/ajp/proxy/proxy_http.c
Index: proxy_http.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/proxy_http.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- proxy_http.c 6 Aug 2004 11:44:45 -0000 1.2
+++ proxy_http.c 6 Aug 2004 14:05:45 -0000 1.3
@@ -796,7 +796,8 @@
}
if (len <= 0) {
apr_socket_close(backend->sock);
- backend->connection = NULL;
+ backend->sock = NULL;
+// backend->connection = NULL;
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"proxy: error reading status line from remote "
"server %s", backend->hostname);
@@ -819,7 +820,8 @@
*/
else if ((buffer[5] != '1') || (len >= sizeof(buffer)-1)) {
apr_socket_close(backend->sock);
- backend->connection = NULL;
+// backend->connection = NULL;
+ backend->sock = NULL;
return ap_proxyerror(r, HTTP_BAD_GATEWAY,
apr_pstrcat(p, "Corrupt status line returned by remote "
"server: ", buffer, NULL));
@@ -1029,7 +1031,7 @@
* backend server from hanging around waiting
* for a slow client to eat these bytes
*/
- ap_proxy_http_cleanup(NULL, r, backend);
+ backend->close = 1;
/* signal that we must leave */
finish = TRUE;
}
@@ -1092,18 +1094,11 @@
/* if the connection is < HTTP/1.1, or Connection: close,
* we close the socket, otherwise we leave it open for KeepAlive support
*/
- if (backend->close) {
+ if (backend->close || (r->proto_num < HTTP_VERSION(1,1))) {
backend->close_on_recycle = 1;
- ap_set_module_config(r->connection, &proxy_http_module, backend);
+ ap_set_module_config(r->connection->conn_config, &proxy_http_module, NULL);
ap_proxy_release_connection(scheme, backend, r->server);
}
- else if(r->proto_num < HTTP_VERSION(1,1)) {
- if (backend->sock) {
- apr_socket_close(backend->sock);
- backend->sock = NULL;
- backend->connection = NULL;
- }
- }
return OK;
}
@@ -1231,7 +1226,7 @@
/* Step Five: Receive the Response */
status = ap_proxy_http_process_response(p, r, backend, backend->connection, conf,
server_portstr);
- if ( status != OK ) {
+ if (status != OK) {
/* clean up even if there is an error */
ap_proxy_http_cleanup(scheme, r, backend);
return status;
1.20 +22 -39 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.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- proxy_util.c 6 Aug 2004 11:43:53 -0000 1.19
+++ proxy_util.c 6 Aug 2004 14:05:45 -0000 1.20
@@ -1319,14 +1319,24 @@
static apr_status_t connection_cleanup(void *theconn)
{
proxy_conn_rec *conn = (proxy_conn_rec *)theconn;
+ proxy_worker *worker = conn->worker;
+
/* deterimine if the connection need to be closed */
if (conn->close_on_recycle) {
if (conn->sock)
apr_socket_close(conn->sock);
conn->sock = NULL;
}
- conn->connection = NULL;
- ap_proxy_release_connection(NULL, conn, NULL);
+#if APR_HAS_THREADS
+ if (worker->hmax && worker->cp->res) {
+ apr_reslist_release(worker->cp->res, (void *)conn);
+ }
+ else
+#endif
+ {
+ worker->cp->conn = conn;
+ }
+
/* Allways return the SUCCESS */
return APR_SUCCESS;
}
@@ -1486,39 +1496,12 @@
server_rec *s)
{
apr_status_t rv = APR_SUCCESS;
- proxy_worker *worker = conn->worker;
- if (!worker) {
- /* something bad happened. Obviously bug.
- * for now make a core dump.
- */
- }
-
- /* Need to close the connection */
- if (conn->sock && conn->close) {
- apr_socket_close(conn->sock);
- conn->sock = NULL;
- }
- conn->close = 0;
/* If there is a connection kill it's cleanup */
if (conn->connection)
apr_pool_cleanup_kill(conn->connection->pool, conn, connection_cleanup);
-
-#if APR_HAS_THREADS
- if (worker->hmax && worker->cp->res) {
- rv = apr_reslist_release(worker->cp->res, (void *)conn);
- }
- else
-#endif
- {
- worker->cp->conn = conn;
- }
- if (rv != APR_SUCCESS && proxy_function) {
- ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
- "proxy: %s: failed to acquire connection for (%s)",
- proxy_function, conn->hostname);
- return DECLINED;
- }
+ connection_cleanup(conn);
+ conn->connection = NULL;
return OK;
}
@@ -1652,7 +1635,8 @@
while (backend_addr && !connected) {
if ((rv = apr_socket_create(&newsock, backend_addr->family,
- SOCK_STREAM, 0, conn->pool)) != APR_SUCCESS) {
+ SOCK_STREAM, APR_PROTO_TCP,
+ conn->pool)) != APR_SUCCESS) {
loglevel = backend_addr->next ? APLOG_DEBUG : APLOG_ERR;
ap_log_error(APLOG_MARK, loglevel, rv, s,
"proxy: %s: error creating fam %d socket for target %s",
@@ -1748,6 +1732,12 @@
conn->sock = NULL;
return HTTP_INTERNAL_SERVER_ERROR;
}
+ /* 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_null);
/* For ssl connection to backend */
if (conn->is_ssl) {
@@ -1770,13 +1760,6 @@
/* set up the connection filters */
ap_run_pre_connection(conn->connection, conn->sock);
-
- /* register the connection cleanup to client connection
- * so that the connection can be closed or reused
- */
- apr_pool_cleanup_register(conn->connection->pool, (void *)conn,
- connection_cleanup,
- apr_pool_cleanup_null);
return OK;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org