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;
     }
 
openSUSE Build Service is sponsored by