Commit aaed25ad authored by Jim Jagielski's avatar Jim Jagielski
Browse files

Merge r693392 from trunk:

* If CPING fails retry once more with a fresh TCP connection. If this fails
  as well give up.

Submitted by: rpluem
Reviewed by: jim


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@696322 13f79535-47bb-0310-9956-ffa450edef68
parent c6901b42
Loading
Loading
Loading
Loading
+0 −7
Changes for STATUS: 0 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -102,13 +102,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
       http://people.apache.org/~covener/2.2.x-auth_alias_digest.diff 
   +1: covener, rpluem, jerenkrantz

 * mod_proxy_ajp: If CPING fails retry once more with a fresh TCP connection.
   If this fails as well give up.
   Trunk version of patches:
      http://svn.apache.org/viewvc?rev=693392&view=rev
   Backport version for 2.2.x of patch:
       Trunk version of patches works
   +1: rpluem, covener, jerenkrantz

PATCHES PROPOSED TO BACKPORT FROM TRUNK:
  [ New proposals should be added at the end of the list ]
+15 −4
Changes for modules/proxy/mod_proxy_ajp.c: 15 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -550,6 +550,7 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
    conn_rec *origin = NULL;
    proxy_conn_rec *backend = NULL;
    const char *scheme = "AJP";
    int retry;
    proxy_dir_conf *dconf = ap_get_module_config(r->per_dir_config,
                                                 &proxy_module);

@@ -595,6 +596,8 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
    backend->is_ssl = 0;
    backend->close_on_recycle = 0;

    retry = 0;
    while (retry < 2) {
        /* Step One: Determine Who To Connect To */
        status = ap_proxy_determine_connection(p, r, conf, worker, backend,
                                               uri, &url, proxyname, proxyport,
@@ -602,7 +605,7 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
                                               sizeof(server_portstr));

        if (status != OK)
        goto cleanup;
            break;

        /* Step Two: Make the Connection */
        if (ap_proxy_connect_backend(scheme, backend, worker, r->server)) {
@@ -610,13 +613,19 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
                         "proxy: AJP: failed to make connection to backend: %s",
                         backend->hostname);
            status = HTTP_SERVICE_UNAVAILABLE;
        goto cleanup;
            break;
        }

        /* Handle CPING/CPONG */
        if (worker->ping_timeout_set) {
            status = ajp_handle_cping_cpong(backend->sock, r,
                                            worker->ping_timeout);
            /*
             * In case the CPING / CPONG failed for the first time we might be
             * just out of luck and got a faulty backend connection, but the
             * backend might be healthy nevertheless. So ensure that the backend
             * TCP connection gets closed and try it once again.
             */
            if (status != APR_SUCCESS) {
                backend->close++;
                ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,
@@ -624,14 +633,16 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
                             worker->cp->addr,
                             worker->hostname);
                status = HTTP_SERVICE_UNAVAILABLE;
            goto cleanup;
                retry++;
                continue;
            }
        }
        /* Step Three: Process the Request */
        status = ap_proxy_ajp_request(p, r, backend, origin, dconf, uri, url,
                                      server_portstr);
        break;
    }

cleanup:
    /* Do not close the socket */
    ap_proxy_release_connection(scheme, backend, r->server);
    return status;