Author: mturk Date: Mon Mar 19 13:54:33 2012 New Revision: 1302445 URL: http://svn.apache.org/viewvc?rev=1302445&view=rev Log: Fix shared memory corruption. Add logger to shm_close
Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c tomcat/jk/trunk/native/apache-2.0/mod_jk.c tomcat/jk/trunk/native/common/jk_lb_worker.c tomcat/jk/trunk/native/common/jk_shm.c tomcat/jk/trunk/native/common/jk_shm.h tomcat/jk/trunk/native/iis/jk_isapi_plugin.c tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-1.3/mod_jk.c?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/apache-1.3/mod_jk.c (original) +++ tomcat/jk/trunk/native/apache-1.3/mod_jk.c Mon Mar 19 13:54:33 2012 @@ -3336,7 +3336,7 @@ static void child_exit_handler(server_re { /* srevilak - refactor cleanup body to jk_generic_cleanup() */ jk_generic_cleanup(s); - jk_shm_close(); + jk_shm_close(main_log); } static void child_init_handler(server_rec * s, ap_pool * p) Modified: tomcat/jk/trunk/native/apache-2.0/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-2.0/mod_jk.c?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/apache-2.0/mod_jk.c (original) +++ tomcat/jk/trunk/native/apache-2.0/mod_jk.c Mon Mar 19 13:54:33 2012 @@ -2507,7 +2507,7 @@ static apr_status_t jk_cleanup_shmem(voi while (jk_watchdog_running) apr_sleep(apr_time_from_sec(1)); } - jk_shm_close(); + jk_shm_close(main_log); return APR_SUCCESS; } Modified: tomcat/jk/trunk/native/common/jk_lb_worker.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_lb_worker.c?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_lb_worker.c (original) +++ tomcat/jk/trunk/native/common/jk_lb_worker.c Mon Mar 19 13:54:33 2012 @@ -295,6 +295,11 @@ void jk_lb_pull(lb_worker_t *p, int lock p->name, p->sequence, p->s->h.sequence); if (locked == JK_FALSE) jk_shm_lock(); + if (p->sequence > p->s->h.sequence) { + if (locked == JK_FALSE) + jk_shm_unlock(); + return; + } 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; @@ -305,7 +310,6 @@ void jk_lb_pull(lb_worker_t *p, int lock p->lbmethod = p->s->lbmethod; p->lblock = p->s->lblock; p->max_packet_size = p->s->max_packet_size; - p->sequence = p->s->h.sequence; strncpy(p->session_cookie, p->s->session_cookie, JK_SHM_STR_SIZ); strncpy(p->session_path, p->s->session_path, JK_SHM_STR_SIZ); @@ -331,6 +335,7 @@ void jk_lb_pull(lb_worker_t *p, int lock w->sequence = w->s->h.sequence; } } + p->sequence = p->s->h.sequence; if (locked == JK_FALSE) jk_shm_unlock(); @@ -981,8 +986,8 @@ static int get_most_suitable_worker(jk_w if (!jk_shm_lock()) { jk_log(l, JK_LOG_ERROR, "locking failed (errno=%d)", errno); JK_TRACE_EXIT(l); - return -1; - } + return -1; + } } else { JK_ENTER_CS(&p->cs); Modified: tomcat/jk/trunk/native/common/jk_shm.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.c?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_shm.c (original) +++ tomcat/jk/trunk/native/common/jk_shm.c Mon Mar 19 13:54:33 2012 @@ -192,6 +192,8 @@ int jk_shm_open(const char *fname, size_ jk_shm_hlock = OpenMutex(MUTEX_ALL_ACCESS, FALSE, lkname); } } + else if (GetLastError() == ERROR_ALREADY_EXISTS) + attached = 1; if (jk_shm_hlock == NULL) { rc = GetLastError(); jk_log(l, JK_LOG_ERROR, "Failed to open shared memory mutex %s with errno=%d", @@ -292,9 +294,9 @@ int jk_shm_open(const char *fname, size_ jk_shmem.hdr->h.data.childs); } } + jk_shmem.hdr->h.data.pos = 0; + jk_shmem.hdr->h.data.workers = 0; } - jk_shmem.hdr->h.data.pos = 0; - jk_shmem.hdr->h.data.workers = 0; #if defined (WIN32) if (jk_shm_hlock != NULL) { /* Unlock shared memory */ @@ -336,12 +338,17 @@ int jk_shm_attach(const char *fname, siz } } -void jk_shm_close() +void jk_shm_close(jk_logger_t *l) { if (jk_shm_inited_cs) { JK_ENTER_CS(&jk_shmem.cs); } if (jk_shmem.hdr) { + if (JK_IS_DEBUG_LEVEL(l)) { + jk_log(l, JK_LOG_DEBUG, + "Closed shared memory %s childs=%u", + jk_shm_name(), jk_shmem.hdr->h.data.childs); + } #if defined (WIN32) if (jk_shm_hlock) { WaitForSingleObject(jk_shm_hlock, 60000); @@ -662,13 +669,18 @@ int jk_shm_attach(const char *fname, siz return do_shm_open(fname, 1, sz, l); } -void jk_shm_close() +void jk_shm_close(jk_logger_t *l) { #ifdef AS400_UTF8 char *wptr; #endif if (jk_shmem.hdr) { + if (JK_IS_DEBUG_LEVEL(l)) { + jk_log(l, JK_LOG_DEBUG, + "Closed shared memory %s childs=%u", + jk_shm_name(), jk_shmem.hdr->h.data.childs); + } --jk_shmem.hdr->h.data.childs; #ifdef JK_SHM_LOCK_REOPEN Modified: tomcat/jk/trunk/native/common/jk_shm.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.h?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_shm.h (original) +++ tomcat/jk/trunk/native/common/jk_shm.h Mon Mar 19 13:54:33 2012 @@ -199,7 +199,7 @@ int jk_shm_open(const char *fname, size_ /* Close the shared memory */ -void jk_shm_close(void); +void jk_shm_close(jk_logger_t *l); /* Attach the shared memory in child process. * File has to be opened in parent. Modified: tomcat/jk/trunk/native/iis/jk_isapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/iis/jk_isapi_plugin.c?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original) +++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Mon Mar 19 13:54:33 2012 @@ -2369,7 +2369,7 @@ BOOL WINAPI TerminateFilter(DWORD dwFlag CloseHandle(watchdog_handle); watchdog_handle = NULL; } - jk_shm_close(); + jk_shm_close(logger); if (logger) jk_close_file_logger(&logger); return TRUE; @@ -2411,7 +2411,7 @@ BOOL WINAPI TerminateFilter(DWORD dwFlag } jk_map_free(&rregexp_map); } - jk_shm_close(); + jk_shm_close(logger); if (logger) { jk_close_file_logger(&logger); } @@ -2541,7 +2541,7 @@ static int init_logger(int rotate) char *log_file_name; char log_file_name_buf[MAX_PATH*2]; jk_logger_t *org = NULL; - + /* If log rotation is enabled, format the log filename */ if ((log_rotationtime > 0) || (log_filesize > 0)) { time_t t; @@ -2792,7 +2792,7 @@ static int init_jk(char *serverName) if (jk_map_alloc(&workers_map)) { if (jk_map_read_properties(workers_map, NULL, worker_file, NULL, JK_MAP_HANDLE_DUPLICATES, logger)) { - int rv; + int rv = -1; /* we add the URI->WORKER MAP since workers using AJP14 will feed it */ @@ -2817,7 +2817,7 @@ static int init_jk(char *serverName) "Initializing shm:%s errno=%d. Load balancing workers will not function properly", jk_shm_name(), rv); } - else if ((rv = jk_shm_open(NULL, shm_config_size, logger)) != 0) { + if (rv != 0 && (rv = jk_shm_open(NULL, shm_config_size, logger)) != 0) { /* Do not try to open the worker if we cannot create * the shared memory segment or heap memory. */ @@ -2850,7 +2850,7 @@ static int init_jk(char *serverName) uri_worker_map_switch(uw_map, logger); } else { - jk_shm_close(); + jk_shm_close(logger); } } else { @@ -2939,7 +2939,7 @@ static int read_registry_init_data(void) } } if (!get_config_parameter(src, JK_LOG_FILE_TAG, log_file, sizeof(log_file))) - goto cleanup; + goto cleanup; if (is_path_relative(log_file)) { char *fp = path_merge(dll_file_path, log_file); if (fp) { Modified: tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c?rev=1302445&r1=1302444&r2=1302445&view=diff ============================================================================== --- tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c (original) +++ tomcat/jk/trunk/native/netscape/jk_nsapi_plugin.c Mon Mar 19 13:54:33 2012 @@ -378,7 +378,7 @@ NSAPI_PUBLIC void jk_term(void *p) } wc_close(logger); - jk_shm_close(); + jk_shm_close(logger); if (logger) { jk_close_file_logger(&logger); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org