From 5ff25379f5eefce2065179cf607c6002b28fef2d Mon Sep 17 00:00:00 2001
From: Yann Ylavic <ylavic@apache.org>
Date: Mon, 29 Jan 2018 13:22:47 +0000
Subject: [PATCH] Revert r1822341, slotmems are not reused on (graceful)
 restart.

Will follow up with an alternate fix.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1822505 13f79535-47bb-0310-9956-ffa450edef68
---
 CHANGES                           |  3 ---
 modules/slotmem/mod_slotmem_shm.c | 43 +++++++++++++++++++++++++++----
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/CHANGES b/CHANGES
index 158b614a94..7a6592067f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,9 +7,6 @@ Changes with Apache 2.5.1
   *) core: adding defines to allow interworking with honggfuzz without
      further patches. [Stefan Eissing, Robert Swiecki]
 
-  *) mod_slotmem_shm: Add generation number to shm filename to fix races
-     with graceful restarts. PR 62044.
-
   *) mpm_event: Let the listener thread do its maintenance job on resources
      shortage.  PR 61979.  [Yann Ylavic]
 
diff --git a/modules/slotmem/mod_slotmem_shm.c b/modules/slotmem/mod_slotmem_shm.c
index 8e9b787cc3..04258def0e 100644
--- a/modules/slotmem/mod_slotmem_shm.c
+++ b/modules/slotmem/mod_slotmem_shm.c
@@ -71,6 +71,31 @@ 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.
@@ -88,11 +113,18 @@ 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 {
@@ -104,6 +136,7 @@ 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,
@@ -111,11 +144,11 @@ static int slotmem_filenames(apr_pool_t *pool,
                                     NULL);
                 pname = ap_runtime_dir_relative(pool, pname);
             }
-            else {
-                pname = apr_pstrcat(pool, slotname,
-                                    DEFAULT_SLOTMEM_PERSIST_SUFFIX,
-                                    NULL);
-            }
+            else
+#endif
+            pname = apr_pstrcat(pool, fname,
+                                DEFAULT_SLOTMEM_PERSIST_SUFFIX,
+                                NULL);
         }
     }
 
-- 
2.40.0