You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by yl...@apache.org on 2018/05/18 16:33:28 UTC

svn commit: r1831869 - in /httpd/httpd/trunk: CHANGES modules/slotmem/mod_slotmem_shm.c

Author: ylavic
Date: Fri May 18 16:33:28 2018
New Revision: 1831869

URL: http://svn.apache.org/viewvc?rev=1831869&view=rev
Log:
mod_slotmem_shm: generation number for SHM filename on all platforms.

This effectively restores r1822341 which was reverted by r1822505.


Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1831869&r1=1831868&r2=1831869&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri May 18 16:33:28 2018
@@ -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>]

Modified: httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c?rev=1831869&r1=1831868&r2=1831869&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c (original)
+++ httpd/httpd/trunk/modules/slotmem/mod_slotmem_shm.c Fri May 18 16:33:28 2018
@@ -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
 
     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
 
         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
                                     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);
+            }
         }
     }