]> granicus.if.org Git - apache/commitdiff
mod_slotmem_shm: use a generation number for SHM filename on all platforms.
authorYann Ylavic <ylavic@apache.org>
Fri, 18 May 2018 16:33:28 +0000 (16:33 +0000)
committerYann Ylavic <ylavic@apache.org>
Fri, 18 May 2018 16:33:28 +0000 (16:33 +0000)
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

CHANGES
modules/slotmem/mod_slotmem_shm.c

diff --git a/CHANGES b/CHANGES
index acb23ce16a0be41736f7c3705cc8d32dcdb3cf31..bc1ad81e010137b18c82c44b963eb61073543c51 100644 (file)
--- 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 <hwibell gmail.com>]
index 04258def0ee97c609aec2f4a1d11d0769e2d6639..8e9b787cc30250175607b238d35077417be14269 100644 (file)
@@ -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);
+            }
         }
     }