Author: rjung
Date: Tue Feb 23 01:35:04 2010
New Revision: 915127

URL: http://svn.apache.org/viewvc?rev=915127&view=rev
Log:
Improve address change handling:
- decrement connection counter when closing connection
- lock endpoint cache with critical section
  before changing endpoint state
- close connection in pull and push
- change endpoint cache outside of shm lock

Modified:
    tomcat/jk/trunk/native/common/jk_ajp_common.c

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=915127&r1=915126&r2=915127&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Tue Feb 23 01:35:04 2010
@@ -997,7 +997,7 @@
 /* Syncing config values from shm */
 void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l)
 {
-    int resolve = JK_FALSE;
+    int address_change = JK_FALSE;
     int port = 0;
     char host[JK_SHM_STR_SIZ+1];
     struct sockaddr_in inet_addr;
@@ -1021,7 +1021,7 @@
     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;
+        address_change = JK_TRUE;
         aw->addr_sequence = aw->s->addr_sequence;
         strncpy(host, aw->s->host, JK_SHM_STR_SIZ);
         port = aw->s->port;
@@ -1029,7 +1029,7 @@
     if (locked == JK_FALSE)
         jk_shm_unlock();
 
-    if (resolve == JK_TRUE) {
+    if (address_change == JK_TRUE) {
         if (!jk_resolve(host, port, &inet_addr,
                         aw->worker.we->pool, l)) {
             jk_log(l, JK_LOG_ERROR,
@@ -1037,9 +1037,30 @@
                    host, port, aw->name);
         }
         else {
+            int rc;
+            JK_ENTER_CS(&aw->cs, rc);
+            if (rc) {
+                unsigned int i;
+                for (i = 0; i < aw->ep_cache_sz; i++) {
+                    /* Close all connections in the cache */
+                    if (aw->ep_cache[i] && 
IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+                        int sd = aw->ep_cache[i]->sd;
+                        aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+                        aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
+                        jk_shutdown_socket(sd, l);
+                        aw->s->connected--;
+                    }
+                }
+            }
             aw->port = port;
             strncpy(aw->host, host, JK_SHM_STR_SIZ);
             memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(inet_addr));
+            if (rc) {
+                JK_LEAVE_CS(&aw->cs, rc);
+            } else {
+                jk_log(l, JK_LOG_ERROR,
+                       "locking thread (errno=%d)", errno);
+            }
         }
     }
 
@@ -1049,6 +1070,8 @@
 /* Syncing config values to shm */
 void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l)
 {
+    int address_change = JK_FALSE;
+
     JK_TRACE_ENTER(l);
 
     if (JK_IS_DEBUG_LEVEL(l))
@@ -1069,23 +1092,35 @@
     aw->s->max_packet_size = aw->max_packet_size;
     aw->s->h.sequence = aw->sequence;
     if (aw->s->addr_sequence != aw->addr_sequence) {
-        unsigned int i;
-        aw->s->addr_sequence = aw->addr_sequence;
+        address_change = JK_TRUE;
         strncpy(aw->s->host, aw->host, JK_SHM_STR_SIZ);
         aw->s->port = aw->port;
-        for (i = 0; i < aw->ep_cache_sz; i++) {
-            /* Close all connections in the cache */
-            if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
-                int sd = aw->ep_cache[i]->sd;
-                aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
-                aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
-                jk_shutdown_socket(sd, l);
-            }
-        }
+        aw->s->addr_sequence = aw->addr_sequence;
     }
     if (locked == JK_FALSE)
         jk_shm_unlock();
 
+    if (address_change == JK_TRUE) {
+        int rc;
+        JK_ENTER_CS(&aw->cs, rc);
+        if (rc) {
+            unsigned int i;
+            for (i = 0; i < aw->ep_cache_sz; i++) {
+                /* Close all connections in the cache */
+                if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+                    int sd = aw->ep_cache[i]->sd;
+                    aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+                    aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
+                    jk_shutdown_socket(sd, l);
+                    aw->s->connected--;
+                }
+            }
+            JK_LEAVE_CS(&aw->cs, rc);
+        } else {
+            jk_log(l, JK_LOG_ERROR,
+                   "locking thread (errno=%d)", errno);
+        }
+    }
     JK_TRACE_EXIT(l);
 }
 



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

Reply via email to