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

Optimize... create a struct to hold the worker status info

(need to align w/ set_params later on) and note when we
update timestamps

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1066607 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Jagielski
2011-02-02 20:17:22 +00:00
parent 87e54e707f
commit ee5eda1b71
3 changed files with 51 additions and 84 deletions

View File

@@ -44,6 +44,20 @@ typedef struct {
const char *proxy_auth; /* Proxy authorization */
} forward_info;
/* Keep synced with mod_proxy.h! */
wstat wstat_tbl[] = {
{PROXY_WORKER_INITIALIZED, PROXY_WORKER_INITIALIZED_FLAG, "Init "},
{PROXY_WORKER_IGNORE_ERRORS, PROXY_WORKER_IGNORE_ERRORS_FLAG, "Ign "},
{PROXY_WORKER_DRAIN, PROXY_WORKER_DRAIN_FLAG, "Drn "},
{PROXY_WORKER_IN_SHUTDOWN, PROXY_WORKER_IN_SHUTDOWN_FLAG, "Shut "},
{PROXY_WORKER_DISABLED, PROXY_WORKER_DISABLED_FLAG, "Dis "},
{PROXY_WORKER_STOPPED, PROXY_WORKER_STOPPED_FLAG, "Stop "},
{PROXY_WORKER_IN_ERROR, PROXY_WORKER_IN_ERROR_FLAG, "Err "},
{PROXY_WORKER_HOT_STANDBY, PROXY_WORKER_HOT_STANDBY_FLAG, "Stby "},
{PROXY_WORKER_FREE, PROXY_WORKER_FREE_FLAG, "Free "},
{0x0, '\0', NULL}
};
/* Global balancer counter */
int PROXY_DECLARE_DATA proxy_lb_workers = 0;
static int lb_workers_limit = 0;
@@ -1371,7 +1385,6 @@ PROXY_DECLARE(char *) ap_proxy_define_balancer(apr_pool_t *p,
memset(bshared, 0, sizeof(proxy_balancer_shared));
bshared->lbmethod = lbmethod;
bshared->updated = apr_time_now();
bshared->was_malloced = (do_malloc != 0);
/* Retrieve a UUID and store the nonce for the lifetime of
@@ -1712,6 +1725,9 @@ PROXY_DECLARE(char *) ap_proxy_define_worker(apr_pool_t *p,
/* recall that we get a ptr to the ptr here */
runtime = apr_array_push(balancer->workers);
*worker = *runtime = apr_palloc(p, sizeof(proxy_worker)); /* right to left baby */
/* we've updated the list of workers associated with
* this balancer *locally* */
balancer->wupdated = apr_time_now();
} else if (conf) {
*worker = apr_array_push(conf->workers);
} else {
@@ -2837,93 +2853,31 @@ ap_proxy_hashfunc(const char *str, proxy_hash_t method)
PROXY_DECLARE(apr_status_t) ap_proxy_set_wstatus(const char c, int set, proxy_worker *w)
{
unsigned int *status = &w->s->status;
char bit = toupper(c);
switch (bit) {
case PROXY_WORKER_INITIALIZED_FLAG :
char flag = toupper(c);
wstat *pwt = wstat_tbl;
while (pwt->bit) {
if (flag == pwt->flag) {
if (set)
*status |= PROXY_WORKER_INITIALIZED;
*status |= pwt->bit;
else
*status &= ~PROXY_WORKER_INITIALIZED;
break;
case PROXY_WORKER_IGNORE_ERRORS_FLAG :
if (set)
*status |= PROXY_WORKER_IGNORE_ERRORS;
else
*status &= ~PROXY_WORKER_IGNORE_ERRORS;
break;
case PROXY_WORKER_DRAIN_FLAG :
if (set)
*status |= PROXY_WORKER_DRAIN;
else
*status &= ~PROXY_WORKER_DRAIN;
break;
case PROXY_WORKER_IN_SHUTDOWN_FLAG :
if (set)
*status |= PROXY_WORKER_IN_SHUTDOWN;
else
*status &= ~PROXY_WORKER_IN_SHUTDOWN;
break;
case PROXY_WORKER_DISABLED_FLAG :
if (set)
*status |= PROXY_WORKER_DISABLED;
else
*status &= ~PROXY_WORKER_DISABLED;
break;
case PROXY_WORKER_STOPPED_FLAG :
if (set)
*status |= PROXY_WORKER_STOPPED;
else
*status &= ~PROXY_WORKER_STOPPED;
break;
case PROXY_WORKER_IN_ERROR_FLAG :
if (set)
*status |= PROXY_WORKER_IN_ERROR;
else
*status &= ~PROXY_WORKER_IN_ERROR;
break;
case PROXY_WORKER_HOT_STANDBY_FLAG :
if (set)
*status |= PROXY_WORKER_HOT_STANDBY;
else
*status &= ~PROXY_WORKER_HOT_STANDBY;
break;
case PROXY_WORKER_FREE_FLAG :
if (set)
*status |= PROXY_WORKER_FREE;
else
*status &= ~PROXY_WORKER_FREE;
break;
default:
return APR_EINVAL;
break;
*status &= ~(pwt->bit);
return APR_SUCCESS;
}
pwt++;
}
return APR_SUCCESS;
return APR_EINVAL;
}
PROXY_DECLARE(char *) ap_proxy_parse_wstatus(apr_pool_t *p, proxy_worker *w)
{
char *ret = NULL;
char *ret = "";
unsigned int status = w->s->status;
if (status & PROXY_WORKER_INITIALIZED)
ret = apr_pstrcat(p, "Init ", NULL);
else
ret = apr_pstrcat(p, "!Init ", NULL);
if (status & PROXY_WORKER_IGNORE_ERRORS)
ret = apr_pstrcat(p, ret, "Ign ", NULL);
if (status & PROXY_WORKER_DRAIN)
ret = apr_pstrcat(p, ret, "Drn ", NULL);
if (status & PROXY_WORKER_IN_SHUTDOWN)
ret = apr_pstrcat(p, ret, "Shut ", NULL);
if (status & PROXY_WORKER_DISABLED)
ret = apr_pstrcat(p, ret, "Dis ", NULL);
if (status & PROXY_WORKER_STOPPED)
ret = apr_pstrcat(p, ret, "Stop ", NULL);
if (status & PROXY_WORKER_IN_ERROR)
ret = apr_pstrcat(p, ret, "Err ", NULL);
if (status & PROXY_WORKER_HOT_STANDBY)
ret = apr_pstrcat(p, ret, "Stby ", NULL);
if (status & PROXY_WORKER_FREE)
ret = apr_pstrcat(p, ret, "Free ", NULL);
wstat *pwt = wstat_tbl;
while (pwt->bit) {
if (status & pwt->bit)
ret = apr_pstrcat(p, ret, pwt->name, NULL);
pwt++;
}
if (PROXY_WORKER_IS_USABLE(w))
ret = apr_pstrcat(p, ret, "Ok ", NULL);
return ret;