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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to