From: Stefan Eissing Date: Tue, 10 Aug 2021 08:43:11 +0000 (+0000) Subject: Merged r1891919 from trunk: X-Git-Tag: candidate-2.4.49~3^2~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb5c366792b9effecbdee6da3a6de43948153d8e;p=thirdparty%2Fapache%2Fhttpd.git Merged r1891919 from trunk: *) 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 --- diff --git a/CHANGES b/CHANGES index 9aa3971189e..9676d8fd9f4 100644 --- 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] diff --git a/include/ap_mmn.h b/include/ap_mmn.h index a156e4041cb..67fc4ddf7a4 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -567,6 +567,8 @@ * 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" */ @@ -574,7 +576,7 @@ #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 diff --git a/include/mpm_common.h b/include/mpm_common.h index 1284a7a6a32..539d6401bb3 100644 --- a/include/mpm_common.h +++ b/include/mpm_common.h @@ -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 */ diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c index 955a91afcef..5b293900ed3 100644 --- a/server/mpm/event/event.c +++ b/server/mpm/event/event.c @@ -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); } diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index 183ef938cd6..33b60f54bb5 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -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); } diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index d44190bb339..bd56f618bd8 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -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); } diff --git a/server/mpm_common.c b/server/mpm_common.c index 04f36d9db86..9bcd76074fd 100644 --- a/server/mpm_common.c +++ b/server/mpm_common.c @@ -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)