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

Add failontimeout to allow server admin to mark balancer member in err if IO timeout occurs.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1465839 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Daniel Ruggeri
2013-04-09 00:18:42 +00:00
parent 086da9d005
commit d31632f33c
7 changed files with 29 additions and 1 deletions

View File

@@ -1 +1 @@
2460
2461

View File

@@ -1138,6 +1138,12 @@ ProxyPass /mirror/foo http://backend.example.com
force the worker into error state when the backend returns any status code
in the list. Worker recovery behaves the same as other worker errors.
</td></tr>
<tr><td>failontimeout</td>
<td>Off</td>
<td>If set, an IO read timeout after a request is sent to the backend will
force the worker into error state. Worker recovery behaves the same as other
worker errors.
</td></tr>
<tr><td>nonce</td>
<td>&lt;auto&gt;</td>
<td>The protective nonce used in the <code>balancer-manager</code> application page.

View File

@@ -383,6 +383,14 @@ static const char *set_balancer_param(proxy_server_conf *conf,
}
}
else if (!strcasecmp(key, "failontimeout")) {
if (!strcasecmp(val, "on"))
balancer->failontimeout = 1;
else if (!strcasecmp(val, "off"))
balancer->failontimeout = 0;
else
return "failontimeout must be On|Off";
}
else if (!strcasecmp(key, "nonce")) {
if (!strcasecmp(val, "None")) {
*balancer->s->nonce = '\0';

View File

@@ -451,6 +451,7 @@ struct proxy_balancer {
proxy_server_conf *sconf;
void *context; /* general purpose storage */
proxy_balancer_shared *s; /* Shared data */
int failontimeout; /* Whether to mark a member in Err if IO timeout occurs */
};
struct proxy_balancer_method {

View File

@@ -662,6 +662,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
* but doesn't affect the whole worker.
*/
if (APR_STATUS_IS_TIMEUP(status) && conn->worker->s->ping_timeout_set) {
apr_table_set(r->notes, "proxy_timedout", "1");
rv = HTTP_GATEWAY_TIME_OUT;
}
else {

View File

@@ -649,6 +649,17 @@ static int proxy_balancer_post_request(proxy_worker *worker,
}
}
if (balancer->failontimeout
&& (apr_table_get(r->notes, "proxy_timedout")) != NULL) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02460)
"%s: Forcing worker (%s) into error state "
"due to timeout and 'failonstatus' parameter being set",
balancer->s->name, worker->s->name);
worker->s->status |= PROXY_WORKER_IN_ERROR;
worker->s->error_time = apr_time_now();
}
if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01175)
"%s: Unlock failed for post_request", balancer->s->name);

View File

@@ -1312,6 +1312,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
"error reading status line from remote "
"server %s:%d", backend->hostname, backend->port);
if (APR_STATUS_IS_TIMEUP(rc)) {
apr_table_set(r->notes, "proxy_timedout", "1");
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01103) "read timeout");
if (do_100_continue) {
return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, "Timeout on 100-Continue");