]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merged r1891919 from trunk:
authorStefan Eissing <icing@apache.org>
Tue, 10 Aug 2021 08:43:11 +0000 (08:43 +0000)
committerStefan Eissing <icing@apache.org>
Tue, 10 Aug 2021 08:43:11 +0000 (08:43 +0000)
  *) core: add hook child_stopping hook that gets called when the MPM is stopping a
     child process. The additional graceful parameter allows registered hooks
     to free resources early during a graceful shutdown.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1892167 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
include/ap_mmn.h
include/mpm_common.h
server/mpm/event/event.c
server/mpm/prefork/prefork.c
server/mpm/worker/worker.c
server/mpm_common.c

diff --git a/CHANGES b/CHANGES
index 9aa3971189ecfef3cce4bf3f756946c22c54c259..9676d8fd9f4a2715473a31b6693a08ac2d598789 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,11 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.4.49
 
+  * core/mpm: add hook 'child_stopping` that gets called when the MPM is
+    stopping a child process. The additional `graceful` parameter allows
+    registered hooks to free resources early during a graceful shutdown.
+    [Yann Ylavic, Stefan Eissing]
+
   *) mod_proxy: Fix icomplete initialization of BalancerMember(s) from the
      balancer-manager, which can lead to a crash.  [Yann Ylavic]
 
index a156e4041cb2ccab5a1d9bbe53785ac08db6f9f4..67fc4ddf7a45d3e8fa6e5d93ddf27e2bd6adf44d 100644 (file)
  *                           pre_translate_name hook and
  *                           Add map_encoded_one and map_encoded_all bits to
  *                           proxy_server_conf.
+ * 20120211.110 (2.4.49-dev) Add hook child_stopping to get informed that a child
+ *                           is being shut down.
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20120211
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 109                 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 110                 /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index 1284a7a6a3238dd2d22e3c0982322db2da3907bc..539d6401bb3a8608d5f22e2b93f21a59f00e4732 100644 (file)
@@ -452,6 +452,15 @@ AP_DECLARE_HOOK(void, suspend_connection,
 AP_DECLARE_HOOK(void, resume_connection,
                 (conn_rec *c, request_rec *r))
 
+/**
+ * Notification that the child is stopping. If graceful, ongoing
+ * requests will be served.
+ * @param pchild The child pool
+ * @param graceful != 0 iff this is a graceful shutdown.
+ */
+AP_DECLARE_HOOK(void, child_stopping,
+                (apr_pool_t *pchild, int graceful))
+
 /* mutex type string for accept mutex, if any; MPMs should use the
  * same mutex type for ease of configuration
  */
index 955a91afcef09de60d8048b8cc953590aa6e2564..5b293900ed395fbe27ab355b619aca42c2194ad2 100644 (file)
@@ -630,6 +630,8 @@ static void signal_threads(int mode)
         ap_queue_interrupt_all(worker_queue);
         close_worker_sockets(); /* forcefully kill all current connections */
     }
+
+    ap_run_child_stopping(pchild, mode == ST_GRACEFUL);
 }
 
 static int event_query(int query_code, int *result, apr_status_t *rv)
@@ -720,6 +722,10 @@ static void clean_child_exit(int code) __attribute__ ((noreturn));
 static void clean_child_exit(int code)
 {
     retained->mpm->mpm_state = AP_MPMQ_STOPPING;
+    if (terminate_mode == ST_INIT) {
+        ap_run_child_stopping(pchild, 0);
+    }
+
     if (pchild) {
         apr_pool_destroy(pchild);
     }
index 183ef938cd60d86843960454bdbf572f02a66c05..33b60f54bb55a533959d1494d020468e15c95e33 100644 (file)
@@ -223,6 +223,10 @@ static void clean_child_exit(int code)
     apr_signal(SIGHUP, SIG_IGN);
     apr_signal(SIGTERM, SIG_IGN);
 
+    if (code == 0) {
+        ap_run_child_stopping(pchild, 0);
+    }
+
     if (pchild) {
         apr_pool_destroy(pchild);
     }
index d44190bb339e34c285b5722089ddea49d25b4137..bd56f618bd8c3d75389743647a5853a5df8cdbea 100644 (file)
@@ -324,6 +324,8 @@ static void signal_threads(int mode)
         ap_queue_interrupt_all(worker_queue);
         close_worker_sockets(); /* forcefully kill all current connections */
     }
+
+    ap_run_child_stopping(pchild, mode == ST_GRACEFUL);
 }
 
 static int worker_query(int query_code, int *result, apr_status_t *rv)
@@ -432,6 +434,10 @@ static void clean_child_exit(int code) __attribute__ ((noreturn));
 static void clean_child_exit(int code)
 {
     retained->mpm->mpm_state = AP_MPMQ_STOPPING;
+    if (terminate_mode == ST_INIT) {
+        ap_run_child_stopping(pchild, 0);
+    }
+
     if (pchild) {
         apr_pool_destroy(pchild);
     }
index 04f36d9db862e3850d28ec84106fc155dd6b228a..9bcd76074fd84be9498cd3d266274e0b437fea88 100644 (file)
@@ -72,7 +72,8 @@
     APR_HOOK_LINK(end_generation) \
     APR_HOOK_LINK(child_status) \
     APR_HOOK_LINK(suspend_connection) \
-    APR_HOOK_LINK(resume_connection)
+    APR_HOOK_LINK(resume_connection) \
+    APR_HOOK_LINK(child_stopping)
 
 #if AP_ENABLE_EXCEPTION_HOOK
 APR_HOOK_STRUCT(
@@ -112,6 +113,9 @@ AP_IMPLEMENT_HOOK_VOID(suspend_connection,
 AP_IMPLEMENT_HOOK_VOID(resume_connection,
                        (conn_rec *c, request_rec *r),
                        (c, r))
+AP_IMPLEMENT_HOOK_VOID(child_stopping,
+                       (apr_pool_t *pchild, int graceful),
+                       (pchild, graceful))
 
 /* hooks with no args are implemented last, after disabling APR hook probes */
 #if defined(APR_HOOK_PROBES_ENABLED)