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 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. in the list. Worker recovery behaves the same as other worker errors.
</td></tr> </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> <tr><td>nonce</td>
<td>&lt;auto&gt;</td> <td>&lt;auto&gt;</td>
<td>The protective nonce used in the <code>balancer-manager</code> application page. <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")) { else if (!strcasecmp(key, "nonce")) {
if (!strcasecmp(val, "None")) { if (!strcasecmp(val, "None")) {
*balancer->s->nonce = '\0'; *balancer->s->nonce = '\0';

View File

@@ -451,6 +451,7 @@ struct proxy_balancer {
proxy_server_conf *sconf; proxy_server_conf *sconf;
void *context; /* general purpose storage */ void *context; /* general purpose storage */
proxy_balancer_shared *s; /* Shared data */ proxy_balancer_shared *s; /* Shared data */
int failontimeout; /* Whether to mark a member in Err if IO timeout occurs */
}; };
struct proxy_balancer_method { 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. * but doesn't affect the whole worker.
*/ */
if (APR_STATUS_IS_TIMEUP(status) && conn->worker->s->ping_timeout_set) { 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; rv = HTTP_GATEWAY_TIME_OUT;
} }
else { 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) { if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01175) ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01175)
"%s: Unlock failed for post_request", balancer->s->name); "%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 " "error reading status line from remote "
"server %s:%d", backend->hostname, backend->port); "server %s:%d", backend->hostname, backend->port);
if (APR_STATUS_IS_TIMEUP(rc)) { 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"); ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01103) "read timeout");
if (do_100_continue) { if (do_100_continue) {
return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, "Timeout on 100-Continue"); return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, "Timeout on 100-Continue");