File bsc#1207319-0002-Fix-libpacemaker-avoid-assertion-failure-if-a-node_s.patch of Package pacemaker.29789
From e46bd496da15932f697b23d7a6e2441575e450ba Mon Sep 17 00:00:00 2001
From: "Gao,Yan" <ygao@suse.com>
Date: Wed, 25 Jan 2023 12:36:37 +0100
Subject: [PATCH 2/2] Fix: libpacemaker: avoid assertion failure if a
node_state entry doesn't have an uname yet
It's possible that a node_state entry doesn't have an uname yet.
Previously in that case upon simulate_fencing_action(), crm_simulate
would encounter an assertion failure in pcmk__inject_node() at:
CRM_ASSERT(rc == pcmk_ok);
, since a query by uname wouldn't find the existing node_state entry,
then the unnecessary creation of a new entry would conflict with the
existing one and a new query by uname would still get nothing.
This commit fixes it by finding the existing node_state entry by node id
and adding its uname to the entry rather than creating a new entry.
---
lib/pacemaker/pcmk_sched_transition.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
Index: pacemaker-2.1.2+20211124.ada5c3b36/lib/pacemaker/pcmk_sched_transition.c
===================================================================
--- pacemaker-2.1.2+20211124.ada5c3b36.orig/lib/pacemaker/pcmk_sched_transition.c
+++ pacemaker-2.1.2+20211124.ada5c3b36/lib/pacemaker/pcmk_sched_transition.c
@@ -158,6 +158,7 @@ inject_node_state(cib_t * cib_conn, cons
xmlNode *cib_object = NULL;
char *xpath = crm_strdup_printf(NODE_TEMPLATE, node);
bool duplicate = false;
+ char *found_uuid = NULL;
if (bringing_nodes_online) {
create_node_entry(cib_conn, node);
@@ -173,21 +174,45 @@ inject_node_state(cib_t * cib_conn, cons
}
if (rc == -ENXIO) {
- char *found_uuid = NULL;
-
if (uuid == NULL) {
query_node_uuid(cib_conn, node, &found_uuid, NULL);
} else {
found_uuid = strdup(uuid);
}
+ if (found_uuid) {
+ char *xpath_by_uuid = crm_strdup_printf("//" XML_CIB_TAG_STATE "[@" XML_ATTR_ID "='%s']",
+ found_uuid);
+
+ // It's possible that a node_state entry doesn't have an uname yet.
+ rc = cib_conn->cmds->query(cib_conn, xpath_by_uuid, &cib_object,
+ cib_xpath|cib_sync_call|cib_scope_local);
+
+ if ((cib_object != NULL) && (ID(cib_object) == NULL)) {
+ crm_err("Detected multiple node_state entries for xpath=%s, bailing",
+ xpath_by_uuid);
+ duplicate = true;
+ free(xpath_by_uuid);
+ goto done;
+
+ } else if (cib_object != NULL) {
+ crm_xml_add(cib_object, XML_ATTR_UNAME, node);
+
+ rc = cib_conn->cmds->modify(cib_conn, XML_CIB_TAG_STATUS, cib_object,
+ cib_sync_call|cib_scope_local);
+ }
+
+ free(xpath_by_uuid);
+ }
+ }
+
+ if (rc == -ENXIO) {
cib_object = create_xml_node(NULL, XML_CIB_TAG_STATE);
crm_xml_add(cib_object, XML_ATTR_UUID, found_uuid);
crm_xml_add(cib_object, XML_ATTR_UNAME, node);
cib_conn->cmds->create(cib_conn, XML_CIB_TAG_STATUS, cib_object,
cib_sync_call | cib_scope_local);
free_xml(cib_object);
- free(found_uuid);
rc = cib_conn->cmds->query(cib_conn, xpath, &cib_object,
cib_xpath | cib_sync_call | cib_scope_local);
@@ -195,6 +220,7 @@ inject_node_state(cib_t * cib_conn, cons
}
done:
+ free(found_uuid);
free(xpath);
if (duplicate) {