Author: mturk
Date: Sun Mar 18 07:31:27 2012
New Revision: 1302080
URL: http://svn.apache.org/viewvc?rev=1302080&view=rev
Log:
Fix crash with IIS in case shared memory cannot be created. Also properly log
the reason for shm errors
Modified:
tomcat/jk/trunk/native/common/jk_shm.c
tomcat/jk/trunk/native/iis/jk_isapi_plugin.c
Modified: tomcat/jk/trunk/native/common/jk_shm.c
URL:
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_shm.c?rev=1302080&r1=1302079&r2=1302080&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_shm.c (original)
+++ tomcat/jk/trunk/native/common/jk_shm.c Sun Mar 18 07:31:27 2012
@@ -150,7 +150,7 @@ size_t jk_shm_calculate_size(jk_map_t *i
/* Use plain memory */
int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l)
{
- int rc;
+ int rc = -1;
int attached = 0;
char lkname[MAX_PATH];
@@ -169,7 +169,10 @@ int jk_shm_open(const char *fname, size_
}
jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
#if defined (WIN32)
+ jk_shm_map = NULL;
+ jk_shm_hlock = NULL;
if (fname) {
+ SIZE_T shmsz = 0;
sprintf(lkname, "Global\\%s_MUTEX", fname);
jk_shm_hlock = CreateMutex(jk_get_sa_with_null_dacl(), TRUE, lkname);
if (jk_shm_hlock == NULL) {
@@ -179,48 +182,62 @@ int jk_shm_open(const char *fname, size_
}
}
if (jk_shm_hlock == NULL) {
+ rc = GetLastError();
+ jk_log(l, JK_LOG_ERROR, "Failed to open shared memory mutex %s
with errno=%d",
+ lkname, rc);
JK_LEAVE_CS(&jk_shmem.cs);
JK_TRACE_EXIT(l);
- return -1;
+ return rc;
}
if (attached) {
DWORD ws = WaitForSingleObject(jk_shm_hlock, INFINITE);
if (ws == WAIT_FAILED) {
+ rc = GetLastError();
CloseHandle(jk_shm_hlock);
jk_shm_hlock = NULL;
JK_LEAVE_CS(&jk_shmem.cs);
JK_TRACE_EXIT(l);
- return -1;
+ return rc;
+ }
+ jk_shm_map = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
FALSE, fname);
+ if (jk_shm_map == NULL) {
+ rc = GetLastError();
+ jk_log(l, JK_LOG_ERROR, "Failed to open shared memory %s with
errno=%d",
+ fname, rc);
}
- jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname);
}
- else {
+ if (jk_shm_map == NULL) {
+ shmsz = jk_shmem.size;
jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE,
jk_get_sa_with_null_dacl(),
- PAGE_READWRITE,
+ FILE_MAP_READ | FILE_MAP_WRITE,
0,
- (DWORD)jk_shmem.size,
+ (DWORD)shmsz,
fname);
}
if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
+ rc = GetLastError();
+ jk_log(l, JK_LOG_ERROR, "Failed to map shared memory %s with
errno=%d",
+ fname, rc);
CloseHandle(jk_shm_hlock);
jk_shm_hlock = NULL;
jk_shm_map = NULL;
JK_LEAVE_CS(&jk_shmem.cs);
JK_TRACE_EXIT(l);
- return -1;
+ return rc;
}
jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map,
- FILE_MAP_ALL_ACCESS,
+ FILE_MAP_READ |
FILE_MAP_WRITE,
0,
0,
- 0);
+ shmsz);
}
else
#endif
jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size);
if (!jk_shmem.hdr) {
#if defined (WIN32)
+ rc = GetLastError();
if (jk_shm_map) {
CloseHandle(jk_shm_map);
jk_shm_map = NULL;
@@ -232,7 +249,7 @@ int jk_shm_open(const char *fname, size_
#endif
JK_LEAVE_CS(&jk_shmem.cs);
JK_TRACE_EXIT(l);
- return -1;
+ return rc;
}
if (!jk_shmem.filename) {
if (fname)
@@ -267,10 +284,12 @@ int jk_shm_open(const char *fname, size_
jk_shmem.hdr->h.data.pos = 0;
jk_shmem.hdr->h.data.workers = 0;
}
- if (jk_shm_hlock) {
+#if defined (WIN32)
+ if (jk_shm_hlock != NULL) {
/* Unlock shared memory */
ReleaseMutex(jk_shm_hlock);
}
+#endif
JK_LEAVE_CS(&jk_shmem.cs);
if (JK_IS_DEBUG_LEVEL(l))
jk_log(l, JK_LOG_DEBUG,
@@ -314,6 +333,7 @@ void jk_shm_close()
if (jk_shmem.hdr) {
#if defined (WIN32)
if (jk_shm_hlock) {
+ WaitForSingleObject(jk_shm_hlock, 60000);
CloseHandle(jk_shm_hlock);
jk_shm_hlock = NULL;
}
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=1302080&r1=1302079&r2=1302080&view=diff
==============================================================================
--- tomcat/jk/trunk/native/iis/jk_isapi_plugin.c (original)
+++ tomcat/jk/trunk/native/iis/jk_isapi_plugin.c Sun Mar 18 07:31:27 2012
@@ -469,8 +469,8 @@ static char dll_file_path[MAX_PATH];
static char ini_file_name[MAX_PATH];
static int using_ini_file = JK_FALSE;
static HANDLE init_cs = NULL;
-static int is_inited = JK_FALSE;
-static int is_mapread = JK_FALSE;
+static volatile int is_inited = JK_FALSE;
+static volatile int is_mapread = JK_FALSE;
static jk_uri_worker_map_t *uw_map = NULL;
static jk_map_t *workers_map = NULL;
@@ -2168,10 +2168,12 @@ DWORD WINAPI HttpFilterProc(PHTTP_FILTER
StringCbCat(serverName, MAX_SERVERNAME, instanceId);
}
}
- WaitForSingleObject(init_cs, INFINITE);
- if (!is_mapread)
- is_mapread = init_jk(serverName);
- ReleaseMutex(init_cs);
+ if (!is_mapread) {
+ WaitForSingleObject(init_cs, INFINITE);
+ if (!is_mapread)
+ is_mapread = init_jk(serverName);
+ ReleaseMutex(init_cs);
+ }
}
/* If we can't read the map we become dormant */
if (!is_mapread)
@@ -2248,10 +2250,12 @@ DWORD WINAPI HttpExtensionProc(LPEXTENSI
StringCbCat(serverName, MAX_SERVERNAME, instanceId);
}
}
- WaitForSingleObject(init_cs, INFINITE);
- if (!is_mapread)
- is_mapread = init_jk(serverName);
- ReleaseMutex(init_cs);
+ if (!is_mapread) {
+ WaitForSingleObject(init_cs, INFINITE);
+ if (!is_mapread)
+ is_mapread = init_jk(serverName);
+ ReleaseMutex(init_cs);
+ }
}
if (!is_mapread)
is_inited = JK_FALSE;
@@ -2351,10 +2355,12 @@ BOOL WINAPI TerminateFilter(DWORD dwFlag
{
UNREFERENCED_PARAMETER(dwFlags);
+ if (!is_inited)
+ return TRUE;
WaitForSingleObject(init_cs, INFINITE);
if (is_inited) {
- jk_log(logger, JK_LOG_INFO, "%s stopping", (FULL_VERSION_STRING));
is_inited = JK_FALSE;
+ jk_log(logger, JK_LOG_INFO, "%s stopping", (FULL_VERSION_STRING));
watchdog_interval = 0;
if (watchdog_handle) {
WaitForSingleObject(watchdog_handle, INFINITE);
@@ -2792,13 +2798,21 @@ static int init_jk(char *serverName)
"You can remove the shm_size attribute if you want
to use the optimal size.");
}
if ((rv = jk_shm_open(shm_name, shm_config_size, logger)) !=
0) {
- /* TODO: Do not try to open the worker if we cannot create
- * the shared memory segment.
- */
jk_log(logger, JK_LOG_ERROR,
- "Initializing shm:%s errno=%d. Load balancing
workers will not function properly.",
+ "Initializing shm:%s errno=%d. Load balancer will
not work properly!",
jk_shm_name(), rv);
}
+ else if ((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 simple memory.
+ */
+ jk_log(logger, JK_LOG_EMERG,
+ "Initializing shm:%s errno=%d. Cannot continue",
+ jk_shm_name(), rv);
+ jk_map_free(&workers_map);
+ workers_map = NULL;
+ return JK_FALSE;
+ }
else {
if (shm_loaded_name[0]) {
if (strcmp(shm_loaded_name, shm_name)) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]