File pacemaker#3413-0001-Low-libpacemaker-pcmk__inject_failcount-should-set-a.patch of Package pacemaker.34782
From ce3a9863dfbf5d20eedccab45da877feffac1470 Mon Sep 17 00:00:00 2001
From: Reid Wahl <nrwahl@protonmail.com>
Date: Wed, 3 Apr 2024 16:43:43 -0700
Subject: [PATCH 1/3] Low: libpacemaker: pcmk__inject_failcount should set an
integer value
Currently it sets the new failcount value to "value++". The idea was
that this should increment the existing value. In practice, it always
sets the value to 1. This is due to a bug in fix_plus_plus_recursive
that will be fixed in an upcoming commit. To summarize,
fix_plus_plus_recursive() doesn't have access to the initial value, so
it treats the initial value as zero when incrementing it.
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
---
lib/pacemaker/libpacemaker_private.h | 6 +--
lib/pacemaker/pcmk_sched_transition.c | 59 +++++++++++++++++++---------
lib/pacemaker/pcmk_simulate.c | 2 +-
3 files changed, 44 insertions(+), 23 deletions(-)
Index: pacemaker-2.0.5+20201202.ba59be712/lib/pacemaker/pcmk_sched_transition.c
===================================================================
--- pacemaker-2.0.5+20201202.ba59be712.orig/lib/pacemaker/pcmk_sched_transition.c
+++ pacemaker-2.0.5+20201202.ba59be712/lib/pacemaker/pcmk_sched_transition.c
@@ -77,28 +77,48 @@ inject_transient_attr(xmlNode * cib_node
}
static void
-update_failcounts(xmlNode * cib_node, const char *resource, const char *task,
- guint interval_ms, int rc)
+update_failcounts(cib_t *cib_conn, xmlNode *cib_node,
+ const char *resource, const char *task,
+ guint interval_ms, int exit_status)
{
- if (rc == 0) {
- return;
+ char *name = NULL;
+ char *value = NULL;
+
+ int failcount = 0;
+
+ CRM_CHECK((cib_conn != NULL) && (cib_node != NULL)
+ && (resource != NULL) && (task != NULL), return);
- } else if ((rc == 7) && (interval_ms == 0)) {
+ if ((exit_status == PCMK_OCF_OK)
+ || ((exit_status == PCMK_OCF_NOT_RUNNING) && (interval_ms == 0))) {
return;
+ }
- } else {
- char *name = NULL;
- char *now = crm_ttoa(time(NULL));
+ // Get current failcount and increment it
+ name = pcmk__failcount_name(resource, task, interval_ms);
+
+ if (read_attr_delegate(cib_conn, XML_CIB_TAG_STATUS,
+ ID(cib_node), NULL, NULL, NULL, name,
+ &value, TRUE, NULL) == pcmk_rc_ok) {
- name = pcmk__failcount_name(resource, task, interval_ms);
- inject_transient_attr(cib_node, name, "value++");
- free(name);
-
- name = pcmk__lastfailure_name(resource, task, interval_ms);
- inject_transient_attr(cib_node, name, now);
- free(name);
- free(now);
+ if ((failcount = crm_parse_int(value, "0")) < 0) {
+ failcount = 0;
+ }
}
+ free(value);
+
+ value = crm_itoa(failcount + 1);
+ inject_transient_attr(cib_node, name, value);
+
+ free(name);
+ free(value);
+
+ name = pcmk__lastfailure_name(resource, task, interval_ms);
+ value = crm_ttoa(time(NULL));
+ inject_transient_attr(cib_node, name, value);
+
+ free(name);
+ free(value);
}
static void
@@ -603,7 +623,8 @@ modify_configuration(pe_working_set_t *
cib_node = inject_node_state(cib, node, NULL);
CRM_ASSERT(cib_node != NULL);
- update_failcounts(cib_node, resource, task, interval_ms, outcome);
+ update_failcounts(cib, cib_node, resource, task, interval_ms,
+ outcome);
cib_resource = inject_resource(cib_node, resource, resource,
rclass, rtype, rprovider);
@@ -761,7 +782,7 @@ exec_rsc_action(crm_graph_t * graph, crm
action->failed = TRUE;
graph->abort_priority = INFINITY;
printf("\tPretending action %d failed with rc=%d\n", action->id, op->rc);
- update_failcounts(cib_node, match_name, op->op_type,
+ update_failcounts(fake_cib, cib_node, match_name, op->op_type,
op->interval_ms, op->rc);
break;
}