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