Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP1:GA
pacemaker.21299
bsc#1173668-0001-Low-attrd-handle-shutdown-more...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File bsc#1173668-0001-Low-attrd-handle-shutdown-more-cleanly.patch of Package pacemaker.21299
From 6ddb87f6a364bd5c3be651d0ede0ec1c8f48666c Mon Sep 17 00:00:00 2001 From: Ken Gaillot <kgaillot@redhat.com> Date: Thu, 18 Oct 2018 14:33:24 -0500 Subject: [PATCH] Low: attrd: handle shutdown more cleanly Once shutdown has started, avoid wasting time on such things as updating the alert configuration, responding to most peer messages, starting a new election, or writing out attributes after a CIB replace. This doesn't really matter much since shutdown is self-contained at the moment. There were plans to change that, but they wound up being unnecessary. These changes still seem worthwhile, though. --- attrd/attrd_common_alerts.c | 2 +- attrd/commands.c | 8 ++++++++ attrd/attrd_elections.c | 9 +++++++-- attrd/attrd_utils.c | 25 +++++++++++++++++++++---- attrd/pacemaker-attrd.c | 6 +++++- 5 files changed, 42 insertions(+), 8 deletions(-) Index: pacemaker-1.1.18+20180430.b12c320f5/attrd/attrd_common_alerts.c =================================================================== --- pacemaker-1.1.18+20180430.b12c320f5.orig/attrd/attrd_common_alerts.c +++ pacemaker-1.1.18+20180430.b12c320f5/attrd/attrd_common_alerts.c @@ -140,7 +140,7 @@ attrd_read_options(gpointer user_data) void attrd_cib_updated_cb(const char *event, xmlNode * msg) { - if (crm_patchset_contains_alert(msg, FALSE)) { + if (!attrd_shutting_down() && crm_patchset_contains_alert(msg, FALSE)) { mainloop_set_trigger(attrd_config_read); } } Index: pacemaker-1.1.18+20180430.b12c320f5/attrd/commands.c =================================================================== --- pacemaker-1.1.18+20180430.b12c320f5.orig/attrd/commands.c +++ pacemaker-1.1.18+20180430.b12c320f5/attrd/commands.c @@ -275,7 +275,10 @@ attrd_client_update(xmlNode *xml) } } - if ((peer_writer == NULL) && (election_state(writer) != election_in_progress)) { + if ((peer_writer == NULL) + && (election_state(writer) != election_in_progress) + && !attrd_shutting_down()) { + crm_info("Starting an election to determine the writer"); election_vote(writer); } @@ -562,7 +565,10 @@ attrd_peer_message(crm_node_t *peer, xml enum election_result rc = 0; crm_xml_add(xml, F_CRM_HOST_FROM, peer->uname); - rc = election_count_vote(writer, xml, TRUE); + + // Don't become writer if we're shutting down + rc = election_count_vote(writer, xml, !attrd_shutting_down()); + switch(rc) { case election_start: free(peer_writer); @@ -580,6 +586,14 @@ attrd_peer_message(crm_node_t *peer, xml return; } + if (attrd_shutting_down()) { + /* If we're shutting down, we want to continue responding to election + * ops as long as we're a cluster member (because our vote may be + * needed). Ignore all other messages. + */ + return; + } + crm_element_value_int(xml, F_ATTRD_WRITER, &peer_state); if(election_state(writer) == election_won && peer_state == election_won Index: pacemaker-1.1.18+20180430.b12c320f5/attrd/attrd_common.c =================================================================== --- pacemaker-1.1.18+20180430.b12c320f5.orig/attrd/attrd_common.c +++ pacemaker-1.1.18+20180430.b12c320f5/attrd/attrd_common.c @@ -8,6 +8,7 @@ #include <crm_internal.h> #include <stdio.h> +#include <stdbool.h> #include <errno.h> #include <glib.h> #include <regex.h> @@ -21,7 +22,9 @@ cib_t *the_cib = NULL; -static gboolean shutting_down = FALSE; +// volatile because attrd_shutdown() can be called for a signal +static volatile bool shutting_down = FALSE; + static GMainLoop *mloop = NULL; /*! @@ -45,11 +48,25 @@ attrd_shutting_down() void attrd_shutdown(int nsig) { + // Tell various functions not to do anthing shutting_down = TRUE; - if ((mloop != NULL) && g_main_is_running(mloop)) { - g_main_loop_quit(mloop); - } else { + + // Don't respond to signals while shutting down + mainloop_destroy_signal(SIGTERM); + mainloop_destroy_signal(SIGCHLD); + mainloop_destroy_signal(SIGPIPE); + mainloop_destroy_signal(SIGUSR1); + mainloop_destroy_signal(SIGUSR2); + mainloop_destroy_signal(SIGTRAP); + + if ((mloop == NULL) || !g_main_loop_is_running(mloop)) { + /* If there's no main loop active, just exit. This should be possible + * only if we get SIGTERM in brief windows at start-up and shutdown. + */ crm_exit(CRM_EX_OK); + } else { + g_main_loop_quit(mloop); + g_main_loop_unref(mloop); } } Index: pacemaker-1.1.18+20180430.b12c320f5/attrd/main.c =================================================================== --- pacemaker-1.1.18+20180430.b12c320f5.orig/attrd/main.c +++ pacemaker-1.1.18+20180430.b12c320f5/attrd/main.c @@ -97,8 +97,12 @@ attrd_cpg_destroy(gpointer unused) static void attrd_cib_replaced_cb(const char *event, xmlNode * msg) { - crm_notice("Updating all attributes after %s event", event); + if (attrd_shutting_down()) { + return; + } + if(election_state(writer) == election_won) { + crm_notice("Updating all attributes after %s event", event); write_attributes(TRUE); } }
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