|
|
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 |
|