Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
apache2.33761
apache2-mod_watchdog-add-assertions-to-cleanup-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File apache2-mod_watchdog-add-assertions-to-cleanup-code.patch of Package apache2.33761
From 3b7cc4481cf69328c8648a05b2b8cada9b9e8b39 Mon Sep 17 00:00:00 2001 From: Stefan Eissing <icing@apache.org> Date: Fri, 25 Feb 2022 13:18:51 +0000 Subject: [PATCH] *) mod_watchdog: add assertions to cleanup code *) core/mpm_preform: do not invoke the fancy new child_stopping/stopped hooks when invoked from a signal handler. This is a stopgap to some strange behaviour in need of some deeper insight. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1898418 13f79535-47bb-0310-9956-ffa450edef68 --- modules/core/mod_watchdog.c | 21 ++++++++++++++++----- server/mpm/prefork/prefork.c | 19 +++++++++++++------ 2 files changed, 29 insertions(+), 11 deletions(-) Index: httpd-2.4.51/modules/core/mod_watchdog.c =================================================================== --- httpd-2.4.51.orig/modules/core/mod_watchdog.c +++ httpd-2.4.51/modules/core/mod_watchdog.c @@ -78,11 +78,13 @@ static apr_status_t wd_worker_cleanup(vo ap_watchdog_t *w = (ap_watchdog_t *)data; /* Do nothing if the thread wasn't started or has terminated. */ - if (apr_atomic_read32(&w->thread_started) != 1) + if (!w->thread || apr_atomic_read32(&w->thread_started) != 1) return APR_SUCCESS; + AP_DEBUG_ASSERT(w->thread); apr_atomic_set32(&w->is_running, 0); apr_thread_join(&rv, w->thread); + w->thread = NULL; return rv; } @@ -557,6 +559,8 @@ static void wd_child_stopping(apr_pool_t { const apr_array_header_t *wl; + ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, wd_server_conf->s, + "child stopping graceful=%d", graceful); if (!wd_server_conf->child_workers) { return; } @@ -585,6 +589,8 @@ static void wd_child_stopped(apr_pool_t { const apr_array_header_t *wl; + ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, wd_server_conf->s, + "child stopped, joining watchdog threads"); if (!wd_server_conf->child_workers) { return; } @@ -598,9 +604,14 @@ static void wd_child_stopped(apr_pool_t ap_watchdog_t *w = ap_lookup_provider(AP_WATCHDOG_PGROUP, wn[i].provider_name, AP_WATCHDOG_CVERSION); + ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, wd_server_conf->s, + "%sWatchdog (%s) stopping now", + w->singleton ? "Singleton " : "", w->name); wd_worker_cleanup(w); } } + ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, wd_server_conf->s, + "child stopped, watchdogs stopped"); } /*--------------------------------------------------------------------------*/ @@ -689,10 +700,10 @@ static void wd_register_hooks(apr_pool_t /* Child has stopped hook */ - ap_hook_child_stopping(wd_child_stopped, - NULL, - NULL, - APR_HOOK_MIDDLE); + ap_hook_child_stopped(wd_child_stopped, + NULL, + NULL, + APR_HOOK_MIDDLE); APR_REGISTER_OPTIONAL_FN(ap_watchdog_get_instance); APR_REGISTER_OPTIONAL_FN(ap_watchdog_register_callback); Index: httpd-2.4.51/server/mpm/prefork/prefork.c =================================================================== --- httpd-2.4.51.orig/server/mpm/prefork/prefork.c +++ httpd-2.4.51/server/mpm/prefork/prefork.c @@ -215,8 +215,8 @@ static void prefork_note_child_started(i } /* a clean exit from a child with proper cleanup */ -static void clean_child_exit(int code) __attribute__ ((noreturn)); -static void clean_child_exit(int code) +static void clean_child_exit_ex(int code, int from_signal) __attribute__ ((noreturn)); +static void clean_child_exit_ex(int code, int from_signal) { retained->mpm->mpm_state = AP_MPMQ_STOPPING; @@ -225,9 +225,9 @@ static void clean_child_exit(int code) if (pchild) { - if (code == 0) { - ap_run_child_stopping(pchild, 0); - ap_run_child_stopped(pchild, 0); + if (!code && !from_signal) { + ap_run_child_stopping(pchild, !retained->mpm->is_ungraceful); + ap_run_child_stopped(pchild, !retained->mpm->is_ungraceful); } apr_pool_destroy(pchild); } @@ -241,6 +241,13 @@ static void clean_child_exit(int code) exit(code); } +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code) __attribute__ ((noreturn)); +static void clean_child_exit(int code) +{ + clean_child_exit_ex(code, 0); +} + static apr_status_t accept_mutex_on(void) { apr_status_t rv = apr_proc_mutex_lock(my_bucket->mutex); @@ -357,7 +364,7 @@ static const char *prefork_get_name(void static void just_die(int sig) { - clean_child_exit(0); + clean_child_exit_ex(0, 1); } /* volatile because it's updated from a signal handler */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor