
rpluem at apache
Oct 13, 2008, 3:06 AM
Post #1 of 1
(55 views)
Permalink
|
|
svn commit: r703998 - in /httpd/httpd/trunk: CHANGES modules/proxy/proxy_util.c
|
|
Author: rpluem Date: Mon Oct 13 03:06:28 2008 New Revision: 703998 URL: http://svn.apache.org/viewvc?rev=703998&view=rev Log: * 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 Modified: httpd/httpd/trunk/CHANGES httpd/httpd/trunk/modules/proxy/proxy_util.c Modified: httpd/httpd/trunk/CHANGES URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=703998&r1=703997&r2=703998&view=diff ============================================================================== --- httpd/httpd/trunk/CHANGES [utf-8] (original) +++ httpd/httpd/trunk/CHANGES [utf-8] Mon Oct 13 03:06:28 2008 @@ -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>] Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=703998&r1=703997&r2=703998&view=diff ============================================================================== --- httpd/httpd/trunk/modules/proxy/proxy_util.c (original) +++ httpd/httpd/trunk/modules/proxy/proxy_util.c Mon Oct 13 03:06:28 2008 @@ -2358,6 +2358,17 @@ "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 @@ 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);
|