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:
@@ -1 +1 @@
|
|||||||
2460
|
2461
|
||||||
|
@@ -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><auto></td>
|
<td><auto></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.
|
||||||
|
@@ -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';
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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");
|
||||||
|
Reference in New Issue
Block a user