|
|
ed4e54 |
From 8270e8aed46f6e672b94f00fe0bde07cd2b6ddd7 Mon Sep 17 00:00:00 2001
|
|
|
ed4e54 |
From: Ken Gaillot <kgaillot@redhat.com>
|
|
|
ed4e54 |
Date: Fri, 13 Dec 2019 11:38:49 -0600
|
|
|
ed4e54 |
Subject: [PATCH 10/18] Low: controller: don't clear shutdown locks when node
|
|
|
ed4e54 |
rejoins
|
|
|
ed4e54 |
|
|
|
ed4e54 |
Add new controld_delete_node_state() values for clearing resource history
|
|
|
ed4e54 |
while preserving shutdown locks. This is accomplished by deleting all
|
|
|
ed4e54 |
unlocked lrm_resource entries and all lrm_rsc_op entries, instead of the entire
|
|
|
ed4e54 |
lrm subsection.
|
|
|
ed4e54 |
---
|
|
|
ed4e54 |
daemons/controld/controld_based.c | 22 +++++++++++++++++++++-
|
|
|
ed4e54 |
daemons/controld/controld_join_dc.c | 7 +++++--
|
|
|
ed4e54 |
daemons/controld/controld_remote_ra.c | 16 ++++++++++------
|
|
|
ed4e54 |
daemons/controld/controld_utils.h | 2 ++
|
|
|
ed4e54 |
4 files changed, 38 insertions(+), 9 deletions(-)
|
|
|
ed4e54 |
|
|
|
ed4e54 |
diff --git a/daemons/controld/controld_based.c b/daemons/controld/controld_based.c
|
|
|
ed4e54 |
index f3a7c4f..0ffc1e8 100644
|
|
|
ed4e54 |
--- a/daemons/controld/controld_based.c
|
|
|
ed4e54 |
+++ b/daemons/controld/controld_based.c
|
|
|
ed4e54 |
@@ -191,12 +191,21 @@ cib_delete_callback(xmlNode *msg, int call_id, int rc, xmlNode *output,
|
|
|
ed4e54 |
// Node's lrm section (name 1x)
|
|
|
ed4e54 |
#define XPATH_NODE_LRM XPATH_NODE_STATE "/" XML_CIB_TAG_LRM
|
|
|
ed4e54 |
|
|
|
ed4e54 |
+// Node's lrm_rsc_op entries and lrm_resource entries without lock (name 2x)
|
|
|
ed4e54 |
+#define XPATH_NODE_LRM_UNLOCKED XPATH_NODE_STATE "//" XML_LRM_TAG_RSC_OP \
|
|
|
ed4e54 |
+ "|" XPATH_NODE_STATE \
|
|
|
ed4e54 |
+ "//" XML_LRM_TAG_RESOURCE \
|
|
|
ed4e54 |
+ "[not(@" XML_CONFIG_ATTR_SHUTDOWN_LOCK ")]"
|
|
|
ed4e54 |
+
|
|
|
ed4e54 |
// Node's transient_attributes section (name 1x)
|
|
|
ed4e54 |
#define XPATH_NODE_ATTRS XPATH_NODE_STATE "/" XML_TAG_TRANSIENT_NODEATTRS
|
|
|
ed4e54 |
|
|
|
ed4e54 |
// Everything under node_state (name 1x)
|
|
|
ed4e54 |
#define XPATH_NODE_ALL XPATH_NODE_STATE "/*"
|
|
|
ed4e54 |
|
|
|
ed4e54 |
+// Unlocked history + transient attributes (name 3x)
|
|
|
ed4e54 |
+#define XPATH_NODE_ALL_UNLOCKED XPATH_NODE_LRM_UNLOCKED "|" XPATH_NODE_ATTRS
|
|
|
ed4e54 |
+
|
|
|
ed4e54 |
/*!
|
|
|
ed4e54 |
* \internal
|
|
|
ed4e54 |
* \brief Delete subsection of a node's CIB node_state
|
|
|
ed4e54 |
@@ -218,6 +227,11 @@ controld_delete_node_state(const char *uname, enum controld_section_e section,
|
|
|
ed4e54 |
xpath = crm_strdup_printf(XPATH_NODE_LRM, uname);
|
|
|
ed4e54 |
desc = crm_strdup_printf("resource history for node %s", uname);
|
|
|
ed4e54 |
break;
|
|
|
ed4e54 |
+ case controld_section_lrm_unlocked:
|
|
|
ed4e54 |
+ xpath = crm_strdup_printf(XPATH_NODE_LRM_UNLOCKED, uname, uname);
|
|
|
ed4e54 |
+ desc = crm_strdup_printf("resource history (other than shutdown "
|
|
|
ed4e54 |
+ "locks) for node %s", uname);
|
|
|
ed4e54 |
+ break;
|
|
|
ed4e54 |
case controld_section_attrs:
|
|
|
ed4e54 |
xpath = crm_strdup_printf(XPATH_NODE_ATTRS, uname);
|
|
|
ed4e54 |
desc = crm_strdup_printf("transient attributes for node %s", uname);
|
|
|
ed4e54 |
@@ -226,6 +240,12 @@ controld_delete_node_state(const char *uname, enum controld_section_e section,
|
|
|
ed4e54 |
xpath = crm_strdup_printf(XPATH_NODE_ALL, uname);
|
|
|
ed4e54 |
desc = crm_strdup_printf("all state for node %s", uname);
|
|
|
ed4e54 |
break;
|
|
|
ed4e54 |
+ case controld_section_all_unlocked:
|
|
|
ed4e54 |
+ xpath = crm_strdup_printf(XPATH_NODE_ALL_UNLOCKED,
|
|
|
ed4e54 |
+ uname, uname, uname);
|
|
|
ed4e54 |
+ desc = crm_strdup_printf("all state (other than shutdown locks) "
|
|
|
ed4e54 |
+ "for node %s", uname);
|
|
|
ed4e54 |
+ break;
|
|
|
ed4e54 |
}
|
|
|
ed4e54 |
|
|
|
ed4e54 |
if (fsa_cib_conn == NULL) {
|
|
|
ed4e54 |
@@ -234,7 +254,7 @@ controld_delete_node_state(const char *uname, enum controld_section_e section,
|
|
|
ed4e54 |
} else {
|
|
|
ed4e54 |
int call_id;
|
|
|
ed4e54 |
|
|
|
ed4e54 |
- options |= cib_quorum_override|cib_xpath;
|
|
|
ed4e54 |
+ options |= cib_quorum_override|cib_xpath|cib_multiple;
|
|
|
ed4e54 |
call_id = fsa_cib_conn->cmds->remove(fsa_cib_conn, xpath, NULL, options);
|
|
|
ed4e54 |
crm_info("Deleting %s (via CIB call %d) " CRM_XS " xpath=%s",
|
|
|
ed4e54 |
desc, call_id, xpath);
|
|
|
ed4e54 |
diff --git a/daemons/controld/controld_join_dc.c b/daemons/controld/controld_join_dc.c
|
|
|
ed4e54 |
index 885b2a9..f0eb2a2 100644
|
|
|
ed4e54 |
--- a/daemons/controld/controld_join_dc.c
|
|
|
ed4e54 |
+++ b/daemons/controld/controld_join_dc.c
|
|
|
ed4e54 |
@@ -534,6 +534,7 @@ do_dc_join_ack(long long action,
|
|
|
ed4e54 |
int join_id = -1;
|
|
|
ed4e54 |
int call_id = 0;
|
|
|
ed4e54 |
ha_msg_input_t *join_ack = fsa_typed_data(fsa_dt_ha_msg);
|
|
|
ed4e54 |
+ enum controld_section_e section = controld_section_lrm;
|
|
|
ed4e54 |
|
|
|
ed4e54 |
const char *op = crm_element_value(join_ack->msg, F_CRM_TASK);
|
|
|
ed4e54 |
const char *join_from = crm_element_value(join_ack->msg, F_CRM_HOST_FROM);
|
|
|
ed4e54 |
@@ -583,8 +584,10 @@ do_dc_join_ack(long long action,
|
|
|
ed4e54 |
/* Update CIB with node's current executor state. A new transition will be
|
|
|
ed4e54 |
* triggered later, when the CIB notifies us of the change.
|
|
|
ed4e54 |
*/
|
|
|
ed4e54 |
- controld_delete_node_state(join_from, controld_section_lrm,
|
|
|
ed4e54 |
- cib_scope_local);
|
|
|
ed4e54 |
+ if (controld_shutdown_lock_enabled) {
|
|
|
ed4e54 |
+ section = controld_section_lrm_unlocked;
|
|
|
ed4e54 |
+ }
|
|
|
ed4e54 |
+ controld_delete_node_state(join_from, section, cib_scope_local);
|
|
|
ed4e54 |
if (safe_str_eq(join_from, fsa_our_uname)) {
|
|
|
ed4e54 |
xmlNode *now_dc_lrmd_state = controld_query_executor_state(fsa_our_uname);
|
|
|
ed4e54 |
|
|
|
ed4e54 |
diff --git a/daemons/controld/controld_remote_ra.c b/daemons/controld/controld_remote_ra.c
|
|
|
ed4e54 |
index 2d3dfa7..a81c354 100644
|
|
|
ed4e54 |
--- a/daemons/controld/controld_remote_ra.c
|
|
|
ed4e54 |
+++ b/daemons/controld/controld_remote_ra.c
|
|
|
ed4e54 |
@@ -1,5 +1,5 @@
|
|
|
ed4e54 |
/*
|
|
|
ed4e54 |
- * Copyright 2013-2019 the Pacemaker project contributors
|
|
|
ed4e54 |
+ * Copyright 2013-2020 the Pacemaker project contributors
|
|
|
ed4e54 |
*
|
|
|
ed4e54 |
* The version control history for this file may have further details.
|
|
|
ed4e54 |
*
|
|
|
ed4e54 |
@@ -177,17 +177,21 @@ remote_node_up(const char *node_name)
|
|
|
ed4e54 |
int call_opt, call_id = 0;
|
|
|
ed4e54 |
xmlNode *update, *state;
|
|
|
ed4e54 |
crm_node_t *node;
|
|
|
ed4e54 |
+ enum controld_section_e section = controld_section_all;
|
|
|
ed4e54 |
|
|
|
ed4e54 |
CRM_CHECK(node_name != NULL, return);
|
|
|
ed4e54 |
crm_info("Announcing pacemaker_remote node %s", node_name);
|
|
|
ed4e54 |
|
|
|
ed4e54 |
- /* Clear node's entire state (resource history and transient attributes).
|
|
|
ed4e54 |
- * The transient attributes should and normally will be cleared when the
|
|
|
ed4e54 |
- * node leaves, but since remote node state has a number of corner cases,
|
|
|
ed4e54 |
- * clear them here as well, to be sure.
|
|
|
ed4e54 |
+ /* Clear node's entire state (resource history and transient attributes)
|
|
|
ed4e54 |
+ * other than shutdown locks. The transient attributes should and normally
|
|
|
ed4e54 |
+ * will be cleared when the node leaves, but since remote node state has a
|
|
|
ed4e54 |
+ * number of corner cases, clear them here as well, to be sure.
|
|
|
ed4e54 |
*/
|
|
|
ed4e54 |
call_opt = crmd_cib_smart_opt();
|
|
|
ed4e54 |
- controld_delete_node_state(node_name, controld_section_all, call_opt);
|
|
|
ed4e54 |
+ if (controld_shutdown_lock_enabled) {
|
|
|
ed4e54 |
+ section = controld_section_all_unlocked;
|
|
|
ed4e54 |
+ }
|
|
|
ed4e54 |
+ controld_delete_node_state(node_name, section, call_opt);
|
|
|
ed4e54 |
|
|
|
ed4e54 |
/* Clear node's probed attribute */
|
|
|
ed4e54 |
update_attrd(node_name, CRM_OP_PROBED, NULL, NULL, TRUE);
|
|
|
ed4e54 |
diff --git a/daemons/controld/controld_utils.h b/daemons/controld/controld_utils.h
|
|
|
ed4e54 |
index 8e31007..5549636 100644
|
|
|
ed4e54 |
--- a/daemons/controld/controld_utils.h
|
|
|
ed4e54 |
+++ b/daemons/controld/controld_utils.h
|
|
|
ed4e54 |
@@ -90,8 +90,10 @@ bool controld_action_is_recordable(const char *action);
|
|
|
ed4e54 |
// Subsections of node_state
|
|
|
ed4e54 |
enum controld_section_e {
|
|
|
ed4e54 |
controld_section_lrm,
|
|
|
ed4e54 |
+ controld_section_lrm_unlocked,
|
|
|
ed4e54 |
controld_section_attrs,
|
|
|
ed4e54 |
controld_section_all,
|
|
|
ed4e54 |
+ controld_section_all_unlocked
|
|
|
ed4e54 |
};
|
|
|
ed4e54 |
|
|
|
ed4e54 |
void controld_delete_node_state(const char *uname,
|
|
|
ed4e54 |
--
|
|
|
ed4e54 |
1.8.3.1
|
|
|
ed4e54 |
|