From: Yann Ylavic Date: Fri, 18 May 2018 16:33:28 +0000 (+0000) Subject: mod_slotmem_shm: use a generation number for SHM filename on all platforms. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9fa142563c3bcddafcb892d59c458c87ec278a16;p=apache mod_slotmem_shm: use a generation number for SHM filename on all platforms. Successive generations can't share the same SHMs because restarts may modify them under the terminating children, while SHMs are not extensible when all slots are in use. This effectively restores r1822341 which was reverted by r1822505. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1831869 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index acb23ce16a..bc1ad81e01 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.1 + *) mod_slotmem_shm: Add generation number to shm filename to fix races + with graceful restarts. PR 62044. [Jim Jagielski, Yann Ylavic] + *) mod_rewrite: Only create the global mutex used by "RewriteMap prg:" when this type of map is present in the configuration. PR62311. [Hank Ibell ] diff --git a/modules/slotmem/mod_slotmem_shm.c b/modules/slotmem/mod_slotmem_shm.c index 04258def0e..8e9b787cc3 100644 --- a/modules/slotmem/mod_slotmem_shm.c +++ b/modules/slotmem/mod_slotmem_shm.c @@ -71,31 +71,6 @@ static apr_pool_t *gpool = NULL; #define DEFAULT_SLOTMEM_SUFFIX ".shm" #define DEFAULT_SLOTMEM_PERSIST_SUFFIX ".persist" -/* Unixes (and Netware) have the unlink() semantic, which allows to - * apr_file_remove() a file still in use (opened elsewhere), the inode - * remains until the last fd is closed, whereas any file created with - * the same name/path will use a new inode. - * - * On windows and OS/2 ("\SHAREMEM\..." tree), apr_file_remove() marks - * the files for deletion until the last HANDLE is closed, meanwhile the - * same file/path can't be opened/recreated. - * Thus on graceful restart (the only restart mode with mpm_winnt), the - * old file may still exist until all the children stop, while we ought - * to create a new one for our new clear SHM. Therefore, we would only - * be able to reuse (attach) the old SHM, preventing some changes to - * the config file, like the number of balancers/members, since the - * size checks (to fit the new config) would fail. Let's avoid this by - * including the generation number in the SHM filename (obviously not - * the persisted name!) - */ -#ifndef SLOTMEM_UNLINK_SEMANTIC -#if defined(WIN32) || defined(OS2) -#define SLOTMEM_UNLINK_SEMANTIC 0 -#else -#define SLOTMEM_UNLINK_SEMANTIC 1 -#endif -#endif - /* * Persist the slotmem in a file * slotmem name and file name. @@ -113,18 +88,11 @@ static int slotmem_filenames(apr_pool_t *pool, if (slotname && *slotname && strcasecmp(slotname, "none") != 0) { if (slotname[0] != '/') { -#if !SLOTMEM_UNLINK_SEMANTIC /* Each generation needs its own file name. */ int generation = 0; ap_mpm_query(AP_MPMQ_GENERATION, &generation); fname = apr_psprintf(pool, "%s%s_%x%s", DEFAULT_SLOTMEM_PREFIX, slotname, generation, DEFAULT_SLOTMEM_SUFFIX); -#else - /* Reuse the same file name for each generation. */ - fname = apr_pstrcat(pool, DEFAULT_SLOTMEM_PREFIX, - slotname, DEFAULT_SLOTMEM_SUFFIX, - NULL); -#endif fname = ap_runtime_dir_relative(pool, fname); } else { @@ -136,7 +104,6 @@ static int slotmem_filenames(apr_pool_t *pool, if (persistname) { /* Persisted file names are immutable... */ -#if !SLOTMEM_UNLINK_SEMANTIC if (slotname[0] != '/') { pname = apr_pstrcat(pool, DEFAULT_SLOTMEM_PREFIX, slotname, DEFAULT_SLOTMEM_SUFFIX, @@ -144,11 +111,11 @@ static int slotmem_filenames(apr_pool_t *pool, NULL); pname = ap_runtime_dir_relative(pool, pname); } - else -#endif - pname = apr_pstrcat(pool, fname, - DEFAULT_SLOTMEM_PERSIST_SUFFIX, - NULL); + else { + pname = apr_pstrcat(pool, slotname, + DEFAULT_SLOTMEM_PERSIST_SUFFIX, + NULL); + } } }