1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

* 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
This commit is contained in:
Ruediger Pluem
2008-10-13 10:06:28 +00:00
parent 70b4ac3287
commit 4809b77936
2 changed files with 22 additions and 0 deletions

View File

@@ -2,6 +2,10 @@
Changes with Apache 2.3.0 Changes with Apache 2.3.0
[ When backported to 2.2.x, remove entry from this file ] [ 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 *) Worker MPM: Crosscheck that idle workers are still available before using
them and thus preventing an overflow of the worker queue which causes them and thus preventing an overflow of the worker queue which causes
a SegFault. PR 45605 [Denis Ustimenko <denusk gmail.com>] a SegFault. PR 45605 [Denis Ustimenko <denusk gmail.com>]

View File

@@ -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: %s: fam %d socket created to connect to %s",
proxy_function, backend_addr->family, worker->hostname); 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 */ /* make the connection out of the socket */
rv = apr_socket_connect(newsock, backend_addr); rv = apr_socket_connect(newsock, backend_addr);
@@ -2374,6 +2385,13 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
continue; 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 */ /* Set a timeout on the socket */
if (worker->timeout_set == 1) { if (worker->timeout_set == 1) {
apr_socket_timeout_set(newsock, worker->timeout); apr_socket_timeout_set(newsock, worker->timeout);