Commit 84ebd530 authored by Ruediger Pluem's avatar Ruediger Pluem
Browse files

* Make the connection timeout to backends work by temporarily setting the

  socket to non blocking mode.

Submitted by: Matt Stevenson <mavricknzwork yahoo.com>
Reviewed by: rpluem


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@703998 13f79535-47bb-0310-9956-ffa450edef68
parent d2c87f37
Loading
Loading
Loading
Loading
+4 −0
Changes for CHANGES: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,6 +2,10 @@
Changes with Apache 2.3.0
[ When backported to 2.2.x, remove entry from this file ]

  *) mod_proxy: Make the connection timeout to backends work by temporarily
     setting the socket to non blocking mode.
     [Matt Stevenson <mavricknzwork yahoo.com>]

  *) Worker MPM: Crosscheck that idle workers are still available before using
     them and thus preventing an overflow of the worker queue which causes
     a SegFault. PR 45605 [Denis Ustimenko <denusk gmail.com>]
+18 −0
Changes for modules/proxy/proxy_util.c: 18 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2358,6 +2358,17 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
                     "proxy: %s: fam %d socket created to connect to %s",
                     proxy_function, backend_addr->family, worker->hostname);

        /*
         * Temporarily set the socket to non blocking to make connection
         * timeouts (set via connectiontimeout) work.
         */
        if ((rv = apr_socket_opt_set(newsock, APR_SO_NONBLOCK, 1))
            != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
                         "apr_socket_opt_set(SO_NONBLOCK): Failed to set"
                         " the socket to non blocking mode");
        }

        /* make the connection out of the socket */
        rv = apr_socket_connect(newsock, backend_addr);

@@ -2374,6 +2385,13 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
            continue;
        }

        if ((rv = apr_socket_opt_set(newsock, APR_SO_NONBLOCK, 0))
            != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
                         "apr_socket_opt_set(SO_NONBLOCK): Failed to set"
                         " the socket to blocking mode");
        }

        /* Set a timeout on the socket */
        if (worker->timeout_set == 1) {
            apr_socket_timeout_set(newsock, worker->timeout);