Author: mturk
Date: Thu Feb 19 12:55:05 2009
New Revision: 745842

URL: http://svn.apache.org/viewvc?rev=745842&view=rev
Log:
Allow dynamic worker address change

Modified:
    tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
    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_service.h
    tomcat/connectors/trunk/jk/native/common/jk_shm.h
    tomcat/connectors/trunk/jk/native/common/jk_status.c
    tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml

Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?rev=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Thu Feb 19 12:55:05 
2009
@@ -3211,7 +3211,11 @@
     }
 
 #if JK_NEED_SET_MUTEX_PERMS
+#if (MODULE_MAGIC_NUMBER_MAJOR >= 20090208)
+    rv = ap_unixd_set_global_mutex_perms(jk_log_lock);
+#else
     rv = unixd_set_global_mutex_perms(jk_log_lock);
+#endif
     if (rv != APR_SUCCESS) {
         ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,
                      "mod_jk: Could not set permissions on "

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=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c Thu Feb 19 
12:55:05 2009
@@ -2167,6 +2167,18 @@
     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->hostname;
+        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_TRACE_EXIT(l);
+            return JK_FALSE;
+       }
+    }
     jk_shm_unlock();
 
     aw->s->used++;
@@ -2464,24 +2476,39 @@
         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 (JK_IS_DEBUG_LEVEL(l))
             jk_log(l, JK_LOG_DEBUG,
                    "worker %s contact is '%s:%d'",
                    p->name, p->host, p->port);
-
-/* XXX: Why do we only resolve, if port > 1024 ? */
+        /* Copy the contact to shm */
+        strncpy(p->s->hostname, p->host, JK_SHM_STR_SIZ);
+        p->s->port = p->port;
+        /* Resolve if port > 1024.
+         * 
+         */
         if (p->port > 1024) {
             if (jk_resolve(p->host, p->port, &p->worker_inet_addr, we->pool, 
l)) {
+                p->s->addr_sequence = p->addr_sequence = 1;
                 JK_TRACE_EXIT(l);
                 return JK_TRUE;
             }
             jk_log(l, JK_LOG_ERROR,
-                   "can't resolve tomcat address %s", p->host);
+                   "worker %s can't resolve tomcat address %s",
+                   p->name, p->host);
+        }
+        else {
+            p->s->port = p->port = 0;
+            if (JK_IS_DEBUG_LEVEL(l))
+                jk_log(l, JK_LOG_DEBUG,
+                       "worker %s contact is disabled",
+                       p->name, p->host, p->port);
+            JK_TRACE_EXIT(l);
+            return JK_TRUE;
         }
-        jk_log(l, JK_LOG_ERROR,
-               "invalid host and port %s %d",
-               ((p->host == NULL) ? "NULL" : p->host), p->port);
     }
     else {
         JK_LOG_NULL_PARAMS(l);
@@ -2548,6 +2575,7 @@
 
     if (pThis && pThis->worker_private) {
         ajp_worker_t *p = pThis->worker_private;
+        p->worker.we = we;
         p->ep_cache_sz = jk_get_worker_cache_size(props, p->name, cache);
         p->ep_mincache_sz = jk_get_worker_cache_size_min(props, p->name,
                                                          (p->ep_cache_sz+1) / 
2);

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=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_ajp_common.h Thu Feb 19 
12:55:05 2009
@@ -275,6 +275,7 @@
     unsigned connect_retry_attempts;
     const char *host;
     int port;
+    int addr_sequence;  /* Wather the address is resolved */
     int maintain_time;
     /*
      * Open connections cache...

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=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Thu Feb 19 12:55:05 
2009
@@ -1553,6 +1553,13 @@
                     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->addr_sequence) {
+                        p->lb_workers[i].activation = JK_LB_ACTIVATION_STOPPED;
+                    }
+                }
             }
 
             if (i != num_of_workers) {
@@ -1618,6 +1625,7 @@
     lb_worker_t *p = (lb_worker_t *)pThis->worker_private;
     JK_TRACE_ENTER(log);
 
+    p->worker.we = we;
     p->retries = jk_get_worker_retries(props, p->name,
                                        JK_RETRIES);
     p->retry_interval =

Modified: tomcat/connectors/trunk/jk/native/common/jk_service.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_service.h?rev=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_service.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_service.h Thu Feb 19 12:55:05 
2009
@@ -449,6 +449,8 @@
 struct jk_worker
 {
 
+    jk_worker_env_t *we;
+
     /*
      * A 'this' pointer which is used by the subclasses of this class to
      * point to data/functions which are specific to a given protocol

Modified: tomcat/connectors/trunk/jk/native/common/jk_shm.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_shm.h?rev=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_shm.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_shm.h Thu Feb 19 12:55:05 2009
@@ -78,6 +78,9 @@
 struct jk_shm_ajp_worker
 {
     jk_shm_worker_header_t h;
+    char hostname[JK_SHM_STR_SIZ+1];
+    unsigned int port;
+    volatile int addr_sequence;
 
     /* Configuration data mirrored from ajp_worker */
     int cache_timeout;

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=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_status.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_status.c Thu Feb 19 12:55:05 
2009
@@ -116,6 +116,8 @@
 #define JK_STATUS_ARG_AJP_REC_OPTS         "varo"
 #define JK_STATUS_ARG_AJP_MAX_PK_SZ        "vamps"
 #define JK_STATUS_ARG_AJP_CPING_INT        "vacpi"
+#define JK_STATUS_ARG_AJP_HOST_STR         "vaddr"
+#define JK_STATUS_ARG_AJP_PORT_INT         "vaprt"
 
 #define JK_STATUS_ARG_AJP_TEXT_CACHE_TO    "Connection Pool Timeout"
 #define JK_STATUS_ARG_AJP_TEXT_PING_TO     "Ping Timeout"
@@ -127,6 +129,8 @@
 #define JK_STATUS_ARG_AJP_TEXT_REC_OPTS    "Recovery Options"
 #define JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ   "Max Packet Size"
 #define JK_STATUS_ARG_AJP_TEXT_CPING_INT   "Connection Ping Interval"
+#define JK_STATUS_ARG_AJP_TEXT_HOST_STR    "Hostname"
+#define JK_STATUS_ARG_AJP_TEXT_PORT_INT    "Port"
 
 #define JK_STATUS_CMD_UNKNOWN              (0)
 #define JK_STATUS_CMD_LIST                 (1)
@@ -223,7 +227,7 @@
 #define JK_STATUS_URI_MAP_TABLE_ROW2       
"<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n"
 #define JK_STATUS_SHOW_AJP_CONF_HEAD       "<tr>" \
                                            "<th>Type</th>" \
-                                           "<th>Host</th><th>Addr</th>" \
+                                           "<th>" 
JK_STATUS_ARG_AJP_TEXT_HOST_STR "</th><th>Addr</th>" \
                                            "<th>" 
JK_STATUS_ARG_AJP_TEXT_CACHE_TO "</th>" \
                                            "<th>" 
JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "</th>" \
                                            "<th>" 
JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "</th>" \
@@ -316,7 +320,7 @@
                                            "</tr>\n"
 #define JK_STATUS_SHOW_MEMBER_CONF_HEAD    "<tr>" \
                                            "<th>Name</th><th>Type</th>" \
-                                           "<th>Host</th><th>Addr</th>" \
+                                           "<th>" 
JK_STATUS_ARG_AJP_TEXT_HOST_STR "</th><th>Addr</th>" \
                                            "<th>" 
JK_STATUS_ARG_AJP_TEXT_CACHE_TO "</th>" \
                                            "<th>" 
JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "</th>" \
                                            "<th>" 
JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "</th>" \
@@ -2643,6 +2647,15 @@
     }
 
     jk_puts(s, "<table>\n");
+    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->hostname);
+    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_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_CACHE_TO,
             ":</td><td><input name=\"",
             JK_STATUS_ARG_AJP_CACHE_TO, "\" type=\"text\" ", NULL);
@@ -3059,6 +3072,7 @@
     int rv;
     int i;
     int old;
+    int as = 0;
 
     JK_TRACE_ENTER(l);
     if (lb) {
@@ -3145,6 +3159,23 @@
             }
         }
     }
+    if ((rv = status_get_string(p, JK_STATUS_ARG_AJP_HOST_STR,
+                                NULL, &arg, l)) == JK_TRUE) {
+        if (strncmp(aw->s->hostname, 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(aw->s->hostname, arg, JK_SHM_STR_SIZ);
+            rc |= 4;
+            as = 1;
+        }
+    }
+    if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT_INT,
+                           0, INT_MAX, &aw->s->port, lb_name, l)) {
+        rc |= 4;
+        as = 1;
+    }
+    aw->s->addr_sequence += as;
     if (set_int_if_changed(p, aw->name, "ping_timeout", 
JK_STATUS_ARG_AJP_PING_TO,
                            0, INT_MAX, &aw->ping_timeout, lb_name, l))
         rc |= 4;

Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?rev=745842&r1=745841&r2=745842&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Thu Feb 19 
12:55:05 2009
@@ -44,6 +44,11 @@
   <subsection name="Native">
     <changelog>
       <update>
+      AJP: Allow changing worker address via jkstatus
+      manager. The address is resolved on next request
+      for that worker. (mturk)
+      </update>
+      <update>
       LB: If the sticky session affinity mark contains dot, treat the
       part after the dot as domain name. This allows to have full node
       session affinity with domain failover. (mturk)



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

Reply via email to