Author: rjung
Date: Tue Mar  3 18:38:51 2009
New Revision: 749685

URL: http://svn.apache.org/viewvc?rev=749685&view=rev
Log:
Some updates related to dynamic address change:

- Include shm lock and unlock in pull and push
  functions. Indicate whether we already acquired
  the lock with the new argument "locked".
- Move the dynamic address resolution into jk_ajp_pull().
  Do the actual resolution outside of the lock,
  and don't change the worker is the resolution fails.
  In case of failure log an error, but do not fail fatal.
- Use a fixed size array for the host field in the
  ajp structure. We use that in shm anyways and we
  wouldn't know how to free the dynamic memory, if we
  allocated the host filed fresh during each address update.
- Only use local data copy when displaying config data
  in the status worker. We ensure, that we sync via pull
  if needed, so no need to use the shm data except for
  the volatile runtime statistics data.
- Do not directly write new address data to shm in status
  worker, instead use general push mechanism.
- In status worker ensure that host is always set before
  trying to update address data, even if only port changed.
- Fix display of address data in status worker for port
  equals zero case.

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c
    tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h
    tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
    tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
    tomcat/connectors/trunk/jk/native/common/jk_status.c

Modified: tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c?rev=749685&r1=749684&r2=749685&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c Tue Mar  3 
18:38:51 2009
@@ -963,10 +963,16 @@
 }
 
 /* Syncing config values from shm */
-void jk_ajp_pull(ajp_worker_t * aw, jk_logger_t *l)
+void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l)
 {
+    int resolve = JK_FALSE;
+    int port = 0;
+    char host[JK_SHM_STR_SIZ+1];
+    struct sockaddr_in inet_addr;
     JK_TRACE_ENTER(l);
 
+    if (locked == JK_FALSE)
+        jk_shm_lock();
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "syncing mem for ajp worker '%s' from shm",
@@ -981,15 +987,39 @@
     aw->retry_interval = aw->s->retry_interval;
     aw->max_packet_size = aw->s->max_packet_size;
     aw->sequence = aw->s->h.sequence;
+    if (aw->addr_sequence != aw->s->addr_sequence) {
+        resolve = JK_TRUE;
+        aw->addr_sequence = aw->s->addr_sequence;
+        strncpy(host, aw->s->host, JK_SHM_STR_SIZ);
+        port = aw->s->port;
+    }
+    if (locked == JK_FALSE)
+        jk_shm_unlock();
+
+    if (resolve == JK_TRUE) {
+        if (!jk_resolve(host, port, &inet_addr,
+                        aw->worker.we->pool, l)) {
+            jk_log(l, JK_LOG_ERROR,
+                   "Failed resolving address '%s:%d' for worker '%s'.",
+                   host, port, aw->name);
+        }
+        else {
+            aw->port = port;
+            strncpy(aw->host, host, JK_SHM_STR_SIZ);
+            memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(inet_addr));
+        }
+    }
 
     JK_TRACE_EXIT(l);
 }
 
 /* Syncing config values to shm */
-void jk_ajp_push(ajp_worker_t * aw, jk_logger_t *l)
+void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l)
 {
     JK_TRACE_ENTER(l);
 
+    if (locked == JK_FALSE)
+        jk_shm_lock();
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "syncing shm for ajp worker '%s' from mem",
@@ -1004,6 +1034,13 @@
     aw->s->retry_interval = aw->retry_interval;
     aw->s->max_packet_size = aw->max_packet_size;
     aw->s->h.sequence = aw->sequence;
+    if (aw->s->addr_sequence != aw->addr_sequence) {
+        aw->s->addr_sequence = aw->addr_sequence;
+        strncpy(aw->s->host, aw->host, JK_SHM_STR_SIZ);
+        aw->s->port = aw->port;
+    }
+    if (locked == JK_FALSE)
+        jk_shm_unlock();
 
     JK_TRACE_EXIT(l);
 }
@@ -2164,23 +2201,8 @@
     p = e->endpoint_private;
     aw = p->worker;
 
-    jk_shm_lock();
     if (aw->sequence != aw->s->h.sequence)
-        jk_ajp_pull(aw, l);
-    if (aw->addr_sequence != aw->s->addr_sequence) {
-        aw->addr_sequence = aw->s->addr_sequence;
-        aw->host = aw->s->host;
-        aw->port = aw->s->port;
-        if (!jk_resolve(aw->host, aw->port, &aw->worker_inet_addr,
-                        aw->worker.we->pool, l)) {
-            if (is_error)
-                *is_error = JK_HTTP_SERVER_ERROR;
-            jk_shm_unlock();
-            JK_TRACE_EXIT(l);
-            return JK_FALSE;
-       }
-    }
-    jk_shm_unlock();
+        jk_ajp_pull(aw, JK_FALSE, l);
 
     aw->s->used++;
 
@@ -2282,10 +2304,8 @@
                        i, retry_interval);
             jk_sleep(retry_interval);
             /* Pull shared memory if something changed during sleep */
-            jk_shm_lock();
             if (aw->sequence != aw->s->h.sequence)
-                jk_ajp_pull(aw, l);
-            jk_shm_unlock();
+                jk_ajp_pull(aw, JK_FALSE, l);
         }
         /*
          * We're using op->request which hold initial request
@@ -2476,10 +2496,10 @@
     if (pThis && pThis->worker_private) {
         ajp_worker_t *p = pThis->worker_private;
         p->port = jk_get_worker_port(props, p->name, port);
-        p->host = jk_get_worker_host(props, p->name, host);
-        if (!p->host) {
-            p->host = "undefined";
+        if (!host) {
+            host = "undefined";
         }
+        strncpy(p->host, jk_get_worker_host(props, p->name, host), 
JK_SHM_STR_SIZ);
 
         if (JK_IS_DEBUG_LEVEL(l))
             jk_log(l, JK_LOG_DEBUG,

Modified: tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h?rev=749685&r1=749684&r2=749685&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h Tue Mar  3 
18:38:51 2009
@@ -273,7 +273,7 @@
 
     struct sockaddr_in worker_inet_addr;    /* Contains host and port */
     unsigned connect_retry_attempts;
-    const char *host;
+    char host[JK_SHM_STR_SIZ+1];
     int port;
     int addr_sequence;  /* Whether the address is resolved */
     int maintain_time;
@@ -422,9 +422,9 @@
 
 void ajp_close_endpoint(ajp_endpoint_t * ae, jk_logger_t *l);
 
-void jk_ajp_pull(ajp_worker_t * aw, jk_logger_t *l);
+void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l);
 
-void jk_ajp_push(ajp_worker_t * aw, jk_logger_t *l);
+void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l);
 
 int ajp_connection_tcp_send_message(ajp_endpoint_t * ae,
                                     jk_msg_buf_t *msg, jk_logger_t *l);

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=749685&r1=749684&r2=749685&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Tue Mar  3 18:38:51 
2009
@@ -282,12 +282,14 @@
 }
 
 /* Syncing config values from shm */
-void jk_lb_pull(lb_worker_t *p, jk_logger_t *l)
+void jk_lb_pull(lb_worker_t *p, int locked, jk_logger_t *l)
 {
     unsigned int i = 0;
 
     JK_TRACE_ENTER(l);
 
+    if (locked == JK_FALSE)
+        jk_shm_lock();
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "syncing mem for lb '%s' from shm",
@@ -316,7 +318,7 @@
                        "syncing mem for member '%s' of lb '%s' from shm",
                        w->name, p->name);
 
-            jk_ajp_pull(aw, l);
+            jk_ajp_pull(aw, JK_TRUE, l);
             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);
@@ -327,17 +329,21 @@
             w->sequence = w->s->h.sequence;
         }
     }
+    if (locked == JK_FALSE)
+        jk_shm_unlock();
 
     JK_TRACE_EXIT(l);
 }
 
 /* Syncing config values to shm */
-void jk_lb_push(lb_worker_t *p, jk_logger_t *l)
+void jk_lb_push(lb_worker_t *p, int locked, jk_logger_t *l)
 {
     unsigned int i = 0;
 
     JK_TRACE_ENTER(l);
 
+    if (locked == JK_FALSE)
+        jk_shm_lock();
     if (JK_IS_DEBUG_LEVEL(l))
         jk_log(l, JK_LOG_DEBUG,
                "syncing shm for lb '%s' from mem",
@@ -366,7 +372,7 @@
                        "syncing shm for member '%s' of lb '%s' from mem",
                        w->name, p->name);
 
-            jk_ajp_push(aw, l);
+            jk_ajp_push(aw, JK_TRUE, l);
             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);
@@ -377,6 +383,8 @@
             w->s->h.sequence = w->sequence;
         }
     }
+    if (locked == JK_FALSE)
+        jk_shm_unlock();
 
     JK_TRACE_EXIT(l);
 }
@@ -524,7 +532,7 @@
     JK_TRACE_ENTER(l);
 
     if (p->sequence != p->s->h.sequence)
-        jk_lb_pull(p, l);
+        jk_lb_pull(p, JK_TRUE, l);
     for (i = 0; i < p->num_of_workers; i++) {
         w = &p->lb_workers[i];
         aw = (ajp_worker_t *)w->worker->worker_private;
@@ -1054,10 +1062,8 @@
     /* Set returned error to OK */
     *is_error = JK_HTTP_OK;
 
-    jk_shm_lock();
     if (p->worker->sequence != p->worker->s->h.sequence)
-        jk_lb_pull(p->worker, l);
-    jk_shm_unlock();
+        jk_lb_pull(p->worker, JK_FALSE, l);
     for (i = 0; i < num_of_workers; i++) {
         /* Copy the shared state info */
         p->states[i] = p->worker->lb_workers[i].s->state;
@@ -1107,10 +1113,8 @@
                        retry, p->worker->retry_interval);
             jk_sleep(p->worker->retry_interval);
             /* Pull shared memory if something changed during sleep */
-            jk_shm_lock();
             if (p->worker->sequence != p->worker->s->h.sequence)
-                jk_lb_pull(p->worker, l);
-            jk_shm_unlock();
+                jk_lb_pull(p->worker, JK_FALSE, l);
             for (i = 0; i < num_of_workers; i++) {
                 /* Copy the shared state info */
                 p->states[i] = p->worker->lb_workers[i].s->state;
@@ -1663,10 +1667,8 @@
         return JK_FALSE;
     }
 
-    jk_shm_lock();
     p->sequence++;
-    jk_lb_push(p, log);
-    jk_shm_unlock();
+    jk_lb_push(p, JK_FALSE, log);
 
     JK_TRACE_EXIT(log);
     return JK_TRUE;

Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h?rev=749685&r1=749684&r2=749685&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h Tue Mar  3 18:38:51 
2009
@@ -211,8 +211,8 @@
 const char *jk_lb_get_activation(lb_sub_worker_t *p, jk_logger_t *l);
 int jk_lb_get_activation_code(const char *v);
 void reset_lb_values(lb_worker_t *p, jk_logger_t *l);
-void jk_lb_pull(lb_worker_t * p, jk_logger_t *l);
-void jk_lb_push(lb_worker_t * p, jk_logger_t *l);
+void jk_lb_pull(lb_worker_t * p, int locked, jk_logger_t *l);
+void jk_lb_push(lb_worker_t * p, int locked, jk_logger_t *l);
 void update_mult(lb_worker_t * p, jk_logger_t *l);
 
 #ifdef __cplusplus

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=749685&r1=749684&r2=749685&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_status.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_status.c Tue Mar  3 18:38:51 
2009
@@ -196,6 +196,7 @@
 #define JK_STATUS_NEEDS_PUSH               0x00000001
 #define JK_STATUS_NEEDS_RESET_LB_VALUES    0x00000002
 #define JK_STATUS_NEEDS_UPDATE_MULT        0x00000004
+#define JK_STATUS_NEEDS_ADDR_PUSH          0x00000008
 
 #define JK_STATUS_WAIT_AFTER_UPDATE        "3"
 #define JK_STATUS_REFRESH_DEF              "10"
@@ -1644,7 +1645,7 @@
     if (aw->port > 0)
         return jk_dump_hinfo(&aw->worker_inet_addr, buf);
     else {
-        if (aw->s->addr_sequence != aw->s->addr_sequence)
+        if (aw->addr_sequence != aw->s->addr_sequence)
             return "unresolved";
         else
             return "invalid";
@@ -1666,7 +1667,7 @@
         jk_printf(s, JK_STATUS_SHOW_MEMBER_CONF_ROW,
                   aw->name,
                   status_worker_type(type),
-                  aw->s->host, aw->s->port,
+                  aw->host, aw->port,
                   dump_ajp_addr(aw, buf),
                   aw->cache_timeout,
                   aw->connect_timeout,
@@ -1678,7 +1679,7 @@
     else
         jk_printf(s, JK_STATUS_SHOW_AJP_CONF_ROW,
                   status_worker_type(type),
-                  aw->s->host, aw->s->port,
+                  aw->host, aw->port,
                   dump_ajp_addr(aw, buf),
                   aw->cache_timeout,
                   aw->connect_timeout,
@@ -1804,8 +1805,8 @@
             jk_print_xml_att_string(s, off+2, "name", ajp_name);
             jk_print_xml_att_string(s, off+2, "type", 
status_worker_type(aw->worker.type));
         }
-        jk_print_xml_att_string(s, off+2, "host", aw->s->host);
-        jk_print_xml_att_int(s, off+2, "port", aw->s->port);
+        jk_print_xml_att_string(s, off+2, "host", aw->host);
+        jk_print_xml_att_int(s, off+2, "port", aw->port);
         jk_print_xml_att_string(s, off+2, "address", dump_ajp_addr(aw, buf));
         jk_print_xml_att_int(s, off+2, "connection_pool_timeout", 
aw->cache_timeout);
         jk_print_xml_att_int(s, off+2, "ping_timeout", aw->ping_timeout);
@@ -1863,8 +1864,8 @@
             jk_printf(s, " name=%s", ajp_name);
             jk_printf(s, " type=%s", status_worker_type(aw->worker.type));
         }
-        jk_printf(s, " host=%s", aw->s->host);
-        jk_printf(s, " port=%d", aw->s->port);
+        jk_printf(s, " host=%s", aw->host);
+        jk_printf(s, " port=%d", aw->port);
         jk_printf(s, " address=%s", dump_ajp_addr(aw, buf));
         jk_printf(s, " connection_pool_timeout=%d", aw->cache_timeout);
         jk_printf(s, " ping_timeout=%d", aw->ping_timeout);
@@ -1919,8 +1920,8 @@
             jk_print_prop_att_string(s, w, name, "list", ajp_name);
             jk_print_prop_att_string(s, w, ajp_name, "type", 
status_worker_type(aw->worker.type));
         }
-        jk_print_prop_att_string(s, w, ajp_name, "host", aw->s->host);
-        jk_print_prop_att_int(s, w, ajp_name, "port", aw->s->port);
+        jk_print_prop_att_string(s, w, ajp_name, "host", aw->host);
+        jk_print_prop_att_int(s, w, ajp_name, "port", aw->port);
         jk_print_prop_att_string(s, w, ajp_name, "address", dump_ajp_addr(aw, 
buf));
         jk_print_prop_att_int(s, w, ajp_name, "connection_pool_timeout", 
aw->cache_timeout);
         jk_print_prop_att_int(s, w, ajp_name, "ping_timeout", 
aw->ping_timeout);
@@ -2018,10 +2019,8 @@
         single = 1;
     }
 
-    jk_shm_lock();
     if (lb->sequence != lb->s->h.sequence)
-        jk_lb_pull(lb, l);
-    jk_shm_unlock();
+        jk_lb_pull(lb, JK_FALSE, l);
 
     for (j = 0; j < lb->num_of_workers; j++) {
         lb_sub_worker_t *wr = &(lb->lb_workers[j]);
@@ -2413,10 +2412,8 @@
         single = 1;
     }
 
-    jk_shm_lock();
     if (aw->sequence != aw->s->h.sequence)
-        jk_ajp_pull(aw, l);
-    jk_shm_unlock();
+        jk_ajp_pull(aw, JK_FALSE, l);
 
     map_count = count_maps(s, name, l);
 
@@ -2710,11 +2707,11 @@
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_HOST_STR,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_AJP_HOST_STR, "\" type=\"text\" ", NULL);
-    jk_printf(s, "value=\"%s\"/></td></tr>\n", aw->s->host);
+    jk_printf(s, "value=\"%s\"/></td></tr>\n", aw->host);
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_PORT_INT,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_AJP_PORT_INT, "\" type=\"text\" ", NULL);
-    jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->s->port);
+    jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->port);
 
     jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_CACHE_TO,
             ":</td><td><input name=\"",
@@ -3058,7 +3055,7 @@
     }
     if (sync_needed == JK_TRUE) {
         lb->sequence++;
-        jk_lb_push(lb, l);
+        jk_lb_push(lb, JK_TRUE, l);
     }
 }
 
@@ -3133,7 +3130,7 @@
     int rv;
     int i;
     int old;
-    int as = 0;
+    int resolve = JK_FALSE;
     char host[JK_SHM_STR_SIZ+1];
     int  port = 0;
 
@@ -3222,26 +3219,24 @@
             }
         }
     }
+    port = aw->port;
+    if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT_INT,
+                           0, INT_MAX, &port, lb_name, l)) {
+        strncpy(host, aw->host, JK_SHM_STR_SIZ);
+        resolve = JK_TRUE;
+    }
     if ((rv = status_get_string(p, JK_STATUS_ARG_AJP_HOST_STR,
                                 NULL, &arg, l)) == JK_TRUE) {
-        if (strncmp(aw->s->host, arg, JK_SHM_STR_SIZ)) {
+        if (strncmp(aw->host, arg, JK_SHM_STR_SIZ)) {
             jk_log(l, JK_LOG_INFO,
                     "Status worker '%s' setting 'host' for sub worker '%s' to 
'%s'",
                     w->name, aw->name, arg);
             strncpy(host, arg, JK_SHM_STR_SIZ);
-            *side_effect |= JK_STATUS_NEEDS_PUSH;
-            as = 1;
+            resolve = JK_TRUE;
         }
     }
-    port = aw->s->port;
-    if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT_INT,
-                           0, INT_MAX, &port, lb_name, l)) {
-        *side_effect |= JK_STATUS_NEEDS_PUSH;
-        as = 1;
-    }
-    if (as) {
+    if (resolve == JK_TRUE) {
         struct sockaddr_in inet_addr;
-        aw->port = aw->s->port;
         if (!jk_resolve(host, port, &inet_addr,
                         aw->worker.we->pool, l)) {
             const char *msg = "Update failed (at least partially): could not 
resolve address '%s:%d' for sub worker '%s'.";
@@ -3249,17 +3244,15 @@
             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' for sub 
worker '%s' to '%s:%d'.",
-                   w->name, aw->name, host, port);
+                   "Status worker '%s' failed resolving address '%s:%d' for 
sub worker '%s'.",
+                   w->name, host, port, aw->name);
             rc = JK_FALSE;
         }
         else {
-            strcpy(aw->s->host, host);
             aw->port = port;
-            aw->s->addr_sequence += as;
-            aw->host = aw->s->host;
-            aw->addr_sequence = aw->s->addr_sequence;
+            strncpy(aw->host, host, JK_SHM_STR_SIZ);
             memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(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,
@@ -3531,7 +3524,7 @@
             update_mult(lb, l);
         if (rc) {
             lb->sequence++;
-            jk_lb_push(lb, l);
+            jk_lb_push(lb, JK_TRUE, l);
         }
     }
     JK_TRACE_EXIT(l);
@@ -3881,10 +3874,8 @@
             return JK_FALSE;
         }
 
-        jk_shm_lock();
         if (lb->sequence != lb->s->h.sequence)
-            jk_lb_pull(lb, l);
-        jk_shm_unlock();
+            jk_lb_pull(lb, JK_FALSE, l);
         if (!sub_worker || !sub_worker[0]) {
             const char *arg;
             if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE,
@@ -3929,10 +3920,8 @@
                 jk_log(l, JK_LOG_DEBUG,
                        "Status worker '%s' %s ajp worker '%s'",
                        w->name, "editing", aw->name);
-            jk_shm_lock();
             if (aw->sequence != aw->s->h.sequence)
-                jk_ajp_pull(aw, l);
-            jk_shm_unlock();
+                jk_ajp_pull(aw, JK_FALSE, l);
             form_member(s, p, NULL, aw, worker, l);
             JK_TRACE_EXIT(l);
             return JK_TRUE;
@@ -3981,7 +3970,7 @@
         }
 
         if (lb->sequence != lb->s->h.sequence)
-            jk_lb_pull(lb, l);
+            jk_lb_pull(lb, JK_TRUE, l);
         if (!sub_worker || !sub_worker[0]) {
             const char *arg;
             if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE,
@@ -4031,10 +4020,13 @@
                        w->name, "updating", lb->name, wr->name);
                 aw = (ajp_worker_t *)wr->worker->worker_private;
                 rc = commit_member(s, p, lb, wr, aw, &rv, l);
-                if (rv & JK_STATUS_NEEDS_PUSH) {
+                if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
+                    aw->addr_sequence++;
+                }
+                if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
                     wr->sequence++;
                     lb->sequence++;
-                    jk_lb_push(lb, l);
+                    jk_lb_push(lb, JK_TRUE, l);
                 }
                 if (rv & JK_STATUS_NEEDS_RESET_LB_VALUES)
                     reset_lb_values(lb, l);
@@ -4075,11 +4067,11 @@
                        "Status worker '%s' %s ajp worker '%s'",
                        w->name, "updating", aw->name);
             if (aw->sequence != aw->s->h.sequence)
-                jk_ajp_pull(aw, l);
+                jk_ajp_pull(aw, JK_TRUE, l);
             rc = commit_member(s, p, NULL, NULL, aw, &rv, l);
             if (rv & JK_STATUS_NEEDS_PUSH) {
                 aw->sequence++;
-                jk_ajp_push(aw, l);
+                jk_ajp_push(aw, JK_TRUE, l);
             }
             JK_TRACE_EXIT(l);
             return rc;



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to