You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2012/03/19 14:54:33 UTC

svn commit: r1302445 - in /tomcat/jk/trunk/native: apache-1.3/mod_jk.c apache-2.0/mod_jk.c common/jk_lb_worker.c common/jk_shm.c common/jk_shm.h iis/jk_isapi_plugin.c netscape/jk_nsapi_plugin.c

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org