File pacemaker#3772-0002-Fix-libpacemaker-set-fail-count-to-INFINITY-for-fata.patch of Package pacemaker.38493
From 54759f1d0484592c7090b06a8588d486889575ce Mon Sep 17 00:00:00 2001
From: "Gao,Yan" <ygao@suse.com>
Date: Thu, 28 Nov 2024 18:17:09 +0100
Subject: [PATCH 2/2] Fix: libpacemaker: set fail-count to INFINITY for fatal
failures
... to be consistent with what controller does with update_failcount()
---
lib/pacemaker/libpacemaker_private.h | 3 ++-
lib/pacemaker/pcmk_injections.c | 25 ++++++++++++++++++++++---
lib/pacemaker/pcmk_simulate.c | 13 ++++++++++++-
3 files changed, 36 insertions(+), 5 deletions(-)
Index: pacemaker-2.1.5+20221208.a3f44794f/lib/pacemaker/libpacemaker_private.h
===================================================================
--- pacemaker-2.1.5+20221208.a3f44794f.orig/lib/pacemaker/libpacemaker_private.h
+++ pacemaker-2.1.5+20221208.a3f44794f/lib/pacemaker/libpacemaker_private.h
@@ -693,7 +693,8 @@ xmlNode *pcmk__inject_resource_history(p
G_GNUC_INTERNAL
void pcmk__inject_failcount(pcmk__output_t *out, cib_t *cib_conn,
xmlNode *cib_node, const char *resource,
- const char *task, guint interval_ms, int rc);
+ const char *task, guint interval_ms, int rc,
+ bool infinity);
G_GNUC_INTERNAL
xmlNode *pcmk__inject_action_result(xmlNode *cib_resource,
Index: pacemaker-2.1.5+20221208.a3f44794f/lib/pacemaker/pcmk_injections.c
===================================================================
--- pacemaker-2.1.5+20221208.a3f44794f.orig/lib/pacemaker/pcmk_injections.c
+++ pacemaker-2.1.5+20221208.a3f44794f/lib/pacemaker/pcmk_injections.c
@@ -86,11 +86,13 @@ inject_transient_attr(pcmk__output_t *ou
* \param[in] exit_status Action result for fail count to inject (if
* \c PCMK_OCF_OK, or \c PCMK_OCF_NOT_RUNNING when
* \p interval_ms is 0, inject nothing)
+ * \param[in] infinity If true, set fail count to "INFINITY", otherwise
+ * increase it by 1
*/
void
pcmk__inject_failcount(pcmk__output_t *out, cib_t *cib_conn, xmlNode *cib_node,
const char *resource, const char *task,
- guint interval_ms, int exit_status)
+ guint interval_ms, int exit_status, bool infinity)
{
char *name = NULL;
char *value = NULL;
@@ -117,7 +119,14 @@ pcmk__inject_failcount(pcmk__output_t *o
failcount = 0;
}
}
- value = pcmk__itoa(failcount + 1);
+
+ if (infinity) {
+ value = strdup(CRM_INFINITY_S);
+
+ } else {
+ value = pcmk__itoa(failcount + 1);
+ }
+
inject_transient_attr(out, cib_node, name, value);
free(name);
@@ -592,6 +601,7 @@ inject_action(pcmk__output_t *out, const
xmlNode *cib_resource = NULL;
pe_resource_t *rsc = NULL;
lrmd_event_data_t *op = NULL;
+ bool infinity = false;
out->message(out, "inject-spec", spec);
@@ -619,8 +629,17 @@ inject_action(pcmk__output_t *out, const
cib_node = pcmk__inject_node(cib, node, NULL);
CRM_ASSERT(cib_node != NULL);
+ if (pcmk__str_eq(task, CRMD_ACTION_STOP, pcmk__str_none)) {
+ infinity = true;
+
+ } else if (pcmk__str_eq(task, CRMD_ACTION_START, pcmk__str_none)
+ && pcmk_is_set(data_set->flags,
+ pe_flag_start_failure_fatal)) {
+ infinity = true;
+ }
+
pcmk__inject_failcount(out, cib, cib_node, resource, task, interval_ms,
- outcome);
+ outcome, infinity);
cib_resource = pcmk__inject_resource_history(out, cib_node,
resource, resource,
Index: pacemaker-2.1.5+20221208.a3f44794f/lib/pacemaker/pcmk_simulate.c
===================================================================
--- pacemaker-2.1.5+20221208.a3f44794f.orig/lib/pacemaker/pcmk_simulate.c
+++ pacemaker-2.1.5+20221208.a3f44794f/lib/pacemaker/pcmk_simulate.c
@@ -587,6 +587,7 @@ simulate_resource_action(pcmk__graph_t *
char *spec = (char *) iter->data;
char *key = NULL;
const char *match_name = NULL;
+ const char *offset = NULL;
// Allow user to specify anonymous clone with or without instance number
key = crm_strdup_printf(PCMK__OP_FMT "@%s=", resource, op->op_type,
@@ -624,8 +625,18 @@ simulate_resource_action(pcmk__graph_t *
action->id, op->rc);
pcmk__set_graph_action_flags(action, pcmk__graph_action_failed);
graph->abort_priority = INFINITY;
+
+ if (pcmk__str_eq(op->op_type, CRMD_ACTION_START, pcmk__str_none)) {
+ offset = CRM_INFINITY_S;
+
+ } else if (pcmk__str_eq(op->op_type, CRMD_ACTION_STOP,
+ pcmk__str_none)) {
+ offset = CRM_INFINITY_S;
+ }
+
pcmk__inject_failcount(out, fake_cib, cib_node, match_name, op->op_type,
- op->interval_ms, op->rc);
+ op->interval_ms, op->rc,
+ pcmk_str_is_infinity(offset));
break;
}