in native/common/jk_lb_worker.c [1716:1898]
static int JK_METHOD validate(jk_worker_t *pThis,
jk_map_t *props,
jk_worker_env_t *we, jk_log_context_t *l)
{
JK_TRACE_ENTER(l);
if (pThis && pThis->worker_private) {
lb_worker_t *p = pThis->worker_private;
char **worker_names;
unsigned int num_of_workers;
const char *secret;
p->worker.we = we;
p->sticky_session = jk_get_is_sticky_session(props, p->name);
p->sticky_session_force = jk_get_is_sticky_session_force(props, p->name);
secret = jk_get_worker_secret(props, p->name);
if (jk_get_lb_worker_list(props,
p->name,
&worker_names,
&num_of_workers) && num_of_workers) {
unsigned int i = 0;
unsigned int j = 0;
p->lb_workers = jk_pool_alloc(&p->p,
num_of_workers *
sizeof(lb_sub_worker_t));
if (!p->lb_workers) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
memset(p->lb_workers, 0, num_of_workers * sizeof(lb_sub_worker_t));
for (i = 0; i < num_of_workers; i++) {
if (jk_shm_str_init(p->lb_workers[i].name, worker_names[i], "name", l) == JK_FALSE) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
jk_shm_str_copy(p->lb_workers[i].route, p->lb_workers[i].name, l);
p->lb_workers[i].s = jk_shm_alloc_lb_sub_worker(&p->p, p->s->h.id, worker_names[i], l);
if (p->lb_workers[i].s == NULL) {
jk_log(l, JK_LOG_ERROR,
"allocating lb sub worker record from shared memory");
JK_TRACE_EXIT(l);
return JK_FALSE;
}
p->lb_workers[i].i = i;
}
for (i = 0; i < num_of_workers; i++) {
const char *s;
unsigned int ms;
if (p->lb_workers[i].s->h.sequence != 0) {
/* Somebody already setup this worker.
* Just pull the data.
*/
if (JK_IS_DEBUG_LEVEL(l)) {
jk_log(l, JK_LOG_DEBUG,
"Balanced worker %s already configured (sequence=%d)",
p->lb_workers[i].name, p->lb_workers[i].s->h.sequence);
}
if (!wc_create_worker(p->lb_workers[i].name, 0,
props,
&(p->lb_workers[i].worker),
we, l) || !p->lb_workers[i].worker) {
break;
}
jk_lb_pull_worker(p, i, l);
continue;
}
p->lb_workers[i].lb_factor =
jk_get_lb_factor(props, worker_names[i]);
if (p->lb_workers[i].lb_factor < 1) {
p->lb_workers[i].lb_factor = 1;
}
/* Calculate the maximum packet size from all workers
* for the recovery buffer.
*/
ms = jk_get_max_packet_size(props, worker_names[i]);
if (ms > p->max_packet_size)
p->max_packet_size = ms;
p->lb_workers[i].distance =
jk_get_distance(props, worker_names[i]);
if ((s = jk_get_worker_route(props, worker_names[i], NULL))) {
if (jk_shm_str_init(p->lb_workers[i].route, s, "route", l) == JK_FALSE) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
}
if ((s = jk_get_worker_domain(props, worker_names[i], NULL))) {
if (jk_shm_str_init(p->lb_workers[i].domain, s, "domain", l) == JK_FALSE) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
}
if ((s = jk_get_worker_redirect(props, worker_names[i], NULL))) {
if (jk_shm_str_init(p->lb_workers[i].redirect, s, "redirect", l) == JK_FALSE) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
}
p->lb_workers[i].s->lb_value = 0;
p->lb_workers[i].s->state = JK_LB_STATE_IDLE;
p->lb_workers[i].s->first_error_time = 0;
p->lb_workers[i].s->last_error_time = 0;
p->lb_workers[i].s->elected_snapshot = 0;
p->lb_workers[i].s->sessions = 0;
p->lb_workers[i].activation =
jk_get_worker_activation(props, worker_names[i]);
if (!wc_create_worker(p->lb_workers[i].name, 0,
props,
&(p->lb_workers[i].worker),
we, l) || !p->lb_workers[i].worker) {
break;
}
if (secret && (p->lb_workers[i].worker->type == JK_AJP13_WORKER_TYPE ||
p->lb_workers[i].worker->type == JK_AJP14_WORKER_TYPE)) {
ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].worker->worker_private;
if (!aw->secret)
aw->secret = secret;
}
if (p->lb_workers[i].worker->type == JK_AJP13_WORKER_TYPE ||
p->lb_workers[i].worker->type == JK_AJP14_WORKER_TYPE) {
ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].worker->worker_private;
if (aw->port == 0) {
p->lb_workers[i].activation = JK_LB_ACTIVATION_STOPPED;
}
}
}
if (i != num_of_workers) {
jk_log(l, JK_LOG_ERROR,
"Failed creating worker %s",
p->lb_workers[i].name);
close_workers(p, i, l);
}
else {
/* Update domain names if route contains period '.' */
for (i = 0; i < num_of_workers; i++) {
if (!p->lb_workers[i].domain[0]) {
char *id_domain = strchr(p->lb_workers[i].route, '.');
if (id_domain) {
*id_domain = '\0';
strcpy(p->lb_workers[i].domain, p->lb_workers[i].route);
*id_domain = '.';
}
}
if (JK_IS_DEBUG_LEVEL(l)) {
jk_log(l, JK_LOG_DEBUG,
"Balanced worker %d has name %s and route %s in domain %s",
i,
p->lb_workers[i].name,
p->lb_workers[i].route,
p->lb_workers[i].domain);
}
}
p->num_of_workers = num_of_workers;
update_mult(p, l);
for (i = 0; i < num_of_workers; i++) {
for (j = 0; j < i; j++) {
if (strcmp(p->lb_workers[i].route, p->lb_workers[j].route) == 0) {
jk_log(l, JK_LOG_ERROR,
"Balanced workers number %d (%s) and %d (%s) share the same route %s - aborting configuration!",
i,
p->lb_workers[i].name,
j,
p->lb_workers[j].name,
p->lb_workers[i].route);
JK_TRACE_EXIT(l);
return JK_FALSE;
}
}
}
JK_TRACE_EXIT(l);
return JK_TRUE;
}
}
}
JK_LOG_NULL_PARAMS(l);
JK_TRACE_EXIT(l);
return JK_FALSE;
}