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