945d2e
From b49880467c18ade43cc283036949b686d1413118 Mon Sep 17 00:00:00 2001
945d2e
From: Ken Gaillot <kgaillot@redhat.com>
945d2e
Date: Tue, 14 Apr 2020 14:12:22 -0500
945d2e
Subject: [PATCH 1/5] Low: pacemakerd: remove unneeded IPC and CPG commands
945d2e
945d2e
Now that the controller handles crm_node's -l/-p needs, pacemakerd no longer
945d2e
needs to. Backward compatibility isn't an issue because pacemakerd IPC isn't
945d2e
proxied for Pacemaker Remote, so only local clients are relevant, and the
945d2e
pacemakerd IPC never had a C API, which means it was internal only.
945d2e
945d2e
Without those commands, pacemakerd no longer needs to track a process mask,
945d2e
connect to CPG, or maintain the peer cache.
945d2e
945d2e
The only remaining need for the cluster layer is to use corosync CFG to tell
945d2e
corosync to initiate or block shutdown.
945d2e
---
945d2e
 daemons/pacemakerd/pacemakerd.c     | 283 ++----------------------------------
945d2e
 daemons/pacemakerd/pacemakerd.h     |   2 +-
945d2e
 daemons/pacemakerd/pcmkd_corosync.c |   7 +-
945d2e
 3 files changed, 16 insertions(+), 276 deletions(-)
945d2e
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
945d2e
index 64c30e2..0f7b2db 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.c
945d2e
+++ b/daemons/pacemakerd/pacemakerd.c
945d2e
@@ -36,15 +36,12 @@
945d2e
 #include <dirent.h>
945d2e
 #include <ctype.h>
945d2e
 
945d2e
-static gboolean pcmk_quorate = FALSE;
945d2e
 static gboolean fatal_error = FALSE;
945d2e
 static GMainLoop *mainloop = NULL;
945d2e
 static bool global_keep_tracking = false;
945d2e
 
945d2e
 #define PCMK_PROCESS_CHECK_INTERVAL 5
945d2e
 
945d2e
-static const char *local_name = NULL;
945d2e
-static uint32_t local_nodeid = 0;
945d2e
 static crm_trigger_t *shutdown_trigger = NULL;
945d2e
 static const char *pid_file = PCMK_RUN_DIR "/pacemaker.pid";
945d2e
 
945d2e
@@ -105,23 +102,6 @@ static pcmk_child_t pcmk_children[] = {
945d2e
 static gboolean check_active_before_startup_processes(gpointer user_data);
945d2e
 static int child_liveness(pcmk_child_t *child);
945d2e
 static gboolean start_child(pcmk_child_t * child);
945d2e
-static gboolean update_node_processes(uint32_t id, const char *uname,
945d2e
-                                      uint32_t procs);
945d2e
-void update_process_clients(pcmk__client_t *client);
945d2e
-
945d2e
-static uint32_t
945d2e
-get_process_list(void)
945d2e
-{
945d2e
-    int lpc = 0;
945d2e
-    uint32_t procs = crm_get_cluster_proc();
945d2e
-
945d2e
-    for (lpc = 0; lpc < SIZEOF(pcmk_children); lpc++) {
945d2e
-        if (pcmk_children[lpc].pid != 0) {
945d2e
-            procs |= pcmk_children[lpc].flag;
945d2e
-        }
945d2e
-    }
945d2e
-    return procs;
945d2e
-}
945d2e
 
945d2e
 static void
945d2e
 pcmk_process_exit(pcmk_child_t * child)
945d2e
@@ -129,16 +109,6 @@ pcmk_process_exit(pcmk_child_t * child)
945d2e
     child->pid = 0;
945d2e
     child->active_before_startup = FALSE;
945d2e
 
945d2e
-    /* Broadcast the fact that one of our processes died ASAP
945d2e
-     *
945d2e
-     * Try to get some logging of the cause out first though
945d2e
-     * because we're probably about to get fenced
945d2e
-     *
945d2e
-     * Potentially do this only if respawn_count > N
945d2e
-     * to allow for local recovery
945d2e
-     */
945d2e
-    update_node_processes(local_nodeid, NULL, get_process_list());
945d2e
-
945d2e
     child->respawn_count += 1;
945d2e
     if (child->respawn_count > MAX_RESPAWN) {
945d2e
         crm_err("Child respawn count exceeded by %s", child->name);
945d2e
@@ -148,8 +118,6 @@ pcmk_process_exit(pcmk_child_t * child)
945d2e
     if (shutdown_trigger) {
945d2e
         /* resume step-wise shutdown (returned TRUE yields no parallelizing) */
945d2e
         mainloop_set_trigger(shutdown_trigger);
945d2e
-        /* intended to speed up propagating expected lay-off of the daemons? */
945d2e
-        update_node_processes(local_nodeid, NULL, get_process_list());
945d2e
 
945d2e
     } else if (!child->respawn) {
945d2e
         /* nothing to do */
945d2e
@@ -341,7 +309,6 @@ start_child(pcmk_child_t * child)
945d2e
         crm_info("Forked child %lld for process %s%s",
945d2e
                  (long long) child->pid, child->name,
945d2e
                  use_valgrind ? " (valgrind enabled: " VALGRIND_BIN ")" : "");
945d2e
-        update_node_processes(local_nodeid, NULL, get_process_list());
945d2e
         return TRUE;
945d2e
 
945d2e
     } else {
945d2e
@@ -492,7 +459,6 @@ pcmk_shutdown_worker(gpointer user_data)
945d2e
         }
945d2e
     }
945d2e
 
945d2e
-    /* send_cluster_id(); */
945d2e
     crm_notice("Shutdown complete");
945d2e
 
945d2e
     {
945d2e
@@ -567,22 +533,12 @@ pcmk_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size)
945d2e
         pcmk_shutdown(15);
945d2e
 
945d2e
     } else if (crm_str_eq(task, CRM_OP_RM_NODE_CACHE, TRUE)) {
945d2e
-        /* Send to everyone */
945d2e
-        struct iovec *iov;
945d2e
-        int id = 0;
945d2e
-        const char *name = NULL;
945d2e
-
945d2e
-        crm_element_value_int(msg, XML_ATTR_ID, &id;;
945d2e
-        name = crm_element_value(msg, XML_ATTR_UNAME);
945d2e
-        crm_notice("Instructing peers to remove references to node %s/%u", name, id);
945d2e
-
945d2e
-        iov = calloc(1, sizeof(struct iovec));
945d2e
-        iov->iov_base = dump_xml_unformatted(msg);
945d2e
-        iov->iov_len = 1 + strlen(iov->iov_base);
945d2e
-        send_cpg_iov(iov);
945d2e
+        crm_trace("Ignoring IPC request to purge node "
945d2e
+                  "because peer cache is not used");
945d2e
 
945d2e
     } else {
945d2e
-        update_process_clients(c);
945d2e
+        crm_debug("Unrecognized IPC command '%s' sent to pacemakerd",
945d2e
+                  crm_str(task));
945d2e
     }
945d2e
 
945d2e
     free_xml(msg);
945d2e
@@ -618,113 +574,6 @@ struct qb_ipcs_service_handlers mcp_ipc_callbacks = {
945d2e
     .connection_destroyed = pcmk_ipc_destroy
945d2e
 };
945d2e
 
945d2e
-static void
945d2e
-send_xml_to_client(gpointer key, gpointer value, gpointer user_data)
945d2e
-{
945d2e
-    pcmk__ipc_send_xml((pcmk__client_t *) value, 0, (xmlNode *) user_data,
945d2e
-                       crm_ipc_server_event);
945d2e
-}
945d2e
-
945d2e
-/*!
945d2e
- * \internal
945d2e
- * \brief Send an XML message with process list of all known peers to client(s)
945d2e
- *
945d2e
- * \param[in] client  Send message to this client, or all clients if NULL
945d2e
- */
945d2e
-void
945d2e
-update_process_clients(pcmk__client_t *client)
945d2e
-{
945d2e
-    GHashTableIter iter;
945d2e
-    crm_node_t *node = NULL;
945d2e
-    xmlNode *update = create_xml_node(NULL, "nodes");
945d2e
-
945d2e
-    if (is_corosync_cluster()) {
945d2e
-        crm_xml_add_int(update, "quorate", pcmk_quorate);
945d2e
-    }
945d2e
-
945d2e
-    g_hash_table_iter_init(&iter, crm_peer_cache);
945d2e
-    while (g_hash_table_iter_next(&iter, NULL, (gpointer *) & node)) {
945d2e
-        xmlNode *xml = create_xml_node(update, "node");
945d2e
-
945d2e
-        crm_xml_add_int(xml, "id", node->id);
945d2e
-        crm_xml_add(xml, "uname", node->uname);
945d2e
-        crm_xml_add(xml, "state", node->state);
945d2e
-        crm_xml_add_int(xml, "processes", node->processes);
945d2e
-    }
945d2e
-
945d2e
-    if(client) {
945d2e
-        crm_trace("Sending process list to client %s", client->id);
945d2e
-        send_xml_to_client(NULL, client, update);
945d2e
-
945d2e
-    } else {
945d2e
-        crm_trace("Sending process list to %d clients",
945d2e
-                  pcmk__ipc_client_count());
945d2e
-        pcmk__foreach_ipc_client(send_xml_to_client, update);
945d2e
-    }
945d2e
-    free_xml(update);
945d2e
-}
945d2e
-
945d2e
-/*!
945d2e
- * \internal
945d2e
- * \brief Send a CPG message with local node's process list to all peers
945d2e
- */
945d2e
-static void
945d2e
-update_process_peers(void)
945d2e
-{
945d2e
-    /* Do nothing for corosync-2 based clusters */
945d2e
-
945d2e
-    struct iovec *iov = calloc(1, sizeof(struct iovec));
945d2e
-
945d2e
-    CRM_ASSERT(iov);
945d2e
-    if (local_name) {
945d2e
-        iov->iov_base = crm_strdup_printf("<node uname=\"%s\" proclist=\"%u\"/>",
945d2e
-                                          local_name, get_process_list());
945d2e
-    } else {
945d2e
-        iov->iov_base = crm_strdup_printf("<node proclist=\"%u\"/>",
945d2e
-                                          get_process_list());
945d2e
-    }
945d2e
-    iov->iov_len = strlen(iov->iov_base) + 1;
945d2e
-    crm_trace("Sending %s", (char*) iov->iov_base);
945d2e
-    send_cpg_iov(iov);
945d2e
-}
945d2e
-
945d2e
-/*!
945d2e
- * \internal
945d2e
- * \brief Update a node's process list, notifying clients and peers if needed
945d2e
- *
945d2e
- * \param[in] id     Node ID of affected node
945d2e
- * \param[in] uname  Uname of affected node
945d2e
- * \param[in] procs  Affected node's process list mask
945d2e
- *
945d2e
- * \return TRUE if the process list changed, FALSE otherwise
945d2e
- */
945d2e
-static gboolean
945d2e
-update_node_processes(uint32_t id, const char *uname, uint32_t procs)
945d2e
-{
945d2e
-    gboolean changed = FALSE;
945d2e
-    crm_node_t *node = crm_get_peer(id, uname);
945d2e
-
945d2e
-    if (procs != 0) {
945d2e
-        if (procs != node->processes) {
945d2e
-            crm_debug("Node %s now has process list: %.32x (was %.32x)",
945d2e
-                      node->uname, procs, node->processes);
945d2e
-            node->processes = procs;
945d2e
-            changed = TRUE;
945d2e
-
945d2e
-            /* If local node's processes have changed, notify clients/peers */
945d2e
-            if (id == local_nodeid) {
945d2e
-                update_process_clients(NULL);
945d2e
-                update_process_peers();
945d2e
-            }
945d2e
-
945d2e
-        } else {
945d2e
-            crm_trace("Node %s still has process list: %.32x", node->uname, procs);
945d2e
-        }
945d2e
-    }
945d2e
-    return changed;
945d2e
-}
945d2e
-
945d2e
-
945d2e
 static pcmk__cli_option_t long_options[] = {
945d2e
     // long option, argument type, storage, short option, description, flags
945d2e
     {
945d2e
@@ -1126,91 +975,6 @@ init_children_processes(void)
945d2e
     setenv("PCMK_respawned", "true", 1);
945d2e
 }
945d2e
 
945d2e
-static void
945d2e
-mcp_cpg_destroy(gpointer user_data)
945d2e
-{
945d2e
-    crm_crit("Lost connection to cluster layer, shutting down");
945d2e
-    crm_exit(CRM_EX_DISCONNECT);
945d2e
-}
945d2e
-
945d2e
-/*!
945d2e
- * \internal
945d2e
- * \brief Process a CPG message (process list or manual peer cache removal)
945d2e
- *
945d2e
- * \param[in] handle     CPG connection (ignored)
945d2e
- * \param[in] groupName  CPG group name (ignored)
945d2e
- * \param[in] nodeid     ID of affected node
945d2e
- * \param[in] pid        Process ID (ignored)
945d2e
- * \param[in] msg        CPG XML message
945d2e
- * \param[in] msg_len    Length of msg in bytes (ignored)
945d2e
- */
945d2e
-static void
945d2e
-mcp_cpg_deliver(cpg_handle_t handle,
945d2e
-                 const struct cpg_name *groupName,
945d2e
-                 uint32_t nodeid, uint32_t pid, void *msg, size_t msg_len)
945d2e
-{
945d2e
-    xmlNode *xml = string2xml(msg);
945d2e
-    const char *task = crm_element_value(xml, F_CRM_TASK);
945d2e
-
945d2e
-    crm_trace("Received CPG message (%s): %.200s",
945d2e
-              (task? task : "process list"), (char*)msg);
945d2e
-
945d2e
-    if (task == NULL) {
945d2e
-        if (nodeid == local_nodeid) {
945d2e
-            crm_debug("Ignoring message with local node's process list");
945d2e
-        } else {
945d2e
-            uint32_t procs = 0;
945d2e
-            const char *uname = crm_element_value(xml, "uname");
945d2e
-
945d2e
-            crm_element_value_int(xml, "proclist", (int *)&procs);
945d2e
-            if (update_node_processes(nodeid, uname, procs)) {
945d2e
-                update_process_clients(NULL);
945d2e
-            }
945d2e
-        }
945d2e
-
945d2e
-    } else if (crm_str_eq(task, CRM_OP_RM_NODE_CACHE, TRUE)) {
945d2e
-        int id = 0;
945d2e
-        const char *name = NULL;
945d2e
-
945d2e
-        crm_element_value_int(xml, XML_ATTR_ID, &id;;
945d2e
-        name = crm_element_value(xml, XML_ATTR_UNAME);
945d2e
-        reap_crm_member(id, name);
945d2e
-    }
945d2e
-
945d2e
-    if (xml != NULL) {
945d2e
-        free_xml(xml);
945d2e
-    }
945d2e
-}
945d2e
-
945d2e
-static void
945d2e
-mcp_cpg_membership(cpg_handle_t handle,
945d2e
-                    const struct cpg_name *groupName,
945d2e
-                    const struct cpg_address *member_list, size_t member_list_entries,
945d2e
-                    const struct cpg_address *left_list, size_t left_list_entries,
945d2e
-                    const struct cpg_address *joined_list, size_t joined_list_entries)
945d2e
-{
945d2e
-    /* Update peer cache if needed */
945d2e
-    pcmk_cpg_membership(handle, groupName, member_list, member_list_entries,
945d2e
-                        left_list, left_list_entries,
945d2e
-                        joined_list, joined_list_entries);
945d2e
-
945d2e
-    /* Always broadcast our own presence after any membership change */
945d2e
-    update_process_peers();
945d2e
-}
945d2e
-
945d2e
-static gboolean
945d2e
-mcp_quorum_callback(unsigned long long seq, gboolean quorate)
945d2e
-{
945d2e
-    pcmk_quorate = quorate;
945d2e
-    return TRUE;
945d2e
-}
945d2e
-
945d2e
-static void
945d2e
-mcp_quorum_destroy(gpointer user_data)
945d2e
-{
945d2e
-    crm_info("connection lost");
945d2e
-}
945d2e
-
945d2e
 int
945d2e
 main(int argc, char **argv)
945d2e
 {
945d2e
@@ -1226,7 +990,6 @@ main(int argc, char **argv)
945d2e
     struct rlimit cores;
945d2e
     crm_ipc_t *old_instance = NULL;
945d2e
     qb_ipcs_service_t *ipcs = NULL;
945d2e
-    static crm_cluster_t cluster;
945d2e
 
945d2e
     crm_log_preinit(NULL, argc, argv);
945d2e
     pcmk__set_cli_options(NULL, "[options]", long_options,
945d2e
@@ -1397,7 +1160,7 @@ main(int argc, char **argv)
945d2e
     }
945d2e
 
945d2e
     /* Allows us to block shutdown */
945d2e
-    if (cluster_connect_cfg(&local_nodeid) == FALSE) {
945d2e
+    if (!cluster_connect_cfg()) {
945d2e
         crm_err("Couldn't connect to Corosync's CFG service");
945d2e
         crm_exit(CRM_EX_PROTOCOL);
945d2e
     }
945d2e
@@ -1417,34 +1180,13 @@ main(int argc, char **argv)
945d2e
             crm_exit(CRM_EX_FATAL);
945d2e
     };
945d2e
 
945d2e
-    cluster.destroy = mcp_cpg_destroy;
945d2e
-    cluster.cpg.cpg_deliver_fn = mcp_cpg_deliver;
945d2e
-    cluster.cpg.cpg_confchg_fn = mcp_cpg_membership;
945d2e
-
945d2e
-    crm_set_autoreap(FALSE);
945d2e
+    mainloop_add_signal(SIGTERM, pcmk_shutdown);
945d2e
+    mainloop_add_signal(SIGINT, pcmk_shutdown);
945d2e
 
945d2e
-    rc = pcmk_ok;
945d2e
+    init_children_processes();
945d2e
 
945d2e
-    if (cluster_connect_cpg(&cluster) == FALSE) {
945d2e
-        crm_err("Couldn't connect to Corosync's CPG service");
945d2e
-        rc = -ENOPROTOOPT;
945d2e
-
945d2e
-    } else if (cluster_connect_quorum(mcp_quorum_callback, mcp_quorum_destroy)
945d2e
-               == FALSE) {
945d2e
-        rc = -ENOTCONN;
945d2e
-
945d2e
-    } else {
945d2e
-        local_name = get_local_node_name();
945d2e
-        update_node_processes(local_nodeid, local_name, get_process_list());
945d2e
-
945d2e
-        mainloop_add_signal(SIGTERM, pcmk_shutdown);
945d2e
-        mainloop_add_signal(SIGINT, pcmk_shutdown);
945d2e
-
945d2e
-        init_children_processes();
945d2e
-
945d2e
-        crm_notice("Pacemaker daemon successfully started and accepting connections");
945d2e
-        g_main_loop_run(mainloop);
945d2e
-    }
945d2e
+    crm_notice("Pacemaker daemon successfully started and accepting connections");
945d2e
+    g_main_loop_run(mainloop);
945d2e
 
945d2e
     if (ipcs) {
945d2e
         crm_trace("Closing IPC server");
945d2e
@@ -1453,9 +1195,6 @@ main(int argc, char **argv)
945d2e
     }
945d2e
 
945d2e
     g_main_loop_unref(mainloop);
945d2e
-
945d2e
-    cluster_disconnect_cpg(&cluster);
945d2e
     cluster_disconnect_cfg();
945d2e
-
945d2e
-    crm_exit(crm_errno2exit(rc));
945d2e
+    crm_exit(CRM_EX_OK);
945d2e
 }
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.h b/daemons/pacemakerd/pacemakerd.h
945d2e
index d66ab10..ac2d842 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.h
945d2e
+++ b/daemons/pacemakerd/pacemakerd.h
945d2e
@@ -22,7 +22,7 @@
945d2e
 
945d2e
 gboolean mcp_read_config(void);
945d2e
 
945d2e
-gboolean cluster_connect_cfg(uint32_t * nodeid);
945d2e
+gboolean cluster_connect_cfg(void);
945d2e
 gboolean cluster_disconnect_cfg(void);
945d2e
 
945d2e
 void pcmk_shutdown(int nsig);
945d2e
diff --git a/daemons/pacemakerd/pcmkd_corosync.c b/daemons/pacemakerd/pcmkd_corosync.c
945d2e
index ec74908..156f965 100644
945d2e
--- a/daemons/pacemakerd/pcmkd_corosync.c
945d2e
+++ b/daemons/pacemakerd/pcmkd_corosync.c
945d2e
@@ -93,13 +93,14 @@ cluster_disconnect_cfg(void)
945d2e
     } while(counter < max)
945d2e
 
945d2e
 gboolean
945d2e
-cluster_connect_cfg(uint32_t * nodeid)
945d2e
+cluster_connect_cfg(void)
945d2e
 {
945d2e
     cs_error_t rc;
945d2e
     int fd = -1, retries = 0, rv;
945d2e
     uid_t found_uid = 0;
945d2e
     gid_t found_gid = 0;
945d2e
     pid_t found_pid = 0;
945d2e
+    uint32_t nodeid;
945d2e
 
945d2e
     static struct mainloop_fd_callbacks cfg_fd_callbacks = {
945d2e
         .dispatch = pcmk_cfg_dispatch,
945d2e
@@ -134,14 +135,14 @@ cluster_connect_cfg(uint32_t * nodeid)
945d2e
     }
945d2e
 
945d2e
     retries = 0;
945d2e
-    cs_repeat(retries, 30, rc = corosync_cfg_local_get(cfg_handle, nodeid));
945d2e
+    cs_repeat(retries, 30, rc = corosync_cfg_local_get(cfg_handle, &nodeid));
945d2e
 
945d2e
     if (rc != CS_OK) {
945d2e
         crm_err("corosync cfg local_get error %d", rc);
945d2e
         goto bail;
945d2e
     }
945d2e
 
945d2e
-    crm_debug("Our nodeid: %d", *nodeid);
945d2e
+    crm_debug("Our nodeid: %lu", (unsigned long) nodeid);
945d2e
     mainloop_add_fd("corosync-cfg", G_PRIORITY_DEFAULT, fd, &cfg_handle, &cfg_fd_callbacks);
945d2e
 
945d2e
     return TRUE;
945d2e
-- 
945d2e
1.8.3.1
945d2e
945d2e
945d2e
From 23ad3803a12189a369d188f3d3e606142cf16c52 Mon Sep 17 00:00:00 2001
945d2e
From: Ken Gaillot <kgaillot@redhat.com>
945d2e
Date: Thu, 2 Jul 2020 11:25:28 -0500
945d2e
Subject: [PATCH 2/5] Refactor: pacemakerd: functionize removing core file
945d2e
 limit
945d2e
945d2e
... for readability and code isolation
945d2e
---
945d2e
 daemons/pacemakerd/pacemakerd.c | 50 ++++++++++++++++++++++++-----------------
945d2e
 1 file changed, 29 insertions(+), 21 deletions(-)
945d2e
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
945d2e
index 0f7b2db..ac308e7 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.c
945d2e
+++ b/daemons/pacemakerd/pacemakerd.c
945d2e
@@ -975,10 +975,37 @@ init_children_processes(void)
945d2e
     setenv("PCMK_respawned", "true", 1);
945d2e
 }
945d2e
 
945d2e
+static void
945d2e
+remove_core_file_limit(void)
945d2e
+{
945d2e
+    struct rlimit cores;
945d2e
+    int rc = getrlimit(RLIMIT_CORE, &cores);
945d2e
+
945d2e
+    if (rc < 0) {
945d2e
+        crm_perror(LOG_ERR, "Cannot determine current maximum core size.");
945d2e
+        return;
945d2e
+    }
945d2e
+
945d2e
+    if ((cores.rlim_max == 0) && (geteuid() == 0)) {
945d2e
+        cores.rlim_max = RLIM_INFINITY;
945d2e
+    } else {
945d2e
+        crm_info("Maximum core file size is %llu bytes",
945d2e
+                 (unsigned long long) cores.rlim_max);
945d2e
+    }
945d2e
+    cores.rlim_cur = cores.rlim_max;
945d2e
+
945d2e
+    rc = setrlimit(RLIMIT_CORE, &cores);
945d2e
+    if (rc < 0) {
945d2e
+        crm_perror(LOG_ERR,
945d2e
+                   "Core file generation will remain disabled."
945d2e
+                   " Core files are an important diagnostic tool, so"
945d2e
+                   " please consider enabling them by default.");
945d2e
+    }
945d2e
+}
945d2e
+
945d2e
 int
945d2e
 main(int argc, char **argv)
945d2e
 {
945d2e
-    int rc;
945d2e
     int flag;
945d2e
     int argerr = 0;
945d2e
 
945d2e
@@ -987,7 +1014,6 @@ main(int argc, char **argv)
945d2e
 
945d2e
     uid_t pcmk_uid = 0;
945d2e
     gid_t pcmk_gid = 0;
945d2e
-    struct rlimit cores;
945d2e
     crm_ipc_t *old_instance = NULL;
945d2e
     qb_ipcs_service_t *ipcs = NULL;
945d2e
 
945d2e
@@ -1099,25 +1125,7 @@ main(int argc, char **argv)
945d2e
                PACEMAKER_VERSION, BUILD_VERSION, CRM_FEATURES);
945d2e
     mainloop = g_main_loop_new(NULL, FALSE);
945d2e
 
945d2e
-    rc = getrlimit(RLIMIT_CORE, &cores);
945d2e
-    if (rc < 0) {
945d2e
-        crm_perror(LOG_ERR, "Cannot determine current maximum core size.");
945d2e
-    } else {
945d2e
-        if (cores.rlim_max == 0 && geteuid() == 0) {
945d2e
-            cores.rlim_max = RLIM_INFINITY;
945d2e
-        } else {
945d2e
-            crm_info("Maximum core file size is: %lu", (unsigned long)cores.rlim_max);
945d2e
-        }
945d2e
-        cores.rlim_cur = cores.rlim_max;
945d2e
-
945d2e
-        rc = setrlimit(RLIMIT_CORE, &cores);
945d2e
-        if (rc < 0) {
945d2e
-            crm_perror(LOG_ERR,
945d2e
-                       "Core file generation will remain disabled."
945d2e
-                       " Core files are an important diagnostic tool, so"
945d2e
-                       " please consider enabling them by default.");
945d2e
-        }
945d2e
-    }
945d2e
+    remove_core_file_limit();
945d2e
 
945d2e
     if (pcmk_daemon_user(&pcmk_uid, &pcmk_gid) < 0) {
945d2e
         crm_err("Cluster user %s does not exist, aborting Pacemaker startup", CRM_DAEMON_USER);
945d2e
-- 
945d2e
1.8.3.1
945d2e
945d2e
945d2e
From 40b0891dc92767aad8495121afcbd6e68fd3830a Mon Sep 17 00:00:00 2001
945d2e
From: Ken Gaillot <kgaillot@redhat.com>
945d2e
Date: Thu, 2 Jul 2020 11:26:09 -0500
945d2e
Subject: [PATCH 3/5] Log: pacemakerd: improve messages
945d2e
945d2e
---
945d2e
 daemons/pacemakerd/pacemakerd.c     | 22 +++++-----
945d2e
 daemons/pacemakerd/pcmkd_corosync.c | 85 +++++++++++++++++--------------------
945d2e
 2 files changed, 50 insertions(+), 57 deletions(-)
945d2e
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
945d2e
index ac308e7..0f459c0 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.c
945d2e
+++ b/daemons/pacemakerd/pacemakerd.c
945d2e
@@ -13,6 +13,7 @@
945d2e
 #include <pwd.h>
945d2e
 #include <grp.h>
945d2e
 #include <poll.h>
945d2e
+#include <errno.h>
945d2e
 #include <stdio.h>
945d2e
 #include <stdbool.h>
945d2e
 #include <sys/stat.h>
945d2e
@@ -344,7 +345,7 @@ start_child(pcmk_child_t * child)
945d2e
 
945d2e
             // Drop root group access if not needed
945d2e
             if (!need_root_group && (setgid(gid) < 0)) {
945d2e
-                crm_perror(LOG_ERR, "Could not set group to %d", gid);
945d2e
+                crm_warn("Could not set group to %d: %s", gid, strerror(errno));
945d2e
             }
945d2e
 
945d2e
             /* Initialize supplementary groups to only those always granted to
945d2e
@@ -356,7 +357,8 @@ start_child(pcmk_child_t * child)
945d2e
         }
945d2e
 
945d2e
         if (uid && setuid(uid) < 0) {
945d2e
-            crm_perror(LOG_ERR, "Could not set user to %d (%s)", uid, child->uid);
945d2e
+            crm_warn("Could not set user to %s (id %d): %s",
945d2e
+                     child->uid, uid, strerror(errno));
945d2e
         }
945d2e
 
945d2e
         pcmk__close_fds_in_child(true);
945d2e
@@ -370,7 +372,7 @@ start_child(pcmk_child_t * child)
945d2e
         } else {
945d2e
             (void)execvp(child->command, opts_default);
945d2e
         }
945d2e
-        crm_perror(LOG_ERR, "FATAL: Cannot exec %s", child->command);
945d2e
+        crm_crit("Could not execute %s: %s", child->command, strerror(errno));
945d2e
         crm_exit(CRM_EX_FATAL);
945d2e
     }
945d2e
     return TRUE;                /* never reached */
945d2e
@@ -527,8 +529,7 @@ pcmk_ipc_dispatch(qb_ipcs_connection_t * qbc, void *data, size_t size)
945d2e
 
945d2e
     task = crm_element_value(msg, F_CRM_TASK);
945d2e
     if (crm_str_eq(task, CRM_OP_QUIT, TRUE)) {
945d2e
-        /* Time to quit */
945d2e
-        crm_notice("Shutting down in response to ticket %s (%s)",
945d2e
+        crm_notice("Shutting down in response to IPC request %s from %s",
945d2e
                    crm_element_value(msg, F_CRM_REFERENCE), crm_element_value(msg, F_CRM_ORIGIN));
945d2e
         pcmk_shutdown(15);
945d2e
 
945d2e
@@ -982,7 +983,8 @@ remove_core_file_limit(void)
945d2e
     int rc = getrlimit(RLIMIT_CORE, &cores);
945d2e
 
945d2e
     if (rc < 0) {
945d2e
-        crm_perror(LOG_ERR, "Cannot determine current maximum core size.");
945d2e
+        crm_warn("Cannot determine current maximum core file size: %s",
945d2e
+                 strerror(errno));
945d2e
         return;
945d2e
     }
945d2e
 
945d2e
@@ -996,10 +998,8 @@ remove_core_file_limit(void)
945d2e
 
945d2e
     rc = setrlimit(RLIMIT_CORE, &cores);
945d2e
     if (rc < 0) {
945d2e
-        crm_perror(LOG_ERR,
945d2e
-                   "Core file generation will remain disabled."
945d2e
-                   " Core files are an important diagnostic tool, so"
945d2e
-                   " please consider enabling them by default.");
945d2e
+        crm_warn("Cannot raise system limit on core file size "
945d2e
+                 "(consider doing so manually)");
945d2e
     }
945d2e
 }
945d2e
 
945d2e
@@ -1108,7 +1108,6 @@ main(int argc, char **argv)
945d2e
     crm_ipc_destroy(old_instance);
945d2e
 
945d2e
     if (mcp_read_config() == FALSE) {
945d2e
-        crm_notice("Could not obtain corosync config data, exiting");
945d2e
         crm_exit(CRM_EX_UNAVAILABLE);
945d2e
     }
945d2e
 
945d2e
@@ -1169,7 +1168,6 @@ main(int argc, char **argv)
945d2e
 
945d2e
     /* Allows us to block shutdown */
945d2e
     if (!cluster_connect_cfg()) {
945d2e
-        crm_err("Couldn't connect to Corosync's CFG service");
945d2e
         crm_exit(CRM_EX_PROTOCOL);
945d2e
     }
945d2e
 
945d2e
diff --git a/daemons/pacemakerd/pcmkd_corosync.c b/daemons/pacemakerd/pcmkd_corosync.c
945d2e
index 156f965..6f19803 100644
945d2e
--- a/daemons/pacemakerd/pcmkd_corosync.c
945d2e
+++ b/daemons/pacemakerd/pcmkd_corosync.c
945d2e
@@ -28,7 +28,6 @@
945d2e
 
945d2e
 #include <crm/common/ipc_internal.h>  /* PCMK__SPECIAL_PID* */
945d2e
 
945d2e
-enum cluster_type_e stack = pcmk_cluster_unknown;
945d2e
 static corosync_cfg_handle_t cfg_handle;
945d2e
 
945d2e
 /* =::=::=::= CFG - Shutdown stuff =::=::=::= */
945d2e
@@ -63,9 +62,8 @@ pcmk_cfg_dispatch(gpointer user_data)
945d2e
 static void
945d2e
 cfg_connection_destroy(gpointer user_data)
945d2e
 {
945d2e
-    crm_err("Connection destroyed");
945d2e
+    crm_err("Lost connection to Corosync");
945d2e
     cfg_handle = 0;
945d2e
-
945d2e
     pcmk_shutdown(SIGTERM);
945d2e
 }
945d2e
 
945d2e
@@ -85,7 +83,7 @@ cluster_disconnect_cfg(void)
945d2e
 	code;						\
945d2e
 	if(rc == CS_ERR_TRY_AGAIN || rc == CS_ERR_QUEUE_FULL) {  \
945d2e
 	    counter++;					\
945d2e
-	    crm_debug("Retrying operation after %ds", counter);	\
945d2e
+	    crm_debug("Retrying Corosync operation after %ds", counter);    \
945d2e
 	    sleep(counter);				\
945d2e
 	} else {                                        \
945d2e
             break;                                      \
945d2e
@@ -110,41 +108,42 @@ cluster_connect_cfg(void)
945d2e
     cs_repeat(retries, 30, rc = corosync_cfg_initialize(&cfg_handle, &cfg_callbacks));
945d2e
 
945d2e
     if (rc != CS_OK) {
945d2e
-        crm_err("corosync cfg init: %s (%d)", cs_strerror(rc), rc);
945d2e
+        crm_crit("Could not connect to Corosync CFG: %s " CRM_XS " rc=%d",
945d2e
+                 cs_strerror(rc), rc);
945d2e
         return FALSE;
945d2e
     }
945d2e
 
945d2e
     rc = corosync_cfg_fd_get(cfg_handle, &fd;;
945d2e
     if (rc != CS_OK) {
945d2e
-        crm_err("corosync cfg fd_get: %s (%d)", cs_strerror(rc), rc);
945d2e
+        crm_crit("Could not get Corosync CFG descriptor: %s " CRM_XS " rc=%d",
945d2e
+                 cs_strerror(rc), rc);
945d2e
         goto bail;
945d2e
     }
945d2e
 
945d2e
     /* CFG provider run as root (in given user namespace, anyway)? */
945d2e
     if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid,
945d2e
                                             &found_uid, &found_gid))) {
945d2e
-        crm_err("CFG provider is not authentic:"
945d2e
-                " process %lld (uid: %lld, gid: %lld)",
945d2e
-                (long long) PCMK__SPECIAL_PID_AS_0(found_pid),
945d2e
-                (long long) found_uid, (long long) found_gid);
945d2e
+        crm_crit("Rejecting Corosync CFG provider because process %lld "
945d2e
+                 "is running as uid %lld gid %lld, not root",
945d2e
+                  (long long) PCMK__SPECIAL_PID_AS_0(found_pid),
945d2e
+                 (long long) found_uid, (long long) found_gid);
945d2e
         goto bail;
945d2e
     } else if (rv < 0) {
945d2e
-        crm_err("Could not verify authenticity of CFG provider: %s (%d)",
945d2e
-                strerror(-rv), -rv);
945d2e
+        crm_crit("Could not authenticate Corosync CFG provider: %s "
945d2e
+                 CRM_XS " rc=%d", strerror(-rv), -rv);
945d2e
         goto bail;
945d2e
     }
945d2e
 
945d2e
     retries = 0;
945d2e
     cs_repeat(retries, 30, rc = corosync_cfg_local_get(cfg_handle, &nodeid));
945d2e
-
945d2e
     if (rc != CS_OK) {
945d2e
-        crm_err("corosync cfg local_get error %d", rc);
945d2e
+        crm_crit("Could not get local node ID from Corosync: %s "
945d2e
+                 CRM_XS " rc=%d", cs_strerror(rc), rc);
945d2e
         goto bail;
945d2e
     }
945d2e
+    crm_debug("Corosync reports local node ID is %lu", (unsigned long) nodeid);
945d2e
 
945d2e
-    crm_debug("Our nodeid: %lu", (unsigned long) nodeid);
945d2e
     mainloop_add_fd("corosync-cfg", G_PRIORITY_DEFAULT, fd, &cfg_handle, &cfg_fd_callbacks);
945d2e
-
945d2e
     return TRUE;
945d2e
 
945d2e
   bail:
945d2e
@@ -184,14 +183,15 @@ mcp_read_config(void)
945d2e
     gid_t found_gid = 0;
945d2e
     pid_t found_pid = 0;
945d2e
     int rv;
945d2e
+    enum cluster_type_e stack;
945d2e
 
945d2e
     // There can be only one possibility
945d2e
     do {
945d2e
         rc = cmap_initialize(&local_handle);
945d2e
         if (rc != CS_OK) {
945d2e
             retries++;
945d2e
-            printf("cmap connection setup failed: %s.  Retrying in %ds\n", cs_strerror(rc), retries);
945d2e
-            crm_info("cmap connection setup failed: %s.  Retrying in %ds", cs_strerror(rc), retries);
945d2e
+            crm_info("Could not connect to Corosync CMAP: %s (retrying in %ds) "
945d2e
+                     CRM_XS " rc=%d", cs_strerror(rc), retries, rc);
945d2e
             sleep(retries);
945d2e
 
945d2e
         } else {
945d2e
@@ -201,15 +201,15 @@ mcp_read_config(void)
945d2e
     } while (retries < 5);
945d2e
 
945d2e
     if (rc != CS_OK) {
945d2e
-        printf("Could not connect to Cluster Configuration Database API, error %d\n", rc);
945d2e
-        crm_warn("Could not connect to Cluster Configuration Database API, error %d", rc);
945d2e
+        crm_crit("Could not connect to Corosync CMAP: %s "
945d2e
+                 CRM_XS " rc=%d", cs_strerror(rc), rc);
945d2e
         return FALSE;
945d2e
     }
945d2e
 
945d2e
     rc = cmap_fd_get(local_handle, &fd;;
945d2e
     if (rc != CS_OK) {
945d2e
-        crm_err("Could not obtain the CMAP API connection: %s (%d)",
945d2e
-                cs_strerror(rc), rc);
945d2e
+        crm_crit("Could not get Corosync CMAP descriptor: %s " CRM_XS " rc=%d",
945d2e
+                 cs_strerror(rc), rc);
945d2e
         cmap_finalize(local_handle);
945d2e
         return FALSE;
945d2e
     }
945d2e
@@ -217,38 +217,33 @@ mcp_read_config(void)
945d2e
     /* CMAP provider run as root (in given user namespace, anyway)? */
945d2e
     if (!(rv = crm_ipc_is_authentic_process(fd, (uid_t) 0,(gid_t) 0, &found_pid,
945d2e
                                             &found_uid, &found_gid))) {
945d2e
-        crm_err("CMAP provider is not authentic:"
945d2e
-                " process %lld (uid: %lld, gid: %lld)",
945d2e
-                (long long) PCMK__SPECIAL_PID_AS_0(found_pid),
945d2e
-                (long long) found_uid, (long long) found_gid);
945d2e
+        crm_crit("Rejecting Corosync CMAP provider because process %lld "
945d2e
+                 "is running as uid %lld gid %lld, not root",
945d2e
+                 (long long) PCMK__SPECIAL_PID_AS_0(found_pid),
945d2e
+                 (long long) found_uid, (long long) found_gid);
945d2e
         cmap_finalize(local_handle);
945d2e
         return FALSE;
945d2e
     } else if (rv < 0) {
945d2e
-        crm_err("Could not verify authenticity of CMAP provider: %s (%d)",
945d2e
-                strerror(-rv), -rv);
945d2e
+        crm_crit("Could not authenticate Corosync CMAP provider: %s "
945d2e
+                 CRM_XS " rc=%d", strerror(-rv), -rv);
945d2e
         cmap_finalize(local_handle);
945d2e
         return FALSE;
945d2e
     }
945d2e
 
945d2e
     stack = get_cluster_type();
945d2e
-    crm_info("Reading configure for stack: %s", name_for_cluster_type(stack));
945d2e
-
945d2e
-    /* =::=::= Should we be here =::=::= */
945d2e
-    if (stack == pcmk_cluster_corosync) {
945d2e
-        pcmk__set_env_option("cluster_type", "corosync");
945d2e
-        pcmk__set_env_option("quorum_type", "corosync");
945d2e
-
945d2e
-    } else {
945d2e
-        crm_err("Unsupported stack type: %s", name_for_cluster_type(stack));
945d2e
+    if (stack != pcmk_cluster_corosync) {
945d2e
+        crm_crit("Expected corosync stack but detected %s " CRM_XS " stack=%d",
945d2e
+                 name_for_cluster_type(stack), stack);
945d2e
         return FALSE;
945d2e
     }
945d2e
 
945d2e
-    /* =::=::= Logging =::=::= */
945d2e
-    if (pcmk__env_option("debug")) {
945d2e
-        /* Syslog logging is already setup by crm_log_init() */
945d2e
+    crm_info("Reading configuration for %s stack",
945d2e
+             name_for_cluster_type(stack));
945d2e
+    pcmk__set_env_option("cluster_type", "corosync");
945d2e
+    pcmk__set_env_option("quorum_type", "corosync");
945d2e
 
945d2e
-    } else {
945d2e
-        /* Check corosync */
945d2e
+    // If debug logging is not configured, check whether corosync has it
945d2e
+    if (pcmk__env_option("debug") == NULL) {
945d2e
         char *debug_enabled = NULL;
945d2e
 
945d2e
         get_config_opt(config, local_handle, "logging.debug", &debug_enabled, "off");
945d2e
@@ -269,7 +264,7 @@ mcp_read_config(void)
945d2e
     if(local_handle){
945d2e
         gid_t gid = 0;
945d2e
         if (pcmk_daemon_user(NULL, &gid) < 0) {
945d2e
-            crm_warn("Could not authorize group with corosync " CRM_XS
945d2e
+            crm_warn("Could not authorize group with Corosync " CRM_XS
945d2e
                      " No group found for user %s", CRM_DAEMON_USER);
945d2e
 
945d2e
         } else {
945d2e
@@ -277,8 +272,8 @@ mcp_read_config(void)
945d2e
             snprintf(key, PATH_MAX, "uidgid.gid.%u", gid);
945d2e
             rc = cmap_set_uint8(local_handle, key, 1);
945d2e
             if (rc != CS_OK) {
945d2e
-                crm_warn("Could not authorize group with corosync "CRM_XS
945d2e
-                         " group=%u rc=%d (%s)", gid, rc, ais_error2text(rc));
945d2e
+                crm_warn("Could not authorize group with Corosync: %s " CRM_XS
945d2e
+                         " group=%u rc=%d", ais_error2text(rc), gid, rc);
945d2e
             }
945d2e
         }
945d2e
     }
945d2e
-- 
945d2e
1.8.3.1
945d2e
945d2e
945d2e
From c1e12aeb58366f508730defcb8eb6f3ebedac469 Mon Sep 17 00:00:00 2001
945d2e
From: Ken Gaillot <kgaillot@redhat.com>
945d2e
Date: Thu, 23 Apr 2020 13:30:58 -0500
945d2e
Subject: [PATCH 4/5] Refactor: pacemakerd: use existing handle for corosync
945d2e
 shutdown
945d2e
945d2e
---
945d2e
 daemons/pacemakerd/pacemakerd.c     | 31 ++++---------------------------
945d2e
 daemons/pacemakerd/pacemakerd.h     |  1 +
945d2e
 daemons/pacemakerd/pcmkd_corosync.c | 24 +++++++++++++++++++++++-
945d2e
 3 files changed, 28 insertions(+), 28 deletions(-)
945d2e
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
945d2e
index 0f459c0..fb35dfc 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.c
945d2e
+++ b/daemons/pacemakerd/pacemakerd.c
945d2e
@@ -30,10 +30,6 @@
945d2e
 #include <crm/cluster/internal.h>
945d2e
 #include <crm/cluster.h>
945d2e
 
945d2e
-#ifdef SUPPORT_COROSYNC
945d2e
-#include <corosync/cfg.h>
945d2e
-#endif
945d2e
-
945d2e
 #include <dirent.h>
945d2e
 #include <ctype.h>
945d2e
 
945d2e
@@ -145,28 +141,6 @@ pcmk_process_exit(pcmk_child_t * child)
945d2e
     }
945d2e
 }
945d2e
 
945d2e
-static void pcmk_exit_with_cluster(int exitcode)
945d2e
-{
945d2e
-#ifdef SUPPORT_COROSYNC
945d2e
-    corosync_cfg_handle_t cfg_handle;
945d2e
-    cs_error_t err;
945d2e
-
945d2e
-    if (exitcode == CRM_EX_FATAL) {
945d2e
-	    crm_info("Asking Corosync to shut down");
945d2e
-	    err = corosync_cfg_initialize(&cfg_handle, NULL);
945d2e
-	    if (err != CS_OK) {
945d2e
-		    crm_warn("Unable to open handle to corosync to close it down. err=%d", err);
945d2e
-	    }
945d2e
-	    err = corosync_cfg_try_shutdown(cfg_handle, COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE);
945d2e
-	    if (err != CS_OK) {
945d2e
-		    crm_warn("Corosync shutdown failed. err=%d", err);
945d2e
-	    }
945d2e
-	    corosync_cfg_finalize(cfg_handle);
945d2e
-    }
945d2e
-#endif
945d2e
-    crm_exit(exitcode);
945d2e
-}
945d2e
-
945d2e
 static void
945d2e
 pcmk_child_exit(mainloop_child_t * p, pid_t pid, int core, int signo, int exitcode)
945d2e
 {
945d2e
@@ -475,7 +449,10 @@ pcmk_shutdown_worker(gpointer user_data)
945d2e
 
945d2e
     if (fatal_error) {
945d2e
         crm_notice("Shutting down and staying down after fatal error");
945d2e
-        pcmk_exit_with_cluster(CRM_EX_FATAL);
945d2e
+#ifdef SUPPORT_COROSYNC
945d2e
+        pcmkd_shutdown_corosync();
945d2e
+#endif
945d2e
+        crm_exit(CRM_EX_FATAL);
945d2e
     }
945d2e
 
945d2e
     return TRUE;
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.h b/daemons/pacemakerd/pacemakerd.h
945d2e
index ac2d842..5f475fd 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.h
945d2e
+++ b/daemons/pacemakerd/pacemakerd.h
945d2e
@@ -24,5 +24,6 @@ gboolean mcp_read_config(void);
945d2e
 
945d2e
 gboolean cluster_connect_cfg(void);
945d2e
 gboolean cluster_disconnect_cfg(void);
945d2e
+void pcmkd_shutdown_corosync(void);
945d2e
 
945d2e
 void pcmk_shutdown(int nsig);
945d2e
diff --git a/daemons/pacemakerd/pcmkd_corosync.c b/daemons/pacemakerd/pcmkd_corosync.c
945d2e
index 6f19803..82bd257 100644
945d2e
--- a/daemons/pacemakerd/pcmkd_corosync.c
945d2e
+++ b/daemons/pacemakerd/pcmkd_corosync.c
945d2e
@@ -28,7 +28,7 @@
945d2e
 
945d2e
 #include <crm/common/ipc_internal.h>  /* PCMK__SPECIAL_PID* */
945d2e
 
945d2e
-static corosync_cfg_handle_t cfg_handle;
945d2e
+static corosync_cfg_handle_t cfg_handle = 0;
945d2e
 
945d2e
 /* =::=::=::= CFG - Shutdown stuff =::=::=::= */
945d2e
 
945d2e
@@ -151,6 +151,28 @@ cluster_connect_cfg(void)
945d2e
     return FALSE;
945d2e
 }
945d2e
 
945d2e
+void
945d2e
+pcmkd_shutdown_corosync(void)
945d2e
+{
945d2e
+    cs_error_t rc;
945d2e
+
945d2e
+    if (cfg_handle == 0) {
945d2e
+        crm_warn("Unable to shut down Corosync: No connection");
945d2e
+        return;
945d2e
+    }
945d2e
+    crm_info("Asking Corosync to shut down");
945d2e
+    rc = corosync_cfg_try_shutdown(cfg_handle,
945d2e
+                                    COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE);
945d2e
+    if (rc == CS_OK) {
945d2e
+        corosync_cfg_finalize(cfg_handle);
945d2e
+        cfg_handle = 0;
945d2e
+    } else {
945d2e
+        crm_warn("Corosync shutdown failed: %s " CRM_XS " rc=%d",
945d2e
+                 cs_strerror(rc), rc);
945d2e
+    }
945d2e
+}
945d2e
+
945d2e
+
945d2e
 /* =::=::=::= Configuration =::=::=::= */
945d2e
 static int
945d2e
 get_config_opt(uint64_t unused, cmap_handle_t object_handle, const char *key, char **value,
945d2e
-- 
945d2e
1.8.3.1
945d2e
945d2e
945d2e
From e93857b25a22045d5db7bd45c3f026fb82e6da8d Mon Sep 17 00:00:00 2001
945d2e
From: Ken Gaillot <kgaillot@redhat.com>
945d2e
Date: Thu, 23 Apr 2020 13:36:08 -0500
945d2e
Subject: [PATCH 5/5] Build: pacemakerd: properly conditionalize corosync calls
945d2e
945d2e
Previously, pacemakerd in its entirety was not built unless corosync support
945d2e
was enabled, a throwback to when CMAN and Corosync 1 were supported. Now,
945d2e
pacemakerd is built unconditionally, and just its corosync-related calls are
945d2e
guarded by corosync support.
945d2e
945d2e
This has no effect currently since corosync 2+ is the only supported cluster
945d2e
layer, but it offers some future-proofing.
945d2e
---
945d2e
 daemons/pacemakerd/Makefile.am  | 9 ++++-----
945d2e
 daemons/pacemakerd/pacemakerd.c | 6 ++++++
945d2e
 2 files changed, 10 insertions(+), 5 deletions(-)
945d2e
945d2e
diff --git a/daemons/pacemakerd/Makefile.am b/daemons/pacemakerd/Makefile.am
945d2e
index b01d8ef..4cc8a7c 100644
945d2e
--- a/daemons/pacemakerd/Makefile.am
945d2e
+++ b/daemons/pacemakerd/Makefile.am
945d2e
@@ -1,5 +1,5 @@
945d2e
 #
945d2e
-# Copyright 2004-2019 the Pacemaker project contributors
945d2e
+# Copyright 2004-2020 the Pacemaker project contributors
945d2e
 #
945d2e
 # The version control history for this file may have further details.
945d2e
 #
945d2e
@@ -9,8 +9,6 @@
945d2e
 
945d2e
 include $(top_srcdir)/mk/common.mk
945d2e
 
945d2e
-if BUILD_CS_SUPPORT
945d2e
-
945d2e
 initdir			= $(INITDIR)
945d2e
 init_SCRIPTS		= pacemaker
945d2e
 sbin_PROGRAMS		= pacemakerd
945d2e
@@ -30,8 +28,9 @@ pacemakerd_LDFLAGS	= $(LDFLAGS_HARDENED_EXE)
945d2e
 
945d2e
 pacemakerd_LDADD	= $(top_builddir)/lib/cluster/libcrmcluster.la $(top_builddir)/lib/common/libcrmcommon.la
945d2e
 pacemakerd_LDADD	+= $(CLUSTERLIBS)
945d2e
-pacemakerd_SOURCES	= pacemakerd.c pcmkd_corosync.c
945d2e
-
945d2e
+pacemakerd_SOURCES	= pacemakerd.c
945d2e
+if BUILD_CS_SUPPORT
945d2e
+pacemakerd_SOURCES	+= pcmkd_corosync.c
945d2e
 endif
945d2e
 
945d2e
 CLEANFILES = $(man8_MANS)
945d2e
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
945d2e
index fb35dfc..652d6ca 100644
945d2e
--- a/daemons/pacemakerd/pacemakerd.c
945d2e
+++ b/daemons/pacemakerd/pacemakerd.c
945d2e
@@ -1084,9 +1084,11 @@ main(int argc, char **argv)
945d2e
     crm_ipc_close(old_instance);
945d2e
     crm_ipc_destroy(old_instance);
945d2e
 
945d2e
+#ifdef SUPPORT_COROSYNC
945d2e
     if (mcp_read_config() == FALSE) {
945d2e
         crm_exit(CRM_EX_UNAVAILABLE);
945d2e
     }
945d2e
+#endif
945d2e
 
945d2e
     // OCF shell functions and cluster-glue need facility under different name
945d2e
     {
945d2e
@@ -1143,10 +1145,12 @@ main(int argc, char **argv)
945d2e
         crm_exit(CRM_EX_OSERR);
945d2e
     }
945d2e
 
945d2e
+#ifdef SUPPORT_COROSYNC
945d2e
     /* Allows us to block shutdown */
945d2e
     if (!cluster_connect_cfg()) {
945d2e
         crm_exit(CRM_EX_PROTOCOL);
945d2e
     }
945d2e
+#endif
945d2e
 
945d2e
     if(pcmk_locate_sbd() > 0) {
945d2e
         setenv("PCMK_watchdog", "true", 1);
945d2e
@@ -1178,6 +1182,8 @@ main(int argc, char **argv)
945d2e
     }
945d2e
 
945d2e
     g_main_loop_unref(mainloop);
945d2e
+#ifdef SUPPORT_COROSYNC
945d2e
     cluster_disconnect_cfg();
945d2e
+#endif
945d2e
     crm_exit(CRM_EX_OK);
945d2e
 }
945d2e
-- 
945d2e
1.8.3.1
945d2e