From 44707447a17b30e956922776c8459a892220a332 Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: May 15 2019 02:36:27 +0000 Subject: Ticket 50370 - CleanAllRUV task crashing during server shutdown Description: There is a race condition during server shutdown that can cause the server to crash. Increment the active thread count for each cleaning task to prevent the plugins from being closed before the thread terminates. https://pagure.io/389-ds-base/issue/50370 Reviewed by: firstyear(Thanks!) (cherry picked from commit 7141b8d10382e8dcb8528b57e5226c82506b79b9) --- diff --git a/ldap/servers/plugins/replication/repl5_replica_config.c b/ldap/servers/plugins/replication/repl5_replica_config.c index eb92a9d..02b645f 100644 --- a/ldap/servers/plugins/replication/repl5_replica_config.c +++ b/ldap/servers/plugins/replication/repl5_replica_config.c @@ -1677,9 +1677,13 @@ replica_cleanallruv_thread(void *arg) int aborted = 0; int rc = 0; - if (!data) { + if (!data || slapi_is_shutting_down()) { return; /* no data */ } + + /* Increase active thread count to prevent a race condition at server shutdown */ + g_incr_active_threadcnt(); + if (data->task) { slapi_task_inc_refcount(data->task); slapi_log_err(SLAPI_LOG_PLUGIN, repl_plugin_name, @@ -1959,6 +1963,7 @@ done: slapi_ch_free_string(&data->force); slapi_ch_free_string(&rid_text); slapi_ch_free((void **)&data); + g_decr_active_threadcnt(); } /* @@ -3051,9 +3056,13 @@ replica_abort_task_thread(void *arg) int release_it = 0; int count = 0, rc = 0; - if (!data) { + if (!data || slapi_is_shutting_down()) { return; /* no data */ } + + /* Increase active thread count to prevent a race condition at server shutdown */ + g_incr_active_threadcnt(); + if (data->task) { slapi_task_inc_refcount(data->task); slapi_log_err(SLAPI_LOG_PLUGIN, repl_plugin_name, "replica_abort_task_thread --> refcount incremented.\n"); @@ -3180,6 +3189,7 @@ done: slapi_ch_free_string(&data->certify); slapi_sdn_free(&data->sdn); slapi_ch_free((void **)&data); + g_decr_active_threadcnt(); } static int