in native/common/jk_status.c [3430:3639]
static int commit_member(jk_ws_service_t *s,
status_endpoint_t *p,
lb_worker_t *lb,
lb_sub_worker_t *wr,
ajp_worker_t *aw,
int *side_effect,
jk_log_context_t *l)
{
const char *arg;
const char *lb_name = NULL;
status_worker_t *w = p->worker;
int rc = JK_TRUE;
int rv;
int i;
int old;
int resolve = JK_FALSE;
shm_str host;
int port = 0;
JK_TRACE_ENTER(l);
if (lb) {
lb_name = lb->name;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' committing changes for sub worker '%s' of lb worker '%s'",
w->name, wr->name, lb_name);
}
else {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Status worker '%s' committing changes for ajp worker '%s'",
w->name, aw->name);
}
if (lb) {
if (status_get_string(p, JK_STATUS_ARG_LBM_ACTIVATION, NULL, &arg, l) == 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, lb_name, jk_lb_get_activation(wr, l), jk_lb_get_activation_direct(i, l));
wr->activation = i;
*side_effect |= JK_STATUS_NEEDS_RESET_LB_VALUES | JK_STATUS_NEEDS_PUSH;
}
}
if (set_int_if_changed(p, wr->name, "lbfactor", JK_STATUS_ARG_LBM_FACTOR,
1, INT_MAX, &wr->lb_factor, lb_name, l))
/* Recalculate the load multiplicators wrt. lb_factor */
*side_effect |= JK_STATUS_NEEDS_UPDATE_MULT | JK_STATUS_NEEDS_PUSH;
if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_ROUTE,
NULL, &arg, l)) == 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, lb_name, wr->route, arg);
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (!wr->domain[0]) {
char * id_domain = strchr(wr->route, '.');
if (id_domain) {
*id_domain = '\0';
strcpy(wr->domain, wr->route);
*id_domain = '.';
}
}
}
}
if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_REDIRECT,
NULL, &arg, l)) == 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, lb_name, wr->redirect, arg);
*side_effect |= JK_STATUS_NEEDS_PUSH;
}
}
if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_DOMAIN,
NULL, &arg, l)) == 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, lb_name, wr->domain, arg);
*side_effect |= JK_STATUS_NEEDS_PUSH;
}
}
if (set_int_if_changed(p, wr->name, "distance", JK_STATUS_ARG_LBM_DISTANCE,
0, INT_MAX, &wr->distance, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
}
old = aw->cache_timeout;
if (set_int_if_changed(p, aw->name, "connection_pool_timeout", JK_STATUS_ARG_AJP_CACHE_TO,
0, INT_MAX, &aw->cache_timeout, lb_name, l)) {
*side_effect |= JK_STATUS_NEEDS_PUSH;
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);
}
}
}
port = aw->port;
if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT,
0, INT_MAX, &port, lb_name, l)) {
jk_shm_str_copy(host, aw->host, l);
resolve = JK_TRUE;
}
if ((rv = status_get_string(p, JK_STATUS_ARG_AJP_HOST_STR,
NULL, &arg, l)) == JK_TRUE) {
int ret = jk_shm_str_init_ne(host, arg, "host name", l);
if (ret == -1) {
const char *msg = "Update failed (at least partially): new host name '%s' "
"too long for sub worker '%s', see log file for details.";
size_t size = strlen(msg) + strlen(arg) + strlen(aw->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 'host' for sub worker '%s' from '%s' to '%s'",
w->name, aw->name, aw->host, arg);
resolve = JK_TRUE;
}
}
if (resolve == JK_TRUE) {
jk_sockaddr_t inet_addr;
if (!jk_resolve(host, port, &inet_addr,
aw->worker.we->pool, aw->prefer_ipv6, l)) {
const char *msg = "Update failed (at least partially): could not resolve address '%s:%d' for sub worker '%s'.";
size_t size = strlen(msg) + strlen(host) + strlen(aw->name) + 10 + 1;
p->msg = jk_pool_alloc(s->pool, size);
snprintf(p->msg, size, msg, host, port, aw->name);
jk_log(l, JK_LOG_ERROR,
"Status worker '%s' failed resolving address '%s:%d' for sub worker '%s'.",
w->name, host, port, aw->name);
rc = JK_FALSE;
}
else {
/* This is not atomic and not thread safe */
aw->port = port;
jk_shm_str_copy(aw->host, host, l);
jk_clone_sockaddr(&(aw->worker_inet_addr), &inet_addr);
*side_effect |= JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH;
}
}
if (set_int_if_changed(p, aw->name, "ping_timeout", JK_STATUS_ARG_AJP_PING_TO,
0, INT_MAX, &aw->ping_timeout, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "connect_timeout", JK_STATUS_ARG_AJP_CONNECT_TO,
0, INT_MAX, &aw->connect_timeout, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "prepost_timeout", JK_STATUS_ARG_AJP_PREPOST_TO,
0, INT_MAX, &aw->prepost_timeout, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "reply_timeout", JK_STATUS_ARG_AJP_REPLY_TO,
0, INT_MAX, &aw->reply_timeout, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "retries", JK_STATUS_ARG_AJP_RETRIES,
1, INT_MAX, &aw->retries, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "retry_interval", JK_STATUS_ARG_AJP_RETRY_INT,
1, INT_MAX, &aw->retry_interval, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "connection_ping_interval", JK_STATUS_ARG_AJP_CPING_INT,
1, INT_MAX, &aw->conn_ping_interval, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_uint_if_changed(p, aw->name, "recovery_options", JK_STATUS_ARG_AJP_REC_OPTS,
0, INT_MAX, 1, &aw->recovery_opts, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_int_if_changed(p, aw->name, "busy_limit", JK_STATUS_ARG_AJP_BUSY_LIMIT,
0, INT_MAX, &aw->busy_limit, lb_name, l))
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (set_uint_if_changed(p, aw->name, "max_packet_size", JK_STATUS_ARG_AJP_MAX_PK_SZ,
AJP13_DEF_PACKET_SIZE, AJP13_MAX_PACKET_SIZE, AJP13_PACKET_SIZE_ALIGN,
&aw->max_packet_size, lb_name, l)) {
*side_effect |= JK_STATUS_NEEDS_PUSH;
if (aw->max_packet_size > lb->max_packet_size) {
lb->max_packet_size = aw->max_packet_size;
}
}
return rc;
}