Blame SOURCES/006-shutdown-lock.patch

ed4e54
From 3d8a7dc405e98cd8fe637d3e283bc0468d50bc71 Mon Sep 17 00:00:00 2001
ed4e54
From: Ken Gaillot <kgaillot@redhat.com>
ed4e54
Date: Wed, 15 Jan 2020 17:56:44 -0600
ed4e54
Subject: [PATCH 02/18] Refactor: controller: functionize parts of resource
ed4e54
 deletion notification
ed4e54
ed4e54
... for future reuse
ed4e54
---
ed4e54
 daemons/controld/controld_execd.c | 116 +++++++++++++++++++++++++-------------
ed4e54
 daemons/controld/controld_lrm.h   |  11 +++-
ed4e54
 2 files changed, 88 insertions(+), 39 deletions(-)
ed4e54
ed4e54
diff --git a/daemons/controld/controld_execd.c b/daemons/controld/controld_execd.c
ed4e54
index 212739e..82f2bf1 100644
ed4e54
--- a/daemons/controld/controld_execd.c
ed4e54
+++ b/daemons/controld/controld_execd.c
ed4e54
@@ -42,9 +42,6 @@ static lrmd_event_data_t *construct_op(lrm_state_t * lrm_state, xmlNode * rsc_op
ed4e54
 static void do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc,
ed4e54
                           const char *operation, xmlNode *msg);
ed4e54
 
ed4e54
-void send_direct_ack(const char *to_host, const char *to_sys,
ed4e54
-                     lrmd_rsc_info_t * rsc, lrmd_event_data_t * op, const char *rsc_id);
ed4e54
-
ed4e54
 static gboolean lrm_state_verify_stopped(lrm_state_t * lrm_state, enum crmd_fsa_state cur_state,
ed4e54
                                          int log_level);
ed4e54
 static int do_update_resource(const char *node_name, lrmd_rsc_info_t * rsc, lrmd_event_data_t * op);
ed4e54
@@ -278,7 +275,7 @@ send_task_ok_ack(lrm_state_t *lrm_state, ha_msg_input_t *input,
ed4e54
 
ed4e54
     op->rc = PCMK_OCF_OK;
ed4e54
     op->op_status = PCMK_LRM_OP_DONE;
ed4e54
-    send_direct_ack(ack_host, ack_sys, rsc, op, rsc_id);
ed4e54
+    controld_ack_event_directly(ack_host, ack_sys, rsc, op, rsc_id);
ed4e54
     lrmd_free_event(op);
ed4e54
 }
ed4e54
 
ed4e54
@@ -850,6 +847,57 @@ controld_query_executor_state(const char *node_name)
ed4e54
                                  node_update_cluster|node_update_peer);
ed4e54
 }
ed4e54
 
ed4e54
+/*!
ed4e54
+ * \internal
ed4e54
+ * \brief Map standard Pacemaker return code to operation status and OCF code
ed4e54
+ *
ed4e54
+ * \param[out] event  Executor event whose status and return code should be set
ed4e54
+ * \param[in]  rc     Standard Pacemaker return code
ed4e54
+ */
ed4e54
+void
ed4e54
+controld_rc2event(lrmd_event_data_t *event, int rc)
ed4e54
+{
ed4e54
+    switch (rc) {
ed4e54
+        case pcmk_rc_ok:
ed4e54
+            event->rc = PCMK_OCF_OK;
ed4e54
+            event->op_status = PCMK_LRM_OP_DONE;
ed4e54
+            break;
ed4e54
+        case EACCES:
ed4e54
+            event->rc = PCMK_OCF_INSUFFICIENT_PRIV;
ed4e54
+            event->op_status = PCMK_LRM_OP_ERROR;
ed4e54
+            break;
ed4e54
+        default:
ed4e54
+            event->rc = PCMK_OCF_UNKNOWN_ERROR;
ed4e54
+            event->op_status = PCMK_LRM_OP_ERROR;
ed4e54
+            break;
ed4e54
+    }
ed4e54
+}
ed4e54
+
ed4e54
+/*!
ed4e54
+ * \internal
ed4e54
+ * \brief Trigger a new transition after CIB status was deleted
ed4e54
+ *
ed4e54
+ * If a CIB status delete was not expected (as part of the transition graph),
ed4e54
+ * trigger a new transition by updating the (arbitrary) "last-lrm-refresh"
ed4e54
+ * cluster property.
ed4e54
+ *
ed4e54
+ * \param[in] from_sys  IPC name that requested the delete
ed4e54
+ * \param[in] rsc_id    Resource whose status was deleted (for logging only)
ed4e54
+ */
ed4e54
+void
ed4e54
+controld_trigger_delete_refresh(const char *from_sys, const char *rsc_id)
ed4e54
+{
ed4e54
+    if (safe_str_neq(from_sys, CRM_SYSTEM_TENGINE)) {
ed4e54
+        char *now_s = crm_strdup_printf("%lld", (long long) time(NULL));
ed4e54
+
ed4e54
+        crm_debug("Triggering a refresh after %s cleaned %s", from_sys, rsc_id);
ed4e54
+        update_attr_delegate(fsa_cib_conn, cib_none, XML_CIB_TAG_CRMCONFIG,
ed4e54
+                             NULL, NULL, NULL, NULL, "last-lrm-refresh", now_s,
ed4e54
+                             FALSE, NULL, NULL);
ed4e54
+        free(now_s);
ed4e54
+    }
ed4e54
+}
ed4e54
+
ed4e54
 static void
ed4e54
 notify_deleted(lrm_state_t * lrm_state, ha_msg_input_t * input, const char *rsc_id, int rc)
ed4e54
 {
ed4e54
@@ -860,33 +908,11 @@ notify_deleted(lrm_state_t * lrm_state, ha_msg_input_t * input, const char *rsc_
ed4e54
     crm_info("Notifying %s on %s that %s was%s deleted",
ed4e54
              from_sys, (from_host? from_host : "localhost"), rsc_id,
ed4e54
              ((rc == pcmk_ok)? "" : " not"));
ed4e54
-
ed4e54
     op = construct_op(lrm_state, input->xml, rsc_id, CRMD_ACTION_DELETE);
ed4e54
-
ed4e54
-    if (rc == pcmk_ok) {
ed4e54
-        op->op_status = PCMK_LRM_OP_DONE;
ed4e54
-        op->rc = PCMK_OCF_OK;
ed4e54
-    } else {
ed4e54
-        op->op_status = PCMK_LRM_OP_ERROR;
ed4e54
-        op->rc = PCMK_OCF_UNKNOWN_ERROR;
ed4e54
-    }
ed4e54
-
ed4e54
-    send_direct_ack(from_host, from_sys, NULL, op, rsc_id);
ed4e54
+    controld_rc2event(op, pcmk_legacy2rc(rc));
ed4e54
+    controld_ack_event_directly(from_host, from_sys, NULL, op, rsc_id);
ed4e54
     lrmd_free_event(op);
ed4e54
-
ed4e54
-    if (safe_str_neq(from_sys, CRM_SYSTEM_TENGINE)) {
ed4e54
-        /* this isn't expected - trigger a new transition */
ed4e54
-        time_t now = time(NULL);
ed4e54
-        char *now_s = crm_itoa(now);
ed4e54
-
ed4e54
-        crm_debug("Triggering a refresh after %s deleted %s from the executor",
ed4e54
-                  from_sys, rsc_id);
ed4e54
-
ed4e54
-        update_attr_delegate(fsa_cib_conn, cib_none, XML_CIB_TAG_CRMCONFIG, NULL, NULL, NULL, NULL,
ed4e54
-                             "last-lrm-refresh", now_s, FALSE, NULL, NULL);
ed4e54
-
ed4e54
-        free(now_s);
ed4e54
-    }
ed4e54
+    controld_trigger_delete_refresh(from_sys, rsc_id);
ed4e54
 }
ed4e54
 
ed4e54
 static gboolean
ed4e54
@@ -1495,7 +1521,7 @@ fail_lrm_resource(xmlNode *xml, lrm_state_t *lrm_state, const char *user_name,
ed4e54
 #if ENABLE_ACL
ed4e54
     if (user_name && is_privileged(user_name) == FALSE) {
ed4e54
         crm_err("%s does not have permission to fail %s", user_name, ID(xml_rsc));
ed4e54
-        send_direct_ack(from_host, from_sys, NULL, op, ID(xml_rsc));
ed4e54
+        controld_ack_event_directly(from_host, from_sys, NULL, op, ID(xml_rsc));
ed4e54
         lrmd_free_event(op);
ed4e54
         return;
ed4e54
     }
ed4e54
@@ -1514,7 +1540,7 @@ fail_lrm_resource(xmlNode *xml, lrm_state_t *lrm_state, const char *user_name,
ed4e54
         crm_log_xml_warn(xml, "bad input");
ed4e54
     }
ed4e54
 
ed4e54
-    send_direct_ack(from_host, from_sys, NULL, op, ID(xml_rsc));
ed4e54
+    controld_ack_event_directly(from_host, from_sys, NULL, op, ID(xml_rsc));
ed4e54
     lrmd_free_event(op);
ed4e54
 }
ed4e54
 
ed4e54
@@ -1684,7 +1710,7 @@ do_lrm_delete(ha_msg_input_t *input, lrm_state_t *lrm_state,
ed4e54
         } else {
ed4e54
             op->rc = PCMK_OCF_UNKNOWN_ERROR;
ed4e54
         }
ed4e54
-        send_direct_ack(from_host, from_sys, NULL, op, rsc->id);
ed4e54
+        controld_ack_event_directly(from_host, from_sys, NULL, op, rsc->id);
ed4e54
         lrmd_free_event(op);
ed4e54
         return;
ed4e54
     }
ed4e54
@@ -2000,9 +2026,23 @@ construct_op(lrm_state_t * lrm_state, xmlNode * rsc_op, const char *rsc_id, cons
ed4e54
     return op;
ed4e54
 }
ed4e54
 
ed4e54
+/*!
ed4e54
+ * \internal
ed4e54
+ * \brief Send a (synthesized) event result
ed4e54
+ *
ed4e54
+ * Reply with a synthesized event result directly, as opposed to going through
ed4e54
+ * the executor.
ed4e54
+ *
ed4e54
+ * \param[in] to_host  Host to send result to
ed4e54
+ * \param[in] to_sys   IPC name to send result to (NULL for transition engine)
ed4e54
+ * \param[in] rsc      Type information about resource the result is for
ed4e54
+ * \param[in] op       Event with result to send
ed4e54
+ * \param[in] rsc_id   ID of resource the result is for
ed4e54
+ */
ed4e54
 void
ed4e54
-send_direct_ack(const char *to_host, const char *to_sys,
ed4e54
-                lrmd_rsc_info_t * rsc, lrmd_event_data_t * op, const char *rsc_id)
ed4e54
+controld_ack_event_directly(const char *to_host, const char *to_sys,
ed4e54
+                            lrmd_rsc_info_t *rsc, lrmd_event_data_t *op,
ed4e54
+                            const char *rsc_id)
ed4e54
 {
ed4e54
     xmlNode *reply = NULL;
ed4e54
     xmlNode *update, *iter;
ed4e54
@@ -2221,7 +2261,7 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc,
ed4e54
 
ed4e54
         op->rc = PCMK_OCF_UNKNOWN_ERROR;
ed4e54
         op->op_status = PCMK_LRM_OP_INVALID;
ed4e54
-        send_direct_ack(NULL, NULL, rsc, op, rsc->id);
ed4e54
+        controld_ack_event_directly(NULL, NULL, rsc, op, rsc->id);
ed4e54
         lrmd_free_event(op);
ed4e54
         free(op_id);
ed4e54
         return;
ed4e54
@@ -2288,7 +2328,7 @@ do_lrm_rsc_op(lrm_state_t *lrm_state, lrmd_rsc_info_t *rsc,
ed4e54
             decode_transition_key(op->user_data, NULL, NULL, NULL, &target_rc);
ed4e54
             op->rc = target_rc;
ed4e54
             op->op_status = PCMK_LRM_OP_DONE;
ed4e54
-            send_direct_ack(NULL, NULL, rsc, op, rsc->id);
ed4e54
+            controld_ack_event_directly(NULL, NULL, rsc, op, rsc->id);
ed4e54
         }
ed4e54
 
ed4e54
         pending->params = op->params;
ed4e54
@@ -2388,7 +2428,7 @@ do_update_resource(const char *node_name, lrmd_rsc_info_t * rsc, lrmd_event_data
ed4e54
 
ed4e54
     } else {
ed4e54
         crm_warn("Resource %s no longer exists in the executor", op->rsc_id);
ed4e54
-        send_direct_ack(NULL, NULL, rsc, op, op->rsc_id);
ed4e54
+        controld_ack_event_directly(NULL, NULL, rsc, op, op->rsc_id);
ed4e54
         goto cleanup;
ed4e54
     }
ed4e54
 
ed4e54
@@ -2660,7 +2700,7 @@ process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op,
ed4e54
     }
ed4e54
 
ed4e54
     if (need_direct_ack) {
ed4e54
-        send_direct_ack(NULL, NULL, NULL, op, op->rsc_id);
ed4e54
+        controld_ack_event_directly(NULL, NULL, NULL, op, op->rsc_id);
ed4e54
     }
ed4e54
 
ed4e54
     if(remove == FALSE) {
ed4e54
diff --git a/daemons/controld/controld_lrm.h b/daemons/controld/controld_lrm.h
ed4e54
index 3ab7048..7acac2a 100644
ed4e54
--- a/daemons/controld/controld_lrm.h
ed4e54
+++ b/daemons/controld/controld_lrm.h
ed4e54
@@ -1,11 +1,13 @@
ed4e54
 /*
ed4e54
- * Copyright 2004-2019 the Pacemaker project contributors
ed4e54
+ * Copyright 2004-2020 the Pacemaker project contributors
ed4e54
  *
ed4e54
  * The version control history for this file may have further details.
ed4e54
  *
ed4e54
  * This source code is licensed under the GNU Lesser General Public License
ed4e54
  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
ed4e54
  */
ed4e54
+#ifndef CONTROLD_LRM__H
ed4e54
+#  define CONTROLD_LRM__H
ed4e54
 
ed4e54
 #include <controld_messages.h>
ed4e54
 #include <controld_metadata.h>
ed4e54
@@ -169,3 +171,10 @@ gboolean remote_ra_controlling_guest(lrm_state_t * lrm_state);
ed4e54
 
ed4e54
 void process_lrm_event(lrm_state_t *lrm_state, lrmd_event_data_t *op,
ed4e54
                        active_op_t *pending, xmlNode *action_xml);
ed4e54
+void controld_ack_event_directly(const char *to_host, const char *to_sys,
ed4e54
+                                 lrmd_rsc_info_t *rsc, lrmd_event_data_t *op,
ed4e54
+                                 const char *rsc_id);
ed4e54
+void controld_rc2event(lrmd_event_data_t *event, int rc);
ed4e54
+void controld_trigger_delete_refresh(const char *from_sys, const char *rsc_id);
ed4e54
+
ed4e54
+#endif
ed4e54
-- 
ed4e54
1.8.3.1
ed4e54