Mailing List Archive

svn commit: r1916267 - in /httpd/httpd/trunk: changes-entries/start-threads.txt server/mpm/event/event.c server/mpm/worker/worker.c
Author: covener
Date: Wed Mar 13 01:26:54 2024
New Revision: 1916267

URL: http://svn.apache.org/viewvc?rev=1916267&view=rev
Log:
shutdown carefully when threads don't start

Submitted By: ylavic, covener

Added:
httpd/httpd/trunk/changes-entries/start-threads.txt
Modified:
httpd/httpd/trunk/server/mpm/event/event.c
httpd/httpd/trunk/server/mpm/worker/worker.c

Added: httpd/httpd/trunk/changes-entries/start-threads.txt
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/changes-entries/start-threads.txt?rev=1916267&view=auto
==============================================================================
--- httpd/httpd/trunk/changes-entries/start-threads.txt (added)
+++ httpd/httpd/trunk/changes-entries/start-threads.txt Wed Mar 13 01:26:54 2024
@@ -0,0 +1,3 @@
+ *) worker, event: Avoid possible hangs and crashes during shutdown of
+ child processes that fail to start their configured threads.
+ [Yann Ylavic, Eric Covener]

Modified: httpd/httpd/trunk/server/mpm/event/event.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1916267&r1=1916266&r2=1916267&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/event/event.c (original)
+++ httpd/httpd/trunk/server/mpm/event/event.c Wed Mar 13 01:26:54 2024
@@ -2745,11 +2745,28 @@ static void *APR_THREAD_FUNC start_threa
rv = ap_thread_create(&threads[i], thread_attr,
worker_thread, my_info, pruntime);
if (rv != APR_SUCCESS) {
+ ap_update_child_status_from_indexes(my_child_num, i, SERVER_DEAD, NULL);
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf,
APLOGNO(03104)
"ap_thread_create: unable to create worker thread");
- /* let the parent decide how bad this really is */
- signal_threads(listener_started ? ST_GRACEFUL : ST_UNGRACEFUL);
+ /* Let the parent decide how bad this really is by returning
+ * APEXIT_CHILDSICK. If threads were created already let them
+ * stop cleanly first to avoid deadlocks in clean_child_exit(),
+ * just stop creating new ones here (but set resource_shortage
+ * to return APEXIT_CHILDSICK still when the child exists).
+ */
+ if (threads_created) {
+ resource_shortage = 1;
+ signal_threads(ST_GRACEFUL);
+ if (!listener_started) {
+ workers_may_exit = 1;
+ ap_queue_term(worker_queue);
+ /* wake up main POD thread too */
+ kill(ap_my_pid, SIGTERM);
+ }
+ apr_thread_exit(thd, APR_SUCCESS);
+ return NULL;
+ }
clean_child_exit(APEXIT_CHILDSICK);
}
threads_created++;

Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=1916267&r1=1916266&r2=1916267&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/worker.c Wed Mar 13 01:26:54 2024
@@ -979,9 +979,27 @@ static void * APR_THREAD_FUNC start_thre
rv = ap_thread_create(&threads[i], thread_attr,
worker_thread, my_info, pruntime);
if (rv != APR_SUCCESS) {
+ ap_update_child_status_from_indexes(my_child_num, i, SERVER_DEAD, NULL);
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, APLOGNO(03142)
"ap_thread_create: unable to create worker thread");
- /* let the parent decide how bad this really is */
+ /* Let the parent decide how bad this really is by returning
+ * APEXIT_CHILDSICK. If threads were created already let them
+ * stop cleanly first to avoid deadlocks in clean_child_exit(),
+ * just stop creating new ones here (but set resource_shortage
+ * to return APEXIT_CHILDSICK still when the child exists).
+ */
+ if (threads_created) {
+ resource_shortage = 1;
+ signal_threads(ST_GRACEFUL);
+ if (!listener_started) {
+ workers_may_exit = 1;
+ ap_queue_term(worker_queue);
+ /* wake up main POD thread too */
+ kill(ap_my_pid, SIGTERM);
+ }
+ apr_thread_exit(thd, APR_SUCCESS);
+ return NULL;
+ }
clean_child_exit(APEXIT_CHILDSICK);
}
threads_created++;