mturk 2005/02/09 03:46:57
Modified: jk/native/common jk_lb_worker.c
Log:
Use shared memory for worker record data. Now the runtime info
is shared among all child processes.
Revision Changes Path
1.42 +68 -74 jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c
Index: jk_lb_worker.c
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- jk_lb_worker.c 6 Feb 2005 13:30:34 -0000 1.41
+++ jk_lb_worker.c 9 Feb 2005 11:46:57 -0000 1.42
@@ -29,6 +29,7 @@
#include "jk_worker.h"
#include "jk_lb_worker.h"
#include "jk_mt.h"
+#include "jk_shm.h"
/*
* The load balancing code in this
@@ -51,25 +52,13 @@
NULL
};
-/**
- * Worker record should be inside shared
- * memory for correct behavior.
- * Right now it operates on 'equal-load'
- * presumption.
- */
struct worker_record
{
- const char *name;
- const char *domain;
- int lb_factor;
- int lb_value;
- int is_local_worker;
- int is_local_domain;
- int in_error_state;
- int in_recovering;
- time_t error_time;
- jk_worker_t *w;
+ jk_worker_t *w;
+ /* Shared memory worker data */
+ jk_shm_w_rec_t *s;
};
+
typedef struct worker_record worker_record_t;
struct lb_worker
@@ -221,22 +210,22 @@
{
switch (search_id) {
case 1:
- if (strcmp(search_string, wr->name) == 0) {
+ if (strcmp(search_string, wr->s->name) == 0) {
return JK_TRUE;
}
break;
case 2:
- if (strcmp(search_string, wr->domain) == 0) {
+ if (strcmp(search_string, wr->s->domain) == 0) {
return JK_TRUE;
}
break;
case 3:
- if (wr->is_local_worker) {
+ if (wr->s->is_local_worker) {
return JK_TRUE;
}
break;
case 4:
- if (wr->is_local_domain) {
+ if (wr->s->is_local_domain) {
return JK_TRUE;
}
break;
@@ -281,39 +270,40 @@
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"found candidate worker %s (%d) for match with %s
(%s)",
- p->lb_workers[i].name, i, search_type, search_string);
+ p->lb_workers[i].s->name, i, search_type,
search_string);
if (search_id == 1) {
*domain_id = i;
}
- if (!p->lb_workers[i].in_error_state ||
!p->lb_workers[i].in_recovering) {
+ if (!p->lb_workers[i].s->in_error_state ||
!p->lb_workers[i].s->in_recovering) {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"found candidate worker %s (%d) with previous
load %d in search with %s (%s)",
- p->lb_workers[i].name, i,
p->lb_workers[i].lb_value, search_type, search_string);
+ p->lb_workers[i].s->name, i,
p->lb_workers[i].s->lb_value,
+ search_type, search_string);
- if (p->lb_workers[i].in_error_state) {
+ if (p->lb_workers[i].s->in_error_state) {
time_t now = time(0);
- int elapsed = now - p->lb_workers[i].error_time;
+ int elapsed = now - p->lb_workers[i].s->error_time;
if (elapsed <= p->recover_wait_time) {
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"worker candidate %s (%d) is in error
state - will not yet recover (%d < %d)",
- p->lb_workers[i].name, i, elapsed,
p->recover_wait_time);
+ p->lb_workers[i].s->name, i, elapsed,
p->recover_wait_time);
continue;
}
}
if (use_lb_factor) {
- p->lb_workers[i].lb_value += p->lb_workers[i].lb_factor;
- total_factor += p->lb_workers[i].lb_factor;
- if (p->lb_workers[i].lb_value > lb_max || !rc) {
- lb_max = p->lb_workers[i].lb_value;
+ p->lb_workers[i].s->lb_value +=
p->lb_workers[i].s->lb_factor;
+ total_factor += p->lb_workers[i].s->lb_factor;
+ if (p->lb_workers[i].s->lb_value > lb_max || !rc) {
+ lb_max = p->lb_workers[i].s->lb_value;
rc = &(p->lb_workers[i]);
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"new maximal worker %s (%d) with previous
load %d in search with %s (%s)",
- rc->name, i, rc->lb_value, search_type,
search_string);
+ rc->s->name, i, rc->s->lb_value,
search_type, search_string);
}
} else {
rc = &(p->lb_workers[i]);
@@ -323,26 +313,26 @@
else if (JK_IS_DEBUG_LEVEL(l)) {
jk_log(l, JK_LOG_TRACE,
"worker candidate %s (%d) is in error state - already
recovers",
- p->lb_workers[i].name, i);
+ p->lb_workers[i].s->name, i);
}
}
}
if (rc) {
- if (rc->in_error_state) {
+ if (rc->s->in_error_state) {
time_t now = time(0);
- rc->in_recovering = JK_TRUE;
- rc->error_time = now;
+ rc->s->in_recovering = JK_TRUE;
+ rc->s->error_time = now;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"found worker %s is in error state - will recover",
- rc->name);
+ rc->s->name);
}
- rc->lb_value -= total_factor;
+ rc->s->lb_value -= total_factor;
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"found worker %s with new load %d in search with %s (%s)",
- rc->name, rc->lb_value, search_type, search_string);
+ rc->s->name, rc->s->lb_value, search_type, search_string);
JK_LEAVE_CS(&(p->cs), i);
return rc;
}
@@ -394,7 +384,7 @@
}
if (domain_id >= 0 && domain_id < (int)p->num_of_workers) {
- session_domain = p->lb_workers[domain_id].domain;
+ session_domain = p->lb_workers[domain_id].s->domain;
}
else {
session_domain = JK_LB_DEF_DOMAIN_NAME;
@@ -474,22 +464,22 @@
if (rec) {
int is_recoverable = JK_FALSE;
- s->jvm_route = jk_pool_strdup(s->pool, rec->name);
+ s->jvm_route = jk_pool_strdup(s->pool, rec->s->name);
rc = rec->w->get_endpoint(rec->w, &end, l);
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"service worker=%s jvm_route=%s rc=%d",
- rec->name, s->jvm_route, rc);
+ rec->s->name, s->jvm_route, rc);
if (rc && end) {
int src = end->service(end, s, l, &is_recoverable);
end->done(&end, l);
if (src) {
- rec->in_error_state = JK_FALSE;
- rec->in_recovering = JK_FALSE;
- rec->error_time = 0;
+ rec->s->in_error_state = JK_FALSE;
+ rec->s->in_recovering = JK_FALSE;
+ rec->s->error_time = 0;
JK_TRACE_EXIT(l);
return JK_TRUE;
}
@@ -501,9 +491,9 @@
* Time for fault tolerance (if possible)...
*/
- rec->in_error_state = JK_TRUE;
- rec->in_recovering = JK_FALSE;
- rec->error_time = time(0);
+ rec->s->in_error_state = JK_TRUE;
+ rec->s->in_recovering = JK_FALSE;
+ rec->s->error_time = time(0);
if (!is_recoverable) {
/*
@@ -586,45 +576,49 @@
p->lb_workers = jk_pool_alloc(&p->p,
num_of_workers *
sizeof(worker_record_t));
-
+ for (i = 0; i < num_of_workers; i++) {
+ p->lb_workers[i].s = jk_shm_worker_alloc();
+ if (p->lb_workers[i].s == NULL) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
if (!p->lb_workers) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
for (i = 0; i < num_of_workers; i++) {
- p->lb_workers[i].name =
- jk_pool_strdup(&p->p, worker_names[i]);
- p->lb_workers[i].lb_factor =
+ strncpy(p->lb_workers[i].s->name, worker_names[i],
+ JK_SHM_STR_SIZ);
+ p->lb_workers[i].s->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;
- }
- p->lb_workers[i].domain = jk_get_worker_domain(props,
-
worker_names[i],
-
JK_LB_DEF_DOMAIN_NAME);
- if (!p->lb_workers[i].domain) {
- p->lb_workers[i].domain = JK_LB_DEF_DOMAIN_NAME;
+ if (p->lb_workers[i].s->lb_factor < 1) {
+ p->lb_workers[i].s->lb_factor = 1;
}
- p->lb_workers[i].is_local_worker =
+ strncpy(p->lb_workers[i].s->domain,
+ jk_get_worker_domain(props, worker_names[i],
+ JK_LB_DEF_DOMAIN_NAME),
+ JK_SHM_STR_SIZ);
+ p->lb_workers[i].s->is_local_worker =
jk_get_is_local_worker(props, worker_names[i]);
- if (p->lb_workers[i].is_local_worker)
+ if (p->lb_workers[i].s->is_local_worker)
p->in_local_worker_mode = JK_TRUE;
/*
* Allow using lb in fault-tolerant mode.
* A value of 0 means the worker will be used for all
requests without
* sessions
*/
- p->lb_workers[i].lb_value = p->lb_workers[i].lb_factor;
- p->lb_workers[i].in_error_state = JK_FALSE;
- p->lb_workers[i].in_recovering = JK_FALSE;
- if (!wc_create_worker(p->lb_workers[i].name,
+ p->lb_workers[i].s->lb_value = p->lb_workers[i].s->lb_factor;
+ p->lb_workers[i].s->in_error_state = JK_FALSE;
+ p->lb_workers[i].s->in_recovering = JK_FALSE;
+ if (!wc_create_worker(p->lb_workers[i].s->name,
props,
&(p->lb_workers[i].w),
we, l) || !p->lb_workers[i].w) {
break;
}
- else if (p->lb_workers[i].is_local_worker) {
+ else if (p->lb_workers[i].s->is_local_worker) {
/*
* If lb_value is 0 than move it at the beginning of the
list
*/
@@ -648,18 +642,18 @@
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
"Failed to create worker %s",
- p->lb_workers[i].name);
+ p->lb_workers[i].s->name);
}
else {
for (i = 0; i < num_of_local_workers; i++) {
- p->lb_workers[i].is_local_domain=1;
+ p->lb_workers[i].s->is_local_domain=1;
}
for (i = num_of_local_workers; i < num_of_workers; i++) {
- p->lb_workers[i].is_local_domain=0;
+ p->lb_workers[i].s->is_local_domain=0;
for (j = 0; j < num_of_local_workers; j++) {
- if(0 == strcmp(p->lb_workers[i].domain,
p->lb_workers[j].domain)) {
- p->lb_workers[i].is_local_domain=1;
+ if(!strcmp(p->lb_workers[i].s->domain,
p->lb_workers[j].s->domain)) {
+ p->lb_workers[i].s->is_local_domain = 1;
break;
}
}
@@ -669,8 +663,8 @@
for (i = 0; i < num_of_workers; i++) {
jk_log(l, JK_LOG_DEBUG,
"Balanced worker %i has name %s in domain %s
and has local=%d and local_domain=%d",
- i, p->lb_workers[i].name,
p->lb_workers[i].domain,
- p->lb_workers[i].is_local_worker,
p->lb_workers[i].is_local_domain);
+ i, p->lb_workers[i].s->name,
p->lb_workers[i].s->domain,
+ p->lb_workers[i].s->is_local_worker,
p->lb_workers[i].s->is_local_domain);
}
}
if (JK_IS_DEBUG_LEVEL(l)) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]