in native/common/jk_status.c [4332:4496]
static int update_worker(jk_ws_service_t *s,
status_endpoint_t *p,
jk_log_context_t *l)
{
const char *worker;
const char *sub_worker;
status_worker_t *w = p->worker;
jk_worker_t *jw = NULL;
lb_worker_t *lb = NULL;
lb_sub_worker_t *wr = NULL;
ajp_worker_t *aw = NULL;
int rc = JK_TRUE;
int rv;
JK_TRACE_ENTER(l);
if (fetch_worker_and_sub_worker(p, "updating", &worker, &sub_worker, l) == JK_FALSE ||
search_worker(s, p, &jw, worker, l) == JK_FALSE) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
if (jw->type == JK_LB_WORKER_TYPE) {
if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
if (lb->sequence != lb->s->h.sequence)
jk_lb_pull(lb, JK_TRUE, l);
if (!sub_worker || !sub_worker[0]) {
const char *arg;
if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE,
NULL, &arg, l) == JK_TRUE) {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' %s lb worker '%s' with all sub workers",
w->name, "updating", lb->name);
commit_all_members(s, p, jw, arg, l);
}
else {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' %s lb worker '%s'",
w->name, "updating", lb->name);
commit_worker(s, p, jw, l);
}
JK_TRACE_EXIT(l);
return JK_TRUE;
}
else {
unsigned int idx = 0;
unsigned int *wi = NULL;
int is_wildchar = JK_FALSE;
if (strchr(sub_worker, '*') || strchr(sub_worker, '?')) {
/* We have a wildchar matching rule */
wi = &idx;
is_wildchar = JK_TRUE;
}
for (;;) {
if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
wi, l) == JK_FALSE) {
if (!idx) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
else {
/* We have found at least one match previously */
p->msg = "OK";
break;
}
}
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' %s lb worker '%s' sub worker '%s'",
w->name, "updating", lb->name, wr->name);
aw = (ajp_worker_t *)wr->worker->worker_private;
rv = 0;
rc = commit_member(s, p, lb, wr, aw, &rv, l);
if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
aw->addr_sequence = -1;
}
if (rv & JK_STATUS_NEEDS_RESET_LB_VALUES)
reset_lb_values(lb, l);
if (rv & JK_STATUS_NEEDS_UPDATE_MULT)
/* Recalculate the load multiplicators wrt. lb_factor */
update_mult(lb, l);
if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
wr->sequence = -1;
lb->sequence = -1;
jk_lb_push(lb, JK_TRUE, rv & JK_STATUS_NEEDS_UPDATE_MULT ? JK_TRUE: JK_FALSE, l);
}
if (rc == JK_FALSE) {
jk_log(l, JK_LOG_ERROR,
"Status worker '%s' failed updating sub worker '%s' (at least partially).%s",
w->name, aw->name, (is_wildchar == JK_TRUE) ? " Aborting further wildcard updates." : "");
if (!strncmp("OK", p->msg, 3)) {
const char *msg = "Update failed (at least partially) for sub worker '%s'";
size_t size = strlen(msg) + strlen(aw->name) + 1;
p->msg = jk_pool_alloc(s->pool, size);
snprintf(p->msg, size, msg, aw->name);
}
if (is_wildchar == JK_TRUE) {
const char *msg = " Aborting further wildcard updates.";
size_t size = strlen(msg) + strlen(p->msg) + 1;
p->msg = jk_pool_realloc(s->pool, size, p->msg, strlen(p->msg) + 1);
strcat(p->msg, msg);
}
break;
}
if (!wi)
break;
}
JK_TRACE_EXIT(l);
return rc;
}
}
else if (jw->type == JK_AJP13_WORKER_TYPE ||
jw->type == JK_AJP14_WORKER_TYPE) {
ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
if (aw) {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' %s ajp worker '%s'",
w->name, "updating", aw->name);
if (aw->sequence != aw->s->h.sequence)
jk_ajp_pull(aw, JK_TRUE, l);
rv = 0;
rc = commit_member(s, p, NULL, NULL, aw, &rv, l);
if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
aw->addr_sequence = -1;
}
if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
aw->sequence = -1;
jk_ajp_push(aw, JK_TRUE, l);
}
if (rc == JK_FALSE) {
jk_log(l, JK_LOG_ERROR,
"Status worker '%s' failed updating worker '%s' (at least partially).",
w->name, aw->name);
if (!strncmp("OK", p->msg, 3)) {
const char *msg = "Update failed (at least partially) for worker '%s'";
size_t size = strlen(msg) + strlen(aw->name) + 1;
p->msg = jk_pool_alloc(s->pool, size);
snprintf(p->msg, size, msg, aw->name);
}
}
JK_TRACE_EXIT(l);
return rc;
}
else {
jk_log(l, JK_LOG_WARNING,
"Status worker '%s' aw worker is (null)",
w->name);
}
}
else {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' worker type not implemented",
w->name);
}
JK_TRACE_EXIT(l);
return JK_FALSE;
}