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