in native/common/jk_status.c [3641:3915]
static void commit_all_members(jk_ws_service_t *s,
status_endpoint_t *p,
jk_worker_t *jw,
const char *attribute,
jk_log_context_t *l)
{
const char *arg;
char vname[32];
const char *name = NULL;
lb_worker_t *lb = NULL;
status_worker_t *w = p->worker;
const char *aname;
int i;
int rc = 0;
unsigned int j;
int push_all_members = JK_FALSE;
JK_TRACE_ENTER(l);
if (!attribute) {
jk_log(l, JK_LOG_WARNING,
"Status worker '%s' missing request parameter '%s'",
w->name, JK_STATUS_ARG_ATTRIBUTE);
JK_TRACE_EXIT(l);
return;
}
else {
if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION))
aname=JK_STATUS_ARG_LBM_TEXT_ACTIVATION;
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR))
aname=JK_STATUS_ARG_LBM_TEXT_FACTOR;
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE))
aname=JK_STATUS_ARG_LBM_TEXT_ROUTE;
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT))
aname=JK_STATUS_ARG_LBM_TEXT_REDIRECT;
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN))
aname=JK_STATUS_ARG_LBM_TEXT_DOMAIN;
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE))
aname=JK_STATUS_ARG_LBM_TEXT_DISTANCE;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO))
aname=JK_STATUS_ARG_AJP_TEXT_CACHE_TO;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO))
aname=JK_STATUS_ARG_AJP_TEXT_PING_TO;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO))
aname=JK_STATUS_ARG_AJP_TEXT_CONNECT_TO;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO))
aname=JK_STATUS_ARG_AJP_TEXT_PREPOST_TO;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO))
aname=JK_STATUS_ARG_AJP_TEXT_REPLY_TO;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES))
aname=JK_STATUS_ARG_AJP_TEXT_RETRIES;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT))
aname=JK_STATUS_ARG_AJP_TEXT_RETRY_INT;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT))
aname=JK_STATUS_ARG_AJP_TEXT_CPING_INT;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS))
aname=JK_STATUS_ARG_AJP_TEXT_REC_OPTS;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_BUSY_LIMIT))
aname=JK_STATUS_ARG_AJP_TEXT_BUSY_LIMIT;
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ))
aname=JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ;
else {
jk_log(l, JK_LOG_WARNING,
"Status worker '%s' unknown attribute '%s'",
w->name, attribute);
JK_TRACE_EXIT(l);
return;
}
}
if (jw->type == JK_LB_WORKER_TYPE) {
lb = (lb_worker_t *)jw->worker_private;
name = lb->name;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' committing changes for attribute '%s' [%s] of all members of lb worker '%s'",
w->name, attribute, aname, name);
}
else {
jk_log(l, JK_LOG_WARNING,
"Status worker '%s' worker type not implemented",
w->name);
JK_TRACE_EXIT(l);
return;
}
if (lb) {
for (j = 0; j < lb->num_of_workers; j++) {
int sync_needed = JK_FALSE;
lb_sub_worker_t *wr = &(lb->lb_workers[j]);
jk_worker_t *jw = wr->worker;
ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;;
snprintf(vname, 32-1, "" JK_STATUS_ARG_MULT_VALUE_BASE "%d", j);
if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) {
if (set_int_if_changed(p, wr->name, "lbfactor", vname,
1, INT_MAX, &wr->lb_factor, name, l)) {
rc = 2;
sync_needed = JK_TRUE;
}
}
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) {
if (set_int_if_changed(p, wr->name, "distance", vname,
0, INT_MAX, &wr->distance, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) {
int old = aw->cache_timeout;
if (set_int_if_changed(p, aw->name, "connection_pool_timeout", vname,
0, INT_MAX, &aw->cache_timeout, name, l)) {
sync_needed = JK_TRUE;
if (old == 0) {
unsigned int i;
for (i = 0; i < aw->ep_cache_sz; i++) {
ajp_endpoint_t *ae = (ajp_endpoint_t *) aw->ep_cache[i];
if (ae)
ae->last_access = time(NULL);
}
}
}
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) {
if (set_int_if_changed(p, aw->name, "ping_timeout", vname,
0, INT_MAX, &aw->ping_timeout, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) {
if (set_int_if_changed(p, aw->name, "connect_timeout", vname,
0, INT_MAX, &aw->connect_timeout, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) {
if (set_int_if_changed(p, aw->name, "prepost_timeout", vname,
0, INT_MAX, &aw->prepost_timeout, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) {
if (set_int_if_changed(p, aw->name, "reply_timeout", vname,
0, INT_MAX, &aw->reply_timeout, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) {
if (set_int_if_changed(p, aw->name, "retries", vname,
1, INT_MAX, &aw->retries, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) {
if (set_int_if_changed(p, aw->name, "retry_interval", vname,
1, INT_MAX, &aw->retry_interval, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) {
if (set_int_if_changed(p, aw->name, "connection_ping_interval", vname,
1, INT_MAX, &aw->conn_ping_interval, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) {
if (set_uint_if_changed(p, aw->name, "recovery_options", vname,
0, INT_MAX, 1, &aw->recovery_opts, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_BUSY_LIMIT)) {
if (set_int_if_changed(p, aw->name, "busy_limit", vname,
0, INT_MAX, &aw->busy_limit, name, l))
sync_needed = JK_TRUE;
}
else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) {
if (set_uint_if_changed(p, aw->name, "max_packet_size", vname,
AJP13_DEF_PACKET_SIZE, AJP13_MAX_PACKET_SIZE, AJP13_PACKET_SIZE_ALIGN,
&aw->max_packet_size, name, l)) {
sync_needed = JK_TRUE;
if (aw->max_packet_size > lb->max_packet_size) {
lb->max_packet_size = aw->max_packet_size;
}
}
}
else {
int rv = status_get_string(p, vname, NULL, &arg, l);
if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) {
if (rv == JK_TRUE) {
i = jk_lb_get_activation_code(arg);
if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) {
jk_log(l, JK_LOG_INFO,
"Status worker '%s' changing 'activation' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
w->name, wr->name, name, jk_lb_get_activation(wr, l), jk_lb_get_activation_direct(i, l));
wr->activation = i;
rc = 1;
sync_needed = JK_TRUE;
}
}
}
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) {
if (rv == JK_TRUE) {
int ret = jk_shm_str_init_ne(wr->route, arg, "route", l);
if (ret == -1) {
const char *msg = "Update failed (at least partially): new route '%s' "
"too long for sub worker '%s', see log file for details.";
size_t size = strlen(msg) + strlen(arg) + strlen(wr->name) + 1;
p->msg = jk_pool_alloc(s->pool, size);
snprintf(p->msg, size, msg, arg, aw->name);
rc = JK_FALSE;
}
else if (ret != 0) {
jk_log(l, JK_LOG_INFO,
"Status worker '%s' changing 'route' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
w->name, wr->name, name, wr->route, arg);
sync_needed = JK_TRUE;
if (!wr->domain[0]) {
char * id_domain = strchr(wr->route, '.');
if (id_domain) {
*id_domain = '\0';
strcpy(wr->domain, wr->route);
*id_domain = '.';
}
}
}
}
}
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) {
if (rv == JK_TRUE) {
int ret = jk_shm_str_init_ne(wr->redirect, arg, "redirect", l);
if (ret == -1) {
const char *msg = "Update failed (at least partially): new redirect '%s' "
"too long for sub worker '%s', see log file for details.";
size_t size = strlen(msg) + strlen(arg) + strlen(wr->name) + 1;
p->msg = jk_pool_alloc(s->pool, size);
snprintf(p->msg, size, msg, arg, aw->name);
rc = JK_FALSE;
}
else if (ret != 0) {
jk_log(l, JK_LOG_INFO,
"Status worker '%s' changing 'redirect' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
w->name, wr->name, name, wr->redirect, arg);
sync_needed = JK_TRUE;
}
}
}
else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) {
if (rv == JK_TRUE) {
int ret = jk_shm_str_init_ne(wr->domain, arg, "domain", l);
if (ret == -1) {
const char *msg = "Update failed (at least partially): new domain '%s' "
"too long for sub worker '%s', see log file for details.";
size_t size = strlen(msg) + strlen(arg) + strlen(wr->name) + 1;
p->msg = jk_pool_alloc(s->pool, size);
snprintf(p->msg, size, msg, arg, aw->name);
rc = JK_FALSE;
}
else if (ret != 0) {
jk_log(l, JK_LOG_INFO,
"Status worker '%s' changing 'domain' for sub worker '%s' of lb worker '%s' from '%s' to '%s'",
w->name, wr->name, name, wr->domain, arg);
sync_needed = JK_TRUE;
}
}
}
}
if (sync_needed == JK_TRUE) {
wr->sequence = -1;
if (!rc)
rc = 3;
}
}
if (rc == 1)
reset_lb_values(lb, l);
else if (rc == 2) {
/* Recalculate the load multiplicators wrt. lb_factor */
update_mult(lb, l);
push_all_members = JK_TRUE;
}
if (rc) {
lb->sequence = -1;
jk_lb_push(lb, JK_TRUE, push_all_members, l);
}
}
JK_TRACE_EXIT(l);
}