Author: rjung
Date: Wed Jan  9 16:52:57 2008
New Revision: 610623

URL: http://svn.apache.org/viewvc?rev=610623&view=rev
Log:
LB sub member dynamic management part 2:
Use local memory copies of read mostly shm attributes
of lb sub workers in lb and status worker.

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
    tomcat/connectors/trunk/jk/native/common/jk_status.c
    tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml

Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c?rev=610623&r1=610622&r2=610623&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Wed Jan  9 16:52:57 
2008
@@ -40,8 +40,8 @@
  * The load balancing code in this
  */
 
-#define JK_WORKER_USABLE(w)   ((w)->state != JK_LB_STATE_ERROR && (w)->state 
!= JK_LB_STATE_PROBE && (w)->state != JK_LB_STATE_BUSY && (w)->activation != 
JK_LB_ACTIVATION_STOPPED && (w)->activation != JK_LB_ACTIVATION_DISABLED)
-#define JK_WORKER_USABLE_STICKY(w)   ((w)->state != JK_LB_STATE_ERROR && 
(w)->state != JK_LB_STATE_PROBE && (w)->activation != JK_LB_ACTIVATION_STOPPED)
+#define JK_WORKER_USABLE(w)   ((w)->s->state != JK_LB_STATE_ERROR && 
(w)->s->state != JK_LB_STATE_PROBE && (w)->s->state != JK_LB_STATE_BUSY && 
(w)->activation != JK_LB_ACTIVATION_STOPPED && (w)->activation != 
JK_LB_ACTIVATION_DISABLED)
+#define JK_WORKER_USABLE_STICKY(w)   ((w)->s->state != JK_LB_STATE_ERROR && 
(w)->s->state != JK_LB_STATE_PROBE && (w)->activation != 
JK_LB_ACTIVATION_STOPPED)
 
 static const char *lb_locking_type[] = {
     JK_LB_LOCK_TEXT_OPTIMISTIC,
@@ -211,7 +211,7 @@
 /* Return the string representation of the balance worker activation */
 const char *jk_lb_get_activation(worker_record_t *p, jk_logger_t *l)
 {
-    return lb_activation_type[p->s->activation];
+    return lb_activation_type[p->activation];
 }
 
 int jk_lb_get_activation_code(const char *v)
@@ -235,16 +235,16 @@
     jk_uint64_t s = 1;
     JK_TRACE_ENTER(l);
     for (i = 0; i < p->num_of_workers; i++) {
-        s = scm(s, p->lb_workers[i].s->lb_factor);
+        s = scm(s, p->lb_workers[i].lb_factor);
     }
     for (i = 0; i < p->num_of_workers; i++) {
-        p->lb_workers[i].s->lb_mult = s / p->lb_workers[i].s->lb_factor;
+        p->lb_workers[i].lb_mult = s / p->lb_workers[i].lb_factor;
         if (JK_IS_DEBUG_LEVEL(l))
             jk_log(l, JK_LOG_DEBUG,
                    "worker %s gets multiplicity %"
                    JK_UINT64_T_FMT,
-                   p->lb_workers[i].s->name,
-                   p->lb_workers[i].s->lb_mult);
+                   p->lb_workers[i].name,
+                   p->lb_workers[i].lb_mult);
     }
     JK_TRACE_EXIT(l);
 }
@@ -273,7 +273,7 @@
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "syncing mem for lb '%s' from shm",
-               p->s->name);
+               p->name);
     p->sticky_session = p->s->sticky_session;
     p->sticky_session_force = p->s->sticky_session_force;
     p->recover_wait_time = p->s->recover_wait_time;
@@ -289,7 +289,7 @@
             if (JK_IS_DEBUG_LEVEL(l))
                 jk_log(l, JK_LOG_DEBUG,
                        "syncing mem for member '%s' of lb '%s' from shm",
-                       w->s->name, p->s->name);
+                       w->name, p->name);
             strncpy(w->route, w->s->route, JK_SHM_STR_SIZ);
             strncpy(w->domain, w->s->domain, JK_SHM_STR_SIZ);
             strncpy(w->redirect, w->s->redirect, JK_SHM_STR_SIZ);
@@ -314,7 +314,7 @@
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "syncing shm for lb '%s' from mem",
-               p->s->name);
+               p->name);
     p->s->sticky_session = p->sticky_session;
     p->s->sticky_session_force = p->sticky_session_force;
     p->s->recover_wait_time = p->recover_wait_time;
@@ -330,7 +330,7 @@
             if (JK_IS_DEBUG_LEVEL(l))
                 jk_log(l, JK_LOG_DEBUG,
                        "syncing shm for member '%s' of lb '%s' from mem",
-                       w->s->name, p->s->name);
+                       w->name, p->name);
             strncpy(w->s->route, w->route, JK_SHM_STR_SIZ);
             strncpy(w->s->domain, w->domain, JK_SHM_STR_SIZ);
             strncpy(w->s->redirect, w->redirect, JK_SHM_STR_SIZ);
@@ -492,17 +492,17 @@
         w = &p->lb_workers[i];
         if (w->s->state == JK_LB_STATE_ERROR) {
             elapsed = (int)difftime(now, w->s->error_time);
-            if (elapsed <= p->s->recover_wait_time) {
+            if (elapsed <= p->recover_wait_time) {
                 if (JK_IS_DEBUG_LEVEL(l))
                     jk_log(l, JK_LOG_DEBUG,
                            "worker %s will recover in %d seconds",
-                           w->s->name, p->s->recover_wait_time - elapsed);
+                           w->name, p->recover_wait_time - elapsed);
             }
             else {
                 if (JK_IS_DEBUG_LEVEL(l))
                     jk_log(l, JK_LOG_DEBUG,
                            "worker %s is marked for recovery",
-                           w->s->name);
+                           w->name);
                 if (p->lbmethod != JK_LB_METHOD_BUSYNESS)
                     w->s->lb_value = curmax;
                 w->s->reply_timeouts = 0;
@@ -537,7 +537,7 @@
             if (JK_IS_DEBUG_LEVEL(l))
                 jk_log(l, JK_LOG_INFO,
                        "worker %s is marked for recovery",
-                       w->s->name);
+                       w->name);
             w->s->state = JK_LB_STATE_FORCE;
             forced++;
         }
@@ -630,7 +630,7 @@
     unsigned int i;
 
     for (i = 0; i < p->num_of_workers; i++) {
-        if (strcmp(p->lb_workers[i].s->route, name) == 0) {
+        if (strcmp(p->lb_workers[i].route, name) == 0) {
             rc = &p->lb_workers[i];
             break;
         }
@@ -651,19 +651,19 @@
     /* First try to see if we have available candidate */
     for (i = 0; i < p->num_of_workers; i++) {
         /* Skip all workers that are not member of domain */
-        if (strlen(p->lb_workers[i].s->domain) == 0 ||
-            strcmp(p->lb_workers[i].s->domain, domain))
+        if (strlen(p->lb_workers[i].domain) == 0 ||
+            strcmp(p->lb_workers[i].domain, domain))
             continue;
         /* Take into calculation only the workers that are
          * not in error state, stopped, disabled or busy.
          */
-        if (JK_WORKER_USABLE(p->lb_workers[i].s)) {
-            if (!candidate || p->lb_workers[i].s->distance < d ||
+        if (JK_WORKER_USABLE(&p->lb_workers[i])) {
+            if (!candidate || p->lb_workers[i].distance < d ||
                 (p->lb_workers[i].s->lb_value < curmin &&
-                p->lb_workers[i].s->distance == d)) {
+                p->lb_workers[i].distance == d)) {
                 candidate = &p->lb_workers[i];
                 curmin = p->lb_workers[i].s->lb_value;
-                d = p->lb_workers[i].s->distance;
+                d = p->lb_workers[i].distance;
             }
         }
     }
@@ -693,13 +693,13 @@
         /* Take into calculation only the workers that are
          * not in error state, stopped, disabled or busy.
          */
-        if (JK_WORKER_USABLE(p->lb_workers[i].s)) {
-            if (!candidate || p->lb_workers[i].s->distance < d ||
+        if (JK_WORKER_USABLE(&p->lb_workers[i])) {
+            if (!candidate || p->lb_workers[i].distance < d ||
                 (p->lb_workers[i].s->lb_value < curmin &&
-                p->lb_workers[i].s->distance == d)) {
+                p->lb_workers[i].distance == d)) {
                 candidate = &p->lb_workers[i];
                 curmin = p->lb_workers[i].s->lb_value;
-                d = p->lb_workers[i].s->distance;
+                d = p->lb_workers[i].distance;
                 p->next_offset = i + 1;
             }
         }
@@ -722,7 +722,7 @@
         *route_is_domain = JK_TRUE;
     }
     if (candidate) {
-        if (!JK_WORKER_USABLE_STICKY(candidate->s)) {
+        if (!JK_WORKER_USABLE_STICKY(candidate)) {
             /* We have a worker that is error state or stopped.
              * If it has a redirection set use that redirection worker.
              * This enables to safely remove the member from the
@@ -731,15 +731,15 @@
              */
             if (p->sticky_session_force)
                 candidate = NULL;
-            else if (*candidate->s->redirect) {
-                candidate = find_by_session(p, candidate->s->redirect, l);
+            else if (*candidate->redirect) {
+                candidate = find_by_session(p, candidate->redirect, l);
                 *route_is_domain = JK_FALSE;
             }
-            else if (*candidate->s->domain && !uses_domain) {
-                candidate = find_best_bydomain(p, candidate->s->domain, l);
+            else if (*candidate->domain && !uses_domain) {
+                candidate = find_best_bydomain(p, candidate->domain, l);
                 *route_is_domain = JK_TRUE;
             }
-            if (candidate && !JK_WORKER_USABLE_STICKY(candidate->s))
+            if (candidate && !JK_WORKER_USABLE_STICKY(candidate))
                 candidate = NULL;
         }
     }
@@ -755,8 +755,8 @@
     const char *redirect = NULL;
 
     for (i = 0; i < p->num_of_workers; i++) {
-        if (strlen(p->lb_workers[i].s->redirect)) {
-            redirect = p->lb_workers[i].s->redirect;
+        if (strlen(p->lb_workers[i].redirect)) {
+            redirect = p->lb_workers[i].redirect;
             break;
         }
     }
@@ -791,8 +791,8 @@
         /* No need to find the best worker
          * if there is a single one
          */
-        if (JK_WORKER_USABLE_STICKY(p->lb_workers[0].s)) {
-            if (p->lb_workers[0].s->activation != JK_LB_ACTIVATION_DISABLED) {
+        if (JK_WORKER_USABLE_STICKY(&p->lb_workers[0])) {
+            if (p->lb_workers[0].activation != JK_LB_ACTIVATION_DISABLED) {
                 JK_TRACE_EXIT(l);
                 return p->lb_workers;
             }
@@ -843,7 +843,7 @@
                     if (JK_IS_DEBUG_LEVEL(l))
                         jk_log(l, JK_LOG_DEBUG,
                                "found worker %s (%s) for route %s and partial 
sessionid %s",
-                               rc->s->name, rc->s->route, session_route, 
sessionid);
+                               rc->name, rc->route, session_route, sessionid);
                     JK_TRACE_EXIT(l);
                     return rc;
                 }
@@ -874,7 +874,7 @@
     if (rc && JK_IS_DEBUG_LEVEL(l)) {
         jk_log(l, JK_LOG_DEBUG,
                "found best worker %s (%s) using method '%s'",
-               rc->s->name, rc->s->route, jk_lb_get_method(p, l));
+               rc->name, rc->route, jk_lb_get_method(p, l));
     }
     JK_TRACE_EXIT(l);
     return rc;
@@ -889,7 +889,7 @@
     char *buf = jk_pool_alloc(s->pool, sizeof(char *) * JK_LB_NOTES_COUNT * 
JK_LB_UINT64_STR_SZ);
     if (log_values && buf) {
         /* JK_NOTE_LB_FIRST/LAST_NAME */
-        log_values[0] = w->s->name;
+        log_values[0] = w->name;
         snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, 
w->s->lb_value);
         /* JK_NOTE_LB_FIRST/LAST_VALUE */
         log_values[1] = buf;
@@ -1002,15 +1002,15 @@
             int retry = 0;
             int retry_wait = JK_LB_MIN_RETRY_WAIT;
             if (route_is_domain == JK_FALSE)
-                s->route = rec->s->route;
+                s->route = rec->route;
             else
-                s->route = rec->s->domain;
+                s->route = rec->domain;
             prec = rec;
 
             if (JK_IS_DEBUG_LEVEL(l))
                 jk_log(l, JK_LOG_DEBUG,
                        "service worker=%s route=%s",
-                       rec->s->name, s->route);
+                       rec->name, s->route);
 
             if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
                 jk_shm_lock();
@@ -1051,7 +1051,7 @@
                     jk_shm_unlock();
                 jk_log(l, JK_LOG_INFO,
                        "could not get free endpoint for worker %s (%d 
retries)",
-                       rec->s->name, retry);
+                       rec->name, retry);
             }
             else {
                 int service_stat = JK_UNSET;
@@ -1077,7 +1077,7 @@
                      (p->worker->lbmethod == JK_LB_METHOD_BUSYNESS) ||
                      (p->worker->lbmethod == JK_LB_METHOD_SESSIONS &&
                       !sessionid) )
-                    rec->s->lb_value += rec->s->lb_mult;
+                    rec->s->lb_value += rec->lb_mult;
                 if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
                     jk_shm_unlock();
 
@@ -1095,11 +1095,11 @@
                 rec->s->readed += rd;
                 rec->s->transferred += wr;
                 if (p->worker->lbmethod == JK_LB_METHOD_TRAFFIC) {
-                    rec->s->lb_value += (rd+wr)*rec->s->lb_mult;
+                    rec->s->lb_value += (rd+wr)*rec->lb_mult;
                 }
                 else if (p->worker->lbmethod == JK_LB_METHOD_BUSYNESS) {
-                    if (rec->s->lb_value >= rec->s->lb_mult) {
-                        rec->s->lb_value -= rec->s->lb_mult;
+                    if (rec->s->lb_value >= rec->lb_mult) {
+                        rec->s->lb_value -= rec->lb_mult;
                     }
                     else {
                         rec->s->lb_value = 0;
@@ -1111,9 +1111,9 @@
                                    JK_UINT64_T_FMT
                                    ") ",
                                    "- correcting to 0",
-                                   rec->s->name,
+                                   rec->name,
                                    rec->s->lb_value,
-                                   rec->s->lb_mult);
+                                   rec->lb_mult);
                         }
                     }
                 }
@@ -1181,7 +1181,7 @@
                 }
                 else if (service_stat == JK_REPLY_TIMEOUT) {
                     rec->s->reply_timeouts++;
-                    if (rec->s->reply_timeouts > 
(unsigned)p->worker->s->max_reply_timeouts) {
+                    if (rec->s->reply_timeouts > 
(unsigned)p->worker->max_reply_timeouts) {
                         /*
                         * Service failed - to many reply timeouts
                         * Take this node out of service.
@@ -1216,7 +1216,7 @@
                 if (rec->s->state == JK_LB_STATE_ERROR)
                     jk_log(l, JK_LOG_INFO,
                            "service failed, worker %s is in error state",
-                           rec->s->name);
+                           rec->name);
                 if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
                     jk_shm_unlock();
             }
@@ -1333,12 +1333,12 @@
         unsigned int num_of_workers;
         const char *secret;
 
-        p->sticky_session = jk_get_is_sticky_session(props, p->s->name);
-        p->sticky_session_force = jk_get_is_sticky_session_force(props, 
p->s->name);
-        secret = jk_get_worker_secret(props, p->s->name);
+        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->s->name,
+                                  p->name,
                                   &worker_names,
                                   &num_of_workers) && num_of_workers) {
             unsigned int i = 0;
@@ -1365,12 +1365,16 @@
             for (i = 0; i < num_of_workers; i++) {
                 const char *s;
                 unsigned int ms;
+                strncpy(p->lb_workers[i].name, worker_names[i],
+                        JK_SHM_STR_SIZ);
                 strncpy(p->lb_workers[i].s->name, worker_names[i],
                         JK_SHM_STR_SIZ);
-                p->lb_workers[i].s->lb_factor =
+                p->lb_workers[i].sequence = 0;
+                p->lb_workers[i].s->sequence = 0;
+                p->lb_workers[i].lb_factor =
                     jk_get_lb_factor(props, worker_names[i]);
-                if (p->lb_workers[i].s->lb_factor < 1) {
-                    p->lb_workers[i].s->lb_factor = 1;
+                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.
@@ -1378,23 +1382,23 @@
                 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].s->distance =
+                p->lb_workers[i].distance =
                     jk_get_distance(props, worker_names[i]);
                 if ((s = jk_get_worker_route(props, worker_names[i], NULL)))
-                    strncpy(p->lb_workers[i].s->route, s, JK_SHM_STR_SIZ);
+                    strncpy(p->lb_workers[i].route, s, JK_SHM_STR_SIZ);
                 else
-                    strncpy(p->lb_workers[i].s->route, worker_names[i], 
JK_SHM_STR_SIZ);
+                    strncpy(p->lb_workers[i].route, worker_names[i], 
JK_SHM_STR_SIZ);
                 if ((s = jk_get_worker_domain(props, worker_names[i], NULL)))
-                    strncpy(p->lb_workers[i].s->domain, s, JK_SHM_STR_SIZ);
+                    strncpy(p->lb_workers[i].domain, s, JK_SHM_STR_SIZ);
                 if ((s = jk_get_worker_redirect(props, worker_names[i], NULL)))
-                    strncpy(p->lb_workers[i].s->redirect, s, JK_SHM_STR_SIZ);
+                    strncpy(p->lb_workers[i].redirect, s, JK_SHM_STR_SIZ);
 
                 p->lb_workers[i].s->lb_value = 0;
                 p->lb_workers[i].s->state = JK_LB_STATE_IDLE;
                 p->lb_workers[i].s->error_time = 0;
-                p->lb_workers[i].s->activation =
+                p->lb_workers[i].activation =
                     jk_get_worker_activation(props, worker_names[i]);
-                if (!wc_create_worker(p->lb_workers[i].s->name, 0,
+                if (!wc_create_worker(p->lb_workers[i].name, 0,
                                       props,
                                       &(p->lb_workers[i].w),
                                       we, l) || !p->lb_workers[i].w) {
@@ -1411,17 +1415,17 @@
             if (i != num_of_workers) {
                 jk_log(l, JK_LOG_ERROR,
                        "Failed creating worker %s",
-                       p->lb_workers[i].s->name);
+                       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].s->domain[0]) {
-                        char * id_domain = strchr(p->lb_workers[i].s->route, 
'.');
+                    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].s->domain, 
p->lb_workers[i].s->route);
+                            strcpy(p->lb_workers[i].domain, 
p->lb_workers[i].route);
                             *id_domain = '.';
                         }
                     }
@@ -1429,23 +1433,23 @@
                         jk_log(l, JK_LOG_DEBUG,
                                "Balanced worker %i has name %s and route %s in 
domain %s",
                                i,
-                               p->lb_workers[i].s->name,
-                               p->lb_workers[i].s->route,
-                               p->lb_workers[i].s->domain);
+                               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].s->route, 
p->lb_workers[j].s->route) == 0) {
+                        if (strcmp(p->lb_workers[i].route, 
p->lb_workers[j].route) == 0) {
                             jk_log(l, JK_LOG_ERROR,
                                    "Balanced workers number %i (%s) and %i 
(%s) share the same route %s - aborting configuration!",
                                    i,
-                                   p->lb_workers[i].s->name,
+                                   p->lb_workers[i].name,
                                    j,
-                                   p->lb_workers[j].s->name,
-                                   p->lb_workers[i].s->route);
+                                   p->lb_workers[j].name,
+                                   p->lb_workers[i].route);
                             JK_TRACE_EXIT(l);
                             return JK_FALSE;
                         }
@@ -1471,21 +1475,21 @@
     lb_worker_t *p = (lb_worker_t *)pThis->worker_private;
     JK_TRACE_ENTER(log);
 
-    p->retries = jk_get_worker_retries(props, p->s->name,
+    p->retries = jk_get_worker_retries(props, p->name,
                                        JK_RETRIES);
-    p->recover_wait_time = jk_get_worker_recover_timeout(props, p->s->name,
+    p->recover_wait_time = jk_get_worker_recover_timeout(props, p->name,
                                                             
WAIT_BEFORE_RECOVER);
     if (p->recover_wait_time < 1)
         p->recover_wait_time = 1;
-    p->max_reply_timeouts = jk_get_worker_max_reply_timeouts(props, p->s->name,
+    p->max_reply_timeouts = jk_get_worker_max_reply_timeouts(props, p->name,
                                                              0);
     p->maintain_time = jk_get_worker_maintain_time(props);
     if(p->maintain_time < 0)
         p->maintain_time = 0;
     p->s->last_maintain_time = time(NULL);
 
-    p->lbmethod = jk_get_lb_method(props, p->s->name);
-    p->lblock   = jk_get_lb_lock(props, p->s->name);
+    p->lbmethod = jk_get_lb_method(props, p->name);
+    p->lblock   = jk_get_lb_lock(props, p->name);
 
     JK_INIT_CS(&(p->cs), i);
     if (i == JK_FALSE) {
@@ -1571,6 +1575,7 @@
             JK_TRACE_EXIT(l);
             return 0;
         }
+        strncpy(private_data->name, name, JK_SHM_STR_SIZ);
         strncpy(private_data->s->name, name, JK_SHM_STR_SIZ);
         private_data->lb_workers = NULL;
         private_data->num_of_workers = 0;
@@ -1583,6 +1588,7 @@
         private_data->recover_wait_time = WAIT_BEFORE_RECOVER;
         private_data->max_reply_timeouts = 0;
         private_data->sequence = 0;
+        private_data->s->sequence = 0;
         private_data->next_offset = 0;
         *w = &private_data->worker;
         JK_TRACE_EXIT(l);

Modified: tomcat/connectors/trunk/jk/native/common/jk_status.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_status.c?rev=610623&r1=610622&r2=610623&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_status.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_status.c Wed Jan  9 16:52:57 
2008
@@ -583,7 +583,7 @@
                        jk_logger_t *l)
 {
     jk_uint32_t mask = 0;
-    int activation = wr->s->activation;
+    int activation = wr->activation;
     int state = wr->s->state;
     jk_uint32_t good = w->good_mask;
     jk_uint32_t bad = w->bad_mask;
@@ -1224,7 +1224,7 @@
     }
     for (i = 0; i < (int)lb->num_of_workers; i++) {
         wr = &(lb->lb_workers[i]);
-        if (strcmp(sub_worker, wr->s->name) == 0)
+        if (strcmp(sub_worker, wr->name) == 0)
             break;
     }
     *wrp = wr;
@@ -1457,7 +1457,7 @@
     int ms_min;
     int ms_max;
     unsigned int j;
-    const char *name = lb->s->name;
+    const char *name = lb->name;
     status_worker_t *w = p->worker;
 
     JK_TRACE_ENTER(l);
@@ -1661,28 +1661,28 @@
                 if (!read_only) {
                     jk_puts(s, "[");
                     status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, 
JK_STATUS_MIME_UNKNOWN,
-                                     name, wr->s->name, 0, 0, "", l);
+                                     name, wr->name, 0, 0, "", l);
                     jk_puts(s, "|");
                     status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, 
JK_STATUS_MIME_UNKNOWN,
-                                     name, wr->s->name, 0, 0, "", l);
+                                     name, wr->name, 0, 0, "", l);
                     if (wr->s->state == JK_LB_STATE_ERROR) {
                         jk_puts(s, "|");
                         status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, 
JK_STATUS_MIME_UNKNOWN,
-                                         name, wr->s->name, 0, 0, "", l);
+                                         name, wr->name, 0, 0, "", l);
                     }
                     jk_puts(s, "]");
                 }
                 jk_puts(s, "&nbsp;</td>");
                 jk_printf(s, JK_STATUS_SHOW_MEMBER_ROW,
-                          wr->s->name,
+                          wr->name,
                           status_worker_type(wr->w->type),
                           a->host, a->port,
                           jk_dump_hinfo(&a->worker_inet_addr, buf),
                           jk_lb_get_activation(wr, l),
                           jk_lb_get_state(wr, l),
-                          wr->s->distance,
-                          wr->s->lb_factor,
-                          wr->s->lb_mult,
+                          wr->distance,
+                          wr->lb_factor,
+                          wr->lb_mult,
                           wr->s->lb_value,
                           wr->s->elected,
                           wr->s->errors,
@@ -1692,9 +1692,9 @@
                           status_strfsize(wr->s->readed, buf_rd),
                           wr->s->busy,
                           wr->s->max_busy,
-                          wr->s->route,
-                          wr->s->redirect ? (*wr->s->redirect ? 
wr->s->redirect : "&nbsp;") : "&nbsp",
-                          wr->s->domain ? (*wr->s->domain ? wr->s->domain : 
"&nbsp;") : "&nbsp",
+                          wr->route,
+                          wr->redirect ? (*wr->redirect ? wr->redirect : 
"&nbsp;") : "&nbsp",
+                          wr->domain ? (*wr->domain ? wr->domain : "&nbsp;") : 
"&nbsp",
                           rs_min,
                           rs_max);
 
@@ -1702,19 +1702,19 @@
             else if (mime == JK_STATUS_MIME_XML) {
 
                 jk_print_xml_start_elt(s, w, 6, 0, "member");
-                jk_print_xml_att_string(s, 8, "name", wr->s->name);
+                jk_print_xml_att_string(s, 8, "name", wr->name);
                 jk_print_xml_att_string(s, 8, "type", 
status_worker_type(wr->w->type));
                 jk_print_xml_att_string(s, 8, "host", a->host);
                 jk_print_xml_att_int(s, 8, "port", a->port);
                 jk_print_xml_att_string(s, 8, "address", 
jk_dump_hinfo(&a->worker_inet_addr, buf));
                 jk_print_xml_att_string(s, 8, "activation", 
jk_lb_get_activation(wr, l));
-                jk_print_xml_att_int(s, 8, "lbfactor", wr->s->lb_factor);
-                jk_print_xml_att_string(s, 8, "route", wr->s->route);
-                jk_print_xml_att_string(s, 8, "redirect", wr->s->redirect);
-                jk_print_xml_att_string(s, 8, "domain", wr->s->domain);
-                jk_print_xml_att_int(s, 8, "distance", wr->s->distance);
+                jk_print_xml_att_int(s, 8, "lbfactor", wr->lb_factor);
+                jk_print_xml_att_string(s, 8, "route", wr->route);
+                jk_print_xml_att_string(s, 8, "redirect", wr->redirect);
+                jk_print_xml_att_string(s, 8, "domain", wr->domain);
+                jk_print_xml_att_int(s, 8, "distance", wr->distance);
                 jk_print_xml_att_string(s, 8, "state", jk_lb_get_state(wr, l));
-                jk_print_xml_att_uint64(s, 8, "lbmult", wr->s->lb_mult);
+                jk_print_xml_att_uint64(s, 8, "lbmult", wr->lb_mult);
                 jk_print_xml_att_uint64(s, 8, "lbvalue", wr->s->lb_value);
                 jk_print_xml_att_uint64(s, 8, "elected", wr->s->elected);
                 jk_print_xml_att_uint32(s, 8, "errors", wr->s->errors);
@@ -1733,19 +1733,19 @@
             else if (mime == JK_STATUS_MIME_TXT) {
 
                 jk_puts(s, "Member:");
-                jk_printf(s, " name=%s", wr->s->name);
+                jk_printf(s, " name=%s", wr->name);
                 jk_printf(s, " type=%s", status_worker_type(wr->w->type));
                 jk_printf(s, " host=%s", a->host);
                 jk_printf(s, " port=%d", a->port);
                 jk_printf(s, " address=%s", 
jk_dump_hinfo(&a->worker_inet_addr, buf));
                 jk_printf(s, " activation=%s", jk_lb_get_activation(wr, l));
-                jk_printf(s, " lbfactor=%d", wr->s->lb_factor);
-                jk_printf(s, " route=\"%s\"", wr->s->route ? wr->s->route : 
"");
-                jk_printf(s, " redirect=\"%s\"", wr->s->redirect ? 
wr->s->redirect : "");
-                jk_printf(s, " domain=\"%s\"", wr->s->domain ? wr->s->domain : 
"");
-                jk_printf(s, " distance=%d", wr->s->distance);
+                jk_printf(s, " lbfactor=%d", wr->lb_factor);
+                jk_printf(s, " route=\"%s\"", wr->route ? wr->route : "");
+                jk_printf(s, " redirect=\"%s\"", wr->redirect ? wr->redirect : 
"");
+                jk_printf(s, " domain=\"%s\"", wr->domain ? wr->domain : "");
+                jk_printf(s, " distance=%d", wr->distance);
                 jk_printf(s, " state=%s", jk_lb_get_state(wr, l));
-                jk_printf(s, " lbmult=%" JK_UINT64_T_FMT, wr->s->lb_mult);
+                jk_printf(s, " lbmult=%" JK_UINT64_T_FMT, wr->lb_mult);
                 jk_printf(s, " lbvalue=%" JK_UINT64_T_FMT, wr->s->lb_value);
                 jk_printf(s, " elected=%" JK_UINT64_T_FMT, wr->s->elected);
                 jk_printf(s, " errors=%" JK_UINT32_T_FMT, wr->s->errors);
@@ -1762,30 +1762,30 @@
             }
             else if (mime == JK_STATUS_MIME_PROP) {
 
-                jk_print_prop_att_string(s, w, name, "balance_workers", 
wr->s->name);
-                jk_print_prop_att_string(s, w, wr->s->name, "type", 
status_worker_type(wr->w->type));
-                jk_print_prop_att_string(s, w, wr->s->name, "host", a->host);
-                jk_print_prop_att_int(s, w, wr->s->name, "port", a->port);
-                jk_print_prop_att_string(s, w, wr->s->name, "address", 
jk_dump_hinfo(&a->worker_inet_addr, buf));
-                jk_print_prop_att_string(s, w, wr->s->name, "activation", 
jk_lb_get_activation(wr, l));
-                jk_print_prop_att_int(s, w, wr->s->name, "lbfactor", 
wr->s->lb_factor);
-                jk_print_prop_att_string(s, w, wr->s->name, "route", 
wr->s->route);
-                jk_print_prop_att_string(s, w, wr->s->name, "redirect", 
wr->s->redirect);
-                jk_print_prop_att_string(s, w, wr->s->name, "domain", 
wr->s->domain);
-                jk_print_prop_att_int(s, w, wr->s->name, "distance", 
wr->s->distance);
-                jk_print_prop_att_string(s, w, wr->s->name, "state", 
jk_lb_get_state(wr, l));
-                jk_print_prop_att_uint64(s, w, wr->s->name, "lbmult", 
wr->s->lb_mult);
-                jk_print_prop_att_uint64(s, w, wr->s->name, "lbvalue", 
wr->s->lb_value);
-                jk_print_prop_att_uint64(s, w, wr->s->name, "elected", 
wr->s->elected);
-                jk_print_prop_att_uint32(s, w, wr->s->name, "errors", 
wr->s->errors);
-                jk_print_prop_att_uint32(s, w, wr->s->name, "client_errors", 
wr->s->client_errors);
-                jk_print_prop_att_uint32(s, w, wr->s->name, "reply_timeouts", 
wr->s->reply_timeouts);
-                jk_print_prop_att_uint64(s, w, wr->s->name, "transferred", 
wr->s->transferred);
-                jk_print_prop_att_uint64(s, w, wr->s->name, "read", 
wr->s->readed);
-                jk_print_prop_att_int(s, w, wr->s->name, "busy", wr->s->busy);
-                jk_print_prop_att_int(s, w, wr->s->name, "max_busy", 
wr->s->max_busy);
-                jk_print_prop_att_int(s, w, wr->s->name, 
"time_to_recover_min", rs_min);
-                jk_print_prop_att_int(s, w, wr->s->name, 
"time_to_recover_max", rs_max);
+                jk_print_prop_att_string(s, w, name, "balance_workers", 
wr->name);
+                jk_print_prop_att_string(s, w, wr->name, "type", 
status_worker_type(wr->w->type));
+                jk_print_prop_att_string(s, w, wr->name, "host", a->host);
+                jk_print_prop_att_int(s, w, wr->name, "port", a->port);
+                jk_print_prop_att_string(s, w, wr->name, "address", 
jk_dump_hinfo(&a->worker_inet_addr, buf));
+                jk_print_prop_att_string(s, w, wr->name, "activation", 
jk_lb_get_activation(wr, l));
+                jk_print_prop_att_int(s, w, wr->name, "lbfactor", 
wr->lb_factor);
+                jk_print_prop_att_string(s, w, wr->name, "route", wr->route);
+                jk_print_prop_att_string(s, w, wr->name, "redirect", 
wr->redirect);
+                jk_print_prop_att_string(s, w, wr->name, "domain", wr->domain);
+                jk_print_prop_att_int(s, w, wr->name, "distance", 
wr->distance);
+                jk_print_prop_att_string(s, w, wr->name, "state", 
jk_lb_get_state(wr, l));
+                jk_print_prop_att_uint64(s, w, wr->name, "lbmult", 
wr->lb_mult);
+                jk_print_prop_att_uint64(s, w, wr->name, "lbvalue", 
wr->s->lb_value);
+                jk_print_prop_att_uint64(s, w, wr->name, "elected", 
wr->s->elected);
+                jk_print_prop_att_uint32(s, w, wr->name, "errors", 
wr->s->errors);
+                jk_print_prop_att_uint32(s, w, wr->name, "client_errors", 
wr->s->client_errors);
+                jk_print_prop_att_uint32(s, w, wr->name, "reply_timeouts", 
wr->s->reply_timeouts);
+                jk_print_prop_att_uint64(s, w, wr->name, "transferred", 
wr->s->transferred);
+                jk_print_prop_att_uint64(s, w, wr->name, "read", 
wr->s->readed);
+                jk_print_prop_att_int(s, w, wr->name, "busy", wr->s->busy);
+                jk_print_prop_att_int(s, w, wr->name, "max_busy", 
wr->s->max_busy);
+                jk_print_prop_att_int(s, w, wr->name, "time_to_recover_min", 
rs_min);
+                jk_print_prop_att_int(s, w, wr->name, "time_to_recover_max", 
rs_max);
 
             }
         }
@@ -1948,7 +1948,7 @@
             if (JK_IS_DEBUG_LEVEL(l))
                 jk_log(l, JK_LOG_DEBUG,
                        "Status worker '%s' %s lb worker '%s'",
-                       w->name, "displaying", lb->s->name);
+                       w->name, "displaying", lb->name);
             display_worker_lb(s, p, lb, l);
         }
         else {
@@ -1995,7 +1995,7 @@
     JK_TRACE_ENTER(l);
     if (jw->type == JK_LB_WORKER_TYPE) {
         lb = (lb_worker_t *)jw->worker_private;
-        name = lb->s->name;
+        name = lb->name;
         if (JK_IS_DEBUG_LEVEL(l))
             jk_log(l, JK_LOG_DEBUG,
                    "Status worker '%s' producing edit form for lb worker '%s'",
@@ -2109,10 +2109,10 @@
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "Status worker '%s' producing edit form for sub worker '%s' of 
lb worker '%s'",
-               w->name, wr->s->name, lb_name);
+               w->name, wr->name, lb_name);
 
     jk_putv(s, "<hr/><h3>Edit worker settings for ",
-            wr->s->name, "</h3>\n", NULL);
+            wr->name, "</h3>\n", NULL);
     status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, l);
 
     jk_puts(s, "<table>\n");
@@ -2121,43 +2121,43 @@
     jk_putv(s, "<tr><td>&nbsp;&nbsp;Active</td><td><input name=\"",
             JK_STATUS_ARG_LBM_ACTIVATION, "\" type=\"radio\"", NULL);
     jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_ACTIVE);
-    if (wr->s->activation == JK_LB_ACTIVATION_ACTIVE)
+    if (wr->activation == JK_LB_ACTIVATION_ACTIVE)
         jk_puts(s, " checked=\"checked\"");
     jk_puts(s, "/></td></tr>\n");
     jk_putv(s, "<tr><td>&nbsp;&nbsp;Disabled</td><td><input name=\"",
             JK_STATUS_ARG_LBM_ACTIVATION, "\" type=\"radio\"", NULL);
     jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_DISABLED);
-    if (wr->s->activation == JK_LB_ACTIVATION_DISABLED)
+    if (wr->activation == JK_LB_ACTIVATION_DISABLED)
         jk_puts(s, " checked=\"checked\"");
     jk_puts(s, "/></td></tr>\n");
     jk_putv(s, "<tr><td>&nbsp;&nbsp;Stopped</td><td><input name=\"",
             JK_STATUS_ARG_LBM_ACTIVATION, "\" type=\"radio\"", NULL);
     jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_STOPPED);
-    if (wr->s->activation == JK_LB_ACTIVATION_STOPPED)
+    if (wr->activation == JK_LB_ACTIVATION_STOPPED)
         jk_puts(s, " checked=\"checked\"");
     jk_puts(s, "/></td></tr>\n");
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_FACTOR,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_LBM_FACTOR, "\" type=\"text\" ", NULL);
-    jk_printf(s, "value=\"%d\"/></td></tr>\n", wr->s->lb_factor);
+    jk_printf(s, "value=\"%d\"/></td></tr>\n", wr->lb_factor);
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_ROUTE,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_LBM_ROUTE, "\" type=\"text\" ", NULL);
-    jk_printf(s, "value=\"%s\"/></td></tr>\n", wr->s->route);
+    jk_printf(s, "value=\"%s\"/></td></tr>\n", wr->route);
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_REDIRECT,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_LBM_REDIRECT, "\" type=\"text\" ", NULL);
-    jk_putv(s, "value=\"", wr->s->redirect, NULL);
+    jk_putv(s, "value=\"", wr->redirect, NULL);
     jk_puts(s, "\"/></td></tr>\n");
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_DOMAIN,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_LBM_DOMAIN, "\" type=\"text\" ", NULL);
-    jk_putv(s, "value=\"", wr->s->domain, NULL);
+    jk_putv(s, "value=\"", wr->domain, NULL);
     jk_puts(s, "\"/></td></tr>\n");
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_DISTANCE,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_LBM_DISTANCE, "\" type=\"text\" ", NULL);
-    jk_printf(s, "value=\"%d\"/></td></tr>\n", wr->s->distance);
+    jk_printf(s, "value=\"%d\"/></td></tr>\n", wr->distance);
     jk_puts(s, "</table>\n");
     jk_puts(s, "<br/><input type=\"submit\" value=\"Update 
Worker\"/>\n</form>\n");
     JK_TRACE_EXIT(l);
@@ -2206,7 +2206,7 @@
     }
     if (jw->type == JK_LB_WORKER_TYPE) {
         lb = (lb_worker_t *)jw->worker_private;
-        name = lb->s->name;
+        name = lb->name;
         if (JK_IS_DEBUG_LEVEL(l))
             jk_log(l, JK_LOG_DEBUG,
                    "Status worker '%s' producing edit form for attribute '%s' 
[%s] of all members of lb worker '%s'",
@@ -2234,46 +2234,46 @@
         for (i = 0; i < lb->num_of_workers; i++) {
             worker_record_t *wr = &(lb->lb_workers[i]);
 
-            jk_putv(s, "<tr><td>", wr->s->name, "</td><td>\n", NULL);
+            jk_putv(s, "<tr><td>", wr->name, "</td><td>\n", NULL);
 
             if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) {
 
                 jk_printf(s, "Active:&nbsp;<input name=\"" 
JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"radio\"", i);
                 jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_ACTIVE);
-                if (wr->s->activation == JK_LB_ACTIVATION_ACTIVE)
+                if (wr->activation == JK_LB_ACTIVATION_ACTIVE)
                     jk_puts(s, " checked=\"checked\"");
                 jk_puts(s, "/>&nbsp;|&nbsp;\n");
                 jk_printf(s, "Disabled:&nbsp;<input name=\"" 
JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"radio\"", i);
                 jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_DISABLED);
-                if (wr->s->activation == JK_LB_ACTIVATION_DISABLED)
+                if (wr->activation == JK_LB_ACTIVATION_DISABLED)
                     jk_puts(s, " checked=\"checked\"");
                 jk_puts(s, "/>&nbsp;|&nbsp;\n");
                 jk_printf(s, "Stopped:&nbsp;<input name=\"" 
JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"radio\"", i);
                 jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_STOPPED);
-                if (wr->s->activation == JK_LB_ACTIVATION_STOPPED)
+                if (wr->activation == JK_LB_ACTIVATION_STOPPED)
                     jk_puts(s, " checked=\"checked\"");
                 jk_puts(s, "/>\n");
 
             }
             else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) {
                 jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE 
"%d\" type=\"text\"", i);
-                jk_printf(s, "value=\"%d\"/>\n", wr->s->lb_factor);
+                jk_printf(s, "value=\"%d\"/>\n", wr->lb_factor);
             }
             else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) {
                 jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE 
"%d\" type=\"text\"", i);
-                jk_putv(s, "value=\"", wr->s->route, "\"/>\n", NULL);
+                jk_putv(s, "value=\"", wr->route, "\"/>\n", NULL);
             }
             else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) {
                 jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE 
"%d\" type=\"text\"", i);
-                jk_putv(s, "value=\"", wr->s->redirect, "\"/>\n", NULL);
+                jk_putv(s, "value=\"", wr->redirect, "\"/>\n", NULL);
             }
             else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) {
                 jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE 
"%d\" type=\"text\"", i);
-                jk_putv(s, "value=\"", wr->s->domain, "\"/>\n", NULL);
+                jk_putv(s, "value=\"", wr->domain, "\"/>\n", NULL);
             }
             else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) {
                 jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE 
"%d\" type=\"text\"", i);
-                jk_printf(s, "value=\"%d\"/>\n", wr->s->distance);
+                jk_printf(s, "value=\"%d\"/>\n", wr->distance);
             }
 
             jk_puts(s, "</td></tr>");
@@ -2299,7 +2299,7 @@
     JK_TRACE_ENTER(l);
     if (jw->type == JK_LB_WORKER_TYPE) {
         lb = (lb_worker_t *)jw->worker_private;
-        name = lb->s->name;
+        name = lb->name;
         if (JK_IS_DEBUG_LEVEL(l))
             jk_log(l, JK_LOG_DEBUG,
                    "Status worker '%s' committing changes for lb worker '%s'",
@@ -2400,40 +2400,40 @@
     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->s->name, lb_name);
+               w->name, wr->name, lb_name);
 
     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->s->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) {
-            wr->s->activation = i;
+        if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) {
+            wr->activation = i;
             jk_log(l, JK_LOG_INFO,
                    "Status worker '%s' setting 'activation' for sub worker 
'%s' of lb worker '%s' to '%s'",
-                   w->name, wr->s->name, lb_name, jk_lb_get_activation(wr, l));
+                   w->name, wr->name, lb_name, jk_lb_get_activation(wr, l));
             rc |= 1;
         }
     }
     i = status_get_int(p, JK_STATUS_ARG_LBM_FACTOR,
-                       wr->s->lb_factor, l);
-    if (i != wr->s->lb_factor && i > 0) {
+                       wr->lb_factor, l);
+    if (i != wr->lb_factor && i > 0) {
         jk_log(l, JK_LOG_INFO,
                "Status worker '%s' setting 'lbfactor' for sub worker '%s' of 
lb worker '%s' to '%i'",
-               w->name, wr->s->name, lb_name, i);
-        wr->s->lb_factor = i;
+               w->name, wr->name, lb_name, i);
+        wr->lb_factor = i;
         /* Recalculate the load multiplicators wrt. lb_factor */
         rc |= 2;
     }
     if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_ROUTE,
                                 NULL, &arg, l)) == JK_TRUE) {
-        if (strncmp(wr->s->route, arg, JK_SHM_STR_SIZ)) {
+        if (strncmp(wr->route, arg, JK_SHM_STR_SIZ)) {
             jk_log(l, JK_LOG_INFO,
                    "Status worker '%s' setting 'route' for sub worker '%s' of 
lb worker '%s' to '%s'",
-                   w->name, wr->s->name, lb_name, arg);
-            strncpy(wr->s->route, arg, JK_SHM_STR_SIZ);
-            if (!wr->s->domain[0]) {
-                char * id_domain = strchr(wr->s->route, '.');
+                   w->name, wr->name, lb_name, arg);
+            strncpy(wr->route, arg, JK_SHM_STR_SIZ);
+            if (!wr->domain[0]) {
+                char * id_domain = strchr(wr->route, '.');
                 if (id_domain) {
                     *id_domain = '\0';
-                    strcpy(wr->s->domain, wr->s->route);
+                    strcpy(wr->domain, wr->route);
                     *id_domain = '.';
                 }
             }
@@ -2441,30 +2441,31 @@
     }
     if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_REDIRECT,
                                 NULL, &arg, l)) == JK_TRUE) {
-        if (strncmp(wr->s->redirect, arg, JK_SHM_STR_SIZ)) {
+        if (strncmp(wr->redirect, arg, JK_SHM_STR_SIZ)) {
             jk_log(l, JK_LOG_INFO,
                    "Status worker '%s' setting 'redirect' for sub worker '%s' 
of lb worker '%s' to '%s'",
-                   w->name, wr->s->name, lb_name, arg);
-            strncpy(wr->s->redirect, arg, JK_SHM_STR_SIZ);
+                   w->name, wr->name, lb_name, arg);
+            strncpy(wr->redirect, arg, JK_SHM_STR_SIZ);
         }
     }
     if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_DOMAIN,
                                 NULL, &arg, l)) == JK_TRUE) {
-        if (strncmp(wr->s->domain, arg, JK_SHM_STR_SIZ)) {
+        if (strncmp(wr->domain, arg, JK_SHM_STR_SIZ)) {
             jk_log(l, JK_LOG_INFO,
                    "Status worker '%s' setting 'domain' for sub worker '%s' of 
lb worker '%s' to '%s'",
-                   w->name, wr->s->name, lb_name, arg);
-            strncpy(wr->s->domain, arg, JK_SHM_STR_SIZ);
+                   w->name, wr->name, lb_name, arg);
+            strncpy(wr->domain, arg, JK_SHM_STR_SIZ);
         }
     }
     i = status_get_int(p, JK_STATUS_ARG_LBM_DISTANCE,
-                       wr->s->distance, l);
-    if (i != wr->s->distance && i > 0) {
+                       wr->distance, l);
+    if (i != wr->distance && i > 0) {
         jk_log(l, JK_LOG_INFO,
                "Status worker '%s' setting 'distance' for sub worker '%s' of 
lb worker '%s' to '%i'",
-               w->name, wr->s->name, lb_name, i);
-        wr->s->distance = i;
+               w->name, wr->name, lb_name, i);
+        wr->distance = i;
     }
+    wr->sequence++;
     return rc;
 }
 
@@ -2515,7 +2516,7 @@
     }
     if (jw->type == JK_LB_WORKER_TYPE) {
         lb = (lb_worker_t *)jw->worker_private;
-        name = lb->s->name;
+        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'",
@@ -2535,22 +2536,22 @@
             snprintf(vname, 32-1, "" JK_STATUS_ARG_MULT_VALUE_BASE "%d", j);
 
             if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) {
-                i = status_get_int(p, vname, wr->s->lb_factor, l);
-                if (i != wr->s->lb_factor && i > 0) {
+                i = status_get_int(p, vname, wr->lb_factor, l);
+                if (i != wr->lb_factor && i > 0) {
                     jk_log(l, JK_LOG_INFO,
                            "Status worker '%s' setting 'lbfactor' for sub 
worker '%s' of lb worker '%s' to '%i'",
-                           w->name, wr->s->name, name, i);
-                    wr->s->lb_factor = i;
+                           w->name, wr->name, name, i);
+                    wr->lb_factor = i;
                     rc = 2;
                 }
             }
             else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) {
-                i = status_get_int(p, vname, wr->s->distance, l);
-                if (i != wr->s->distance && i > 0) {
+                i = status_get_int(p, vname, wr->distance, l);
+                if (i != wr->distance && i > 0) {
                     jk_log(l, JK_LOG_INFO,
                            "Status worker '%s' setting 'distance' for sub 
worker '%s' of lb worker '%s' to '%i'",
-                           w->name, wr->s->name, name, i);
-                    wr->s->lb_factor = i;
+                           w->name, wr->name, name, i);
+                    wr->lb_factor = i;
                 }
             }
             else {
@@ -2558,27 +2559,27 @@
                 if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) {
                     if (rv == JK_TRUE) {
                         i = jk_lb_get_activation_code(arg);
-                        if (i != wr->s->activation && i >= 0 && i <= 
JK_LB_ACTIVATION_MAX) {
-                            wr->s->activation = i;
+                        if (i != wr->activation && i >= 0 && i <= 
JK_LB_ACTIVATION_MAX) {
+                            wr->activation = i;
                             jk_log(l, JK_LOG_INFO,
                                    "Status worker '%s' setting 'activation' 
for sub worker '%s' of lb worker '%s' to '%s'",
-                                   w->name, wr->s->name, name, 
jk_lb_get_activation(wr, l));
+                                   w->name, wr->name, name, 
jk_lb_get_activation(wr, l));
                             rc = 1;
                         }
                     }
                 }
                 else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) {
                     if (rv == JK_TRUE) {
-                        if (strncmp(wr->s->route, arg, JK_SHM_STR_SIZ)) {
+                        if (strncmp(wr->route, arg, JK_SHM_STR_SIZ)) {
                             jk_log(l, JK_LOG_INFO,
                                    "Status worker '%s' setting 'route' for sub 
worker '%s' of lb worker '%s' to '%s'",
-                                   w->name, wr->s->name, name, arg);
-                            strncpy(wr->s->route, arg, JK_SHM_STR_SIZ);
-                            if (!wr->s->domain[0]) {
-                                char * id_domain = strchr(wr->s->route, '.');
+                                   w->name, wr->name, name, arg);
+                            strncpy(wr->route, arg, JK_SHM_STR_SIZ);
+                            if (!wr->domain[0]) {
+                                char * id_domain = strchr(wr->route, '.');
                                 if (id_domain) {
                                     *id_domain = '\0';
-                                    strcpy(wr->s->domain, wr->s->route);
+                                    strcpy(wr->domain, wr->route);
                                     *id_domain = '.';
                                 }
                             }
@@ -2587,31 +2588,34 @@
                 }
                 else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) {
                     if (rv == JK_TRUE) {
-                        if (strncmp(wr->s->redirect, arg, JK_SHM_STR_SIZ)) {
+                        if (strncmp(wr->redirect, arg, JK_SHM_STR_SIZ)) {
                             jk_log(l, JK_LOG_INFO,
                                    "Status worker '%s' setting 'redirect' for 
sub worker '%s' of lb worker '%s' to '%s'",
-                                   w->name, wr->s->name, name, arg);
-                            strncpy(wr->s->redirect, arg, JK_SHM_STR_SIZ);
+                                   w->name, wr->name, name, arg);
+                            strncpy(wr->redirect, arg, JK_SHM_STR_SIZ);
                         }
                     }
                 }
                 else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) {
                     if (rv == JK_TRUE) {
-                        if (strncmp(wr->s->domain, arg, JK_SHM_STR_SIZ)) {
+                        if (strncmp(wr->domain, arg, JK_SHM_STR_SIZ)) {
                             jk_log(l, JK_LOG_INFO,
                                    "Status worker '%s' setting 'domain' for 
sub worker '%s' of lb worker '%s' to '%s'",
-                                   w->name, wr->s->name, name, arg);
-                            strncpy(wr->s->domain, arg, JK_SHM_STR_SIZ);
+                                   w->name, wr->name, name, arg);
+                            strncpy(wr->domain, arg, JK_SHM_STR_SIZ);
                         }
                     }
                 }
             }
+            wr->sequence++;
         }
         if (rc == 1)
             reset_lb_values(lb, l);
         else if (rc == 2)
             /* Recalculate the load multiplicators wrt. lb_factor */
             update_mult(lb, l);
+        lb->sequence++;
+        jk_lb_push(lb, l);
     }
     JK_TRACE_EXIT(l);
 }
@@ -2987,7 +2991,9 @@
             JK_TRACE_EXIT(l);
             return JK_FALSE;
         }
-        rc = commit_member(s, p, wr, lb->s->name, l);
+        rc = commit_member(s, p, wr, lb->name, l);
+        lb->sequence++;
+        jk_lb_push(lb, l);
         if (rc & 1)
             reset_lb_values(lb, l);
         if (rc & 2)

Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?rev=610623&r1=610622&r2=610623&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Wed Jan  9 
16:52:57 2008
@@ -44,6 +44,10 @@
   <subsection name="Native">
     <changelog>
       <update>
+        SHM: Use local copies of read mostly attributes of lb sub workers
+        in lb and status worker. (rjung)
+      </update>
+      <update>
         Status: Add "dump" action to dump our initial configuration. (rjung)
       </update>
       <update>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to