import pacemaker-2.1.4-5.el8
This commit is contained in:
parent
7b4b460a4e
commit
6c63758044
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
|||||||
SOURCES/nagios-agents-metadata-105ab8a.tar.gz
|
SOURCES/nagios-agents-metadata-105ab8a.tar.gz
|
||||||
SOURCES/pacemaker-ada5c3b.tar.gz
|
SOURCES/pacemaker-dc6eb43.tar.gz
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
ea6c0a27fd0ae8ce02f84a11f08a0d79377041c3 SOURCES/nagios-agents-metadata-105ab8a.tar.gz
|
ea6c0a27fd0ae8ce02f84a11f08a0d79377041c3 SOURCES/nagios-agents-metadata-105ab8a.tar.gz
|
||||||
f9fd69263d5b21446b530f9750c262f7b492cad4 SOURCES/pacemaker-ada5c3b.tar.gz
|
1dfac4c5f1958ce5f72bfcbb2a34890ab058c84c SOURCES/pacemaker-dc6eb43.tar.gz
|
||||||
|
@ -1,230 +0,0 @@
|
|||||||
From f5ffbaf1f537d3d5b00e594211cd322f97df51ac Mon Sep 17 00:00:00 2001
|
|
||||||
From: Grace Chin <gchin@redhat.com>
|
|
||||||
Date: Fri, 5 Nov 2021 11:39:39 -0400
|
|
||||||
Subject: [PATCH 1/3] Low: xml: clone acls schema in preparation for changes
|
|
||||||
|
|
||||||
---
|
|
||||||
xml/acls-3.8.rng | 80 ++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
1 file changed, 80 insertions(+)
|
|
||||||
create mode 100644 xml/acls-3.8.rng
|
|
||||||
|
|
||||||
diff --git a/xml/acls-3.8.rng b/xml/acls-3.8.rng
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..0fe6eed96
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/xml/acls-3.8.rng
|
|
||||||
@@ -0,0 +1,80 @@
|
|
||||||
+<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
|
||||||
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
|
||||||
+ <start>
|
|
||||||
+ <optional>
|
|
||||||
+ <ref name="element-acls"/>
|
|
||||||
+ </optional>
|
|
||||||
+ </start>
|
|
||||||
+
|
|
||||||
+ <define name="element-acls">
|
|
||||||
+ <element name="acls">
|
|
||||||
+ <zeroOrMore>
|
|
||||||
+ <choice>
|
|
||||||
+ <element name="acl_target">
|
|
||||||
+ <attribute name="id"><text/></attribute>
|
|
||||||
+ <zeroOrMore>
|
|
||||||
+ <element name="role">
|
|
||||||
+ <attribute name="id"><data type="IDREF"/></attribute>
|
|
||||||
+ </element>
|
|
||||||
+ </zeroOrMore>
|
|
||||||
+ </element>
|
|
||||||
+ <element name="acl_group">
|
|
||||||
+ <!-- Here 'id' is the name of a unix group -->
|
|
||||||
+ <attribute name="id"><data type="ID"/></attribute>
|
|
||||||
+ <zeroOrMore>
|
|
||||||
+ <element name="role">
|
|
||||||
+ <attribute name="id"><data type="IDREF"/></attribute>
|
|
||||||
+ </element>
|
|
||||||
+ </zeroOrMore>
|
|
||||||
+ </element>
|
|
||||||
+ <element name="acl_role">
|
|
||||||
+ <attribute name="id"><data type="ID"/></attribute>
|
|
||||||
+ <optional>
|
|
||||||
+ <attribute name="description"><text/></attribute>
|
|
||||||
+ </optional>
|
|
||||||
+ <zeroOrMore>
|
|
||||||
+ <ref name="element-permission"/>
|
|
||||||
+ </zeroOrMore>
|
|
||||||
+ </element>
|
|
||||||
+ </choice>
|
|
||||||
+ </zeroOrMore>
|
|
||||||
+ </element>
|
|
||||||
+ </define>
|
|
||||||
+
|
|
||||||
+ <define name="element-permission">
|
|
||||||
+ <element name="acl_permission">
|
|
||||||
+ <attribute name="id"><data type="ID"/></attribute>
|
|
||||||
+
|
|
||||||
+ <attribute name="kind">
|
|
||||||
+ <choice>
|
|
||||||
+ <value>read</value>
|
|
||||||
+ <value>write</value>
|
|
||||||
+ <value>deny</value>
|
|
||||||
+ </choice>
|
|
||||||
+ </attribute>
|
|
||||||
+
|
|
||||||
+ <choice>
|
|
||||||
+ <attribute name="xpath"><text/></attribute>
|
|
||||||
+ <!-- reference is already sufficiently specific without 'object-type' -->
|
|
||||||
+ <attribute name="reference"><data type="IDREF"/></attribute>
|
|
||||||
+ <group>
|
|
||||||
+ <!-- Use 'object-type' to avoid conflicting with the 'tag' configuration concept -->
|
|
||||||
+ <attribute name="object-type"><text/></attribute>
|
|
||||||
+ <optional>
|
|
||||||
+ <!--
|
|
||||||
+ does not make sense with anything other than object-type
|
|
||||||
+ xpath and reference are already sufficiently specific
|
|
||||||
+ -->
|
|
||||||
+ <attribute name="attribute"><text/></attribute>
|
|
||||||
+ </optional>
|
|
||||||
+ </group>
|
|
||||||
+ </choice>
|
|
||||||
+
|
|
||||||
+ <optional>
|
|
||||||
+ <attribute name="description"><text/></attribute>
|
|
||||||
+ </optional>
|
|
||||||
+ </element>
|
|
||||||
+ </define>
|
|
||||||
+
|
|
||||||
+</grammar>
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 7838213fc639236bdedf5f15320152d973f1bdad Mon Sep 17 00:00:00 2001
|
|
||||||
From: Grace Chin <gchin@redhat.com>
|
|
||||||
Date: Fri, 5 Nov 2021 11:40:48 -0400
|
|
||||||
Subject: [PATCH 2/3] Add a 'name' attribute to acl_target and acl_group
|
|
||||||
elements
|
|
||||||
|
|
||||||
---
|
|
||||||
xml/acls-3.8.rng | 6 ++++++
|
|
||||||
1 file changed, 6 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/xml/acls-3.8.rng b/xml/acls-3.8.rng
|
|
||||||
index 0fe6eed96..48bcdffe3 100644
|
|
||||||
--- a/xml/acls-3.8.rng
|
|
||||||
+++ b/xml/acls-3.8.rng
|
|
||||||
@@ -13,6 +13,9 @@
|
|
||||||
<choice>
|
|
||||||
<element name="acl_target">
|
|
||||||
<attribute name="id"><text/></attribute>
|
|
||||||
+ <optional>
|
|
||||||
+ <attribute name="name"><text/></attribute>
|
|
||||||
+ </optional>
|
|
||||||
<zeroOrMore>
|
|
||||||
<element name="role">
|
|
||||||
<attribute name="id"><data type="IDREF"/></attribute>
|
|
||||||
@@ -22,6 +25,9 @@
|
|
||||||
<element name="acl_group">
|
|
||||||
<!-- Here 'id' is the name of a unix group -->
|
|
||||||
<attribute name="id"><data type="ID"/></attribute>
|
|
||||||
+ <optional>
|
|
||||||
+ <attribute name="name"><text/></attribute>
|
|
||||||
+ </optional>
|
|
||||||
<zeroOrMore>
|
|
||||||
<element name="role">
|
|
||||||
<attribute name="id"><data type="IDREF"/></attribute>
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From c3c498f4636f57e29670f8e385b625024ed222d7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Grace Chin <gchin@redhat.com>
|
|
||||||
Date: Fri, 5 Nov 2021 11:42:48 -0400
|
|
||||||
Subject: [PATCH 3/3] Changes made by run of 'cts/cts-cli -s'
|
|
||||||
|
|
||||||
---
|
|
||||||
cts/cli/regression.upgrade.exp | 7 +++++--
|
|
||||||
cts/cli/regression.validity.exp | 22 ++++++++++++++++++----
|
|
||||||
2 files changed, 23 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/cts/cli/regression.upgrade.exp b/cts/cli/regression.upgrade.exp
|
|
||||||
index e38adebdd..7ce7ec13b 100644
|
|
||||||
--- a/cts/cli/regression.upgrade.exp
|
|
||||||
+++ b/cts/cli/regression.upgrade.exp
|
|
||||||
@@ -91,8 +91,11 @@ update_validation debug: Configuration valid for schema: pacemaker-3.6
|
|
||||||
update_validation debug: pacemaker-3.6-style configuration is also valid for pacemaker-3.7
|
|
||||||
update_validation debug: Testing 'pacemaker-3.7' validation (21 of X)
|
|
||||||
update_validation debug: Configuration valid for schema: pacemaker-3.7
|
|
||||||
-update_validation trace: Stopping at pacemaker-3.7
|
|
||||||
-update_validation info: Transformed the configuration from pacemaker-2.10 to pacemaker-3.7
|
|
||||||
+update_validation debug: pacemaker-3.7-style configuration is also valid for pacemaker-3.8
|
|
||||||
+update_validation debug: Testing 'pacemaker-3.8' validation (22 of X)
|
|
||||||
+update_validation debug: Configuration valid for schema: pacemaker-3.8
|
|
||||||
+update_validation trace: Stopping at pacemaker-3.8
|
|
||||||
+update_validation info: Transformed the configuration from pacemaker-2.10 to pacemaker-3.8
|
|
||||||
=#=#=#= Current cib after: Upgrade to latest CIB schema (trigger 2.10.xsl + the wrapping) =#=#=#=
|
|
||||||
<cib epoch="2" num_updates="0" admin_epoch="1">
|
|
||||||
<configuration>
|
|
||||||
diff --git a/cts/cli/regression.validity.exp b/cts/cli/regression.validity.exp
|
|
||||||
index 5ace430e7..125035a47 100644
|
|
||||||
--- a/cts/cli/regression.validity.exp
|
|
||||||
+++ b/cts/cli/regression.validity.exp
|
|
||||||
@@ -121,7 +121,11 @@ update_validation debug: Testing 'pacemaker-3.7' validation (21 of X)
|
|
||||||
element rsc_order: Relax-NG validity error : Invalid attribute first-action for element rsc_order
|
|
||||||
element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
update_validation trace: pacemaker-3.7 validation failed
|
|
||||||
-Cannot upgrade configuration (claiming schema pacemaker-1.2) to at least pacemaker-3.0 because it does not validate with any schema from pacemaker-1.2 to pacemaker-3.7
|
|
||||||
+update_validation debug: Testing 'pacemaker-3.8' validation (22 of X)
|
|
||||||
+element rsc_order: Relax-NG validity error : Invalid attribute first-action for element rsc_order
|
|
||||||
+element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
+update_validation trace: pacemaker-3.8 validation failed
|
|
||||||
+Cannot upgrade configuration (claiming schema pacemaker-1.2) to at least pacemaker-3.0 because it does not validate with any schema from pacemaker-1.2 to pacemaker-3.8
|
|
||||||
=#=#=#= End test: Run crm_simulate with invalid CIB (enum violation) - Invalid configuration (78) =#=#=#=
|
|
||||||
* Passed: crm_simulate - Run crm_simulate with invalid CIB (enum violation)
|
|
||||||
=#=#=#= Begin test: Try to make resulting CIB invalid (unrecognized validate-with) =#=#=#=
|
|
||||||
@@ -226,7 +230,10 @@ update_validation trace: pacemaker-3.6 validation failed
|
|
||||||
update_validation debug: Testing 'pacemaker-3.7' validation (21 of X)
|
|
||||||
element cib: Relax-NG validity error : Invalid attribute validate-with for element cib
|
|
||||||
update_validation trace: pacemaker-3.7 validation failed
|
|
||||||
-Cannot upgrade configuration (claiming schema pacemaker-9999.0) to at least pacemaker-3.0 because it does not validate with any schema from unknown to pacemaker-3.7
|
|
||||||
+update_validation debug: Testing 'pacemaker-3.8' validation (22 of X)
|
|
||||||
+element cib: Relax-NG validity error : Invalid attribute validate-with for element cib
|
|
||||||
+update_validation trace: pacemaker-3.8 validation failed
|
|
||||||
+Cannot upgrade configuration (claiming schema pacemaker-9999.0) to at least pacemaker-3.0 because it does not validate with any schema from unknown to pacemaker-3.8
|
|
||||||
=#=#=#= End test: Run crm_simulate with invalid CIB (unrecognized validate-with) - Invalid configuration (78) =#=#=#=
|
|
||||||
* Passed: crm_simulate - Run crm_simulate with invalid CIB (unrecognized validate-with)
|
|
||||||
=#=#=#= Begin test: Try to make resulting CIB invalid, but possibly recoverable (valid with X.Y+1) =#=#=#=
|
|
||||||
@@ -326,8 +333,11 @@ update_validation debug: Configuration valid for schema: pacemaker-3.6
|
|
||||||
update_validation debug: pacemaker-3.6-style configuration is also valid for pacemaker-3.7
|
|
||||||
update_validation debug: Testing 'pacemaker-3.7' validation (21 of X)
|
|
||||||
update_validation debug: Configuration valid for schema: pacemaker-3.7
|
|
||||||
-update_validation trace: Stopping at pacemaker-3.7
|
|
||||||
-update_validation info: Transformed the configuration from pacemaker-1.2 to pacemaker-3.7
|
|
||||||
+update_validation debug: pacemaker-3.7-style configuration is also valid for pacemaker-3.8
|
|
||||||
+update_validation debug: Testing 'pacemaker-3.8' validation (22 of X)
|
|
||||||
+update_validation debug: Configuration valid for schema: pacemaker-3.8
|
|
||||||
+update_validation trace: Stopping at pacemaker-3.8
|
|
||||||
+update_validation info: Transformed the configuration from pacemaker-1.2 to pacemaker-3.8
|
|
||||||
unpack_resources error: Resource start-up disabled since no STONITH resources have been defined
|
|
||||||
unpack_resources error: Either configure some or disable STONITH with the stonith-enabled option
|
|
||||||
unpack_resources error: NOTE: Clusters with shared data need STONITH to ensure data integrity
|
|
||||||
@@ -437,6 +447,8 @@ element rsc_order: Relax-NG validity error : Invalid attribute first-action for
|
|
||||||
element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
element rsc_order: Relax-NG validity error : Invalid attribute first-action for element rsc_order
|
|
||||||
element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
+element rsc_order: Relax-NG validity error : Invalid attribute first-action for element rsc_order
|
|
||||||
+element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
=#=#=#= Current cib after: Make resulting CIB invalid, and without validate-with attribute =#=#=#=
|
|
||||||
<cib epoch="41" num_updates="0" admin_epoch="0" validate-with="none">
|
|
||||||
<configuration>
|
|
||||||
@@ -502,6 +514,8 @@ validity.bad.xml:10: element rsc_order: Relax-NG validity error : Invalid attrib
|
|
||||||
validity.bad.xml:10: element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
validity.bad.xml:10: element rsc_order: Relax-NG validity error : Invalid attribute first-action for element rsc_order
|
|
||||||
validity.bad.xml:10: element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
+validity.bad.xml:10: element rsc_order: Relax-NG validity error : Invalid attribute first-action for element rsc_order
|
|
||||||
+validity.bad.xml:10: element rsc_order: Relax-NG validity error : Element constraints has extra content: rsc_order
|
|
||||||
unpack_resources error: Resource start-up disabled since no STONITH resources have been defined
|
|
||||||
unpack_resources error: Either configure some or disable STONITH with the stonith-enabled option
|
|
||||||
unpack_resources error: NOTE: Clusters with shared data need STONITH to ensure data integrity
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
127
SOURCES/001-stonith-enabled.patch
Normal file
127
SOURCES/001-stonith-enabled.patch
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
From 243139b2ec0f6b17877a4e7f651fc3f70f76b11a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christine Caulfield <ccaulfie@redhat.com>
|
||||||
|
Date: Fri, 6 May 2022 15:23:43 +0100
|
||||||
|
Subject: [PATCH 1/2] fenced: Don't ignore CIB updates if stonith-enabled=false
|
||||||
|
|
||||||
|
Fixes: T378
|
||||||
|
---
|
||||||
|
daemons/fenced/pacemaker-fenced.c | 23 +++--------------------
|
||||||
|
1 file changed, 3 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c
|
||||||
|
index caab7de83..dadd187b6 100644
|
||||||
|
--- a/daemons/fenced/pacemaker-fenced.c
|
||||||
|
+++ b/daemons/fenced/pacemaker-fenced.c
|
||||||
|
@@ -1136,11 +1136,8 @@ static void
|
||||||
|
update_cib_cache_cb(const char *event, xmlNode * msg)
|
||||||
|
{
|
||||||
|
int rc = pcmk_ok;
|
||||||
|
- xmlNode *stonith_enabled_xml = NULL;
|
||||||
|
- static gboolean stonith_enabled_saved = TRUE;
|
||||||
|
long timeout_ms_saved = stonith_watchdog_timeout_ms;
|
||||||
|
gboolean need_full_refresh = FALSE;
|
||||||
|
- bool value = false;
|
||||||
|
|
||||||
|
if(!have_cib_devices) {
|
||||||
|
crm_trace("Skipping updates until we get a full dump");
|
||||||
|
@@ -1191,32 +1188,18 @@ update_cib_cache_cb(const char *event, xmlNode * msg)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CRM_ASSERT(local_cib != NULL);
|
||||||
|
- stonith_enabled_saved = FALSE; /* Trigger a full refresh below */
|
||||||
|
+ need_full_refresh = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pcmk__refresh_node_caches_from_cib(local_cib);
|
||||||
|
update_stonith_watchdog_timeout_ms(local_cib);
|
||||||
|
|
||||||
|
- stonith_enabled_xml = get_xpath_object("//nvpair[@name='stonith-enabled']",
|
||||||
|
- local_cib, LOG_NEVER);
|
||||||
|
- if (pcmk__xe_get_bool_attr(stonith_enabled_xml, XML_NVPAIR_ATTR_VALUE, &value) == pcmk_rc_ok && !value) {
|
||||||
|
- crm_trace("Ignoring CIB updates while fencing is disabled");
|
||||||
|
- stonith_enabled_saved = FALSE;
|
||||||
|
-
|
||||||
|
- } else if (stonith_enabled_saved == FALSE) {
|
||||||
|
- crm_info("Updating fencing device and topology lists "
|
||||||
|
- "now that fencing is enabled");
|
||||||
|
- stonith_enabled_saved = TRUE;
|
||||||
|
- need_full_refresh = TRUE;
|
||||||
|
-
|
||||||
|
- } else {
|
||||||
|
- if (timeout_ms_saved != stonith_watchdog_timeout_ms) {
|
||||||
|
+ if (timeout_ms_saved != stonith_watchdog_timeout_ms) {
|
||||||
|
need_full_refresh = TRUE;
|
||||||
|
- } else {
|
||||||
|
+ } else {
|
||||||
|
update_fencing_topology(event, msg);
|
||||||
|
update_cib_stonith_devices(event, msg);
|
||||||
|
watchdog_device_update();
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_full_refresh) {
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From c600ef49022e7473acbe121fae50a0c1aa2d7c03 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christine Caulfield <ccaulfie@redhat.com>
|
||||||
|
Date: Thu, 9 Jun 2022 11:08:43 +0100
|
||||||
|
Subject: [PATCH 2/2] Also don't check for stonith-disabled in
|
||||||
|
update_stonith_watchdog_timeout_ms
|
||||||
|
|
||||||
|
---
|
||||||
|
daemons/fenced/pacemaker-fenced.c | 34 +++++++++++--------------------
|
||||||
|
1 file changed, 12 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c
|
||||||
|
index dadd187b6..ec42d5bc2 100644
|
||||||
|
--- a/daemons/fenced/pacemaker-fenced.c
|
||||||
|
+++ b/daemons/fenced/pacemaker-fenced.c
|
||||||
|
@@ -643,31 +643,21 @@ watchdog_device_update(void)
|
||||||
|
static void
|
||||||
|
update_stonith_watchdog_timeout_ms(xmlNode *cib)
|
||||||
|
{
|
||||||
|
- xmlNode *stonith_enabled_xml = NULL;
|
||||||
|
- bool stonith_enabled = false;
|
||||||
|
- int rc = pcmk_rc_ok;
|
||||||
|
long timeout_ms = 0;
|
||||||
|
+ xmlNode *stonith_watchdog_xml = NULL;
|
||||||
|
+ const char *value = NULL;
|
||||||
|
|
||||||
|
- stonith_enabled_xml = get_xpath_object("//nvpair[@name='stonith-enabled']",
|
||||||
|
- cib, LOG_NEVER);
|
||||||
|
- rc = pcmk__xe_get_bool_attr(stonith_enabled_xml, XML_NVPAIR_ATTR_VALUE, &stonith_enabled);
|
||||||
|
-
|
||||||
|
- if (rc != pcmk_rc_ok || stonith_enabled) {
|
||||||
|
- xmlNode *stonith_watchdog_xml = NULL;
|
||||||
|
- const char *value = NULL;
|
||||||
|
-
|
||||||
|
- stonith_watchdog_xml = get_xpath_object("//nvpair[@name='stonith-watchdog-timeout']",
|
||||||
|
- cib, LOG_NEVER);
|
||||||
|
- if (stonith_watchdog_xml) {
|
||||||
|
- value = crm_element_value(stonith_watchdog_xml, XML_NVPAIR_ATTR_VALUE);
|
||||||
|
- }
|
||||||
|
- if (value) {
|
||||||
|
- timeout_ms = crm_get_msec(value);
|
||||||
|
- }
|
||||||
|
+ stonith_watchdog_xml = get_xpath_object("//nvpair[@name='stonith-watchdog-timeout']",
|
||||||
|
+ cib, LOG_NEVER);
|
||||||
|
+ if (stonith_watchdog_xml) {
|
||||||
|
+ value = crm_element_value(stonith_watchdog_xml, XML_NVPAIR_ATTR_VALUE);
|
||||||
|
+ }
|
||||||
|
+ if (value) {
|
||||||
|
+ timeout_ms = crm_get_msec(value);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (timeout_ms < 0) {
|
||||||
|
- timeout_ms = pcmk__auto_watchdog_timeout();
|
||||||
|
- }
|
||||||
|
+ if (timeout_ms < 0) {
|
||||||
|
+ timeout_ms = pcmk__auto_watchdog_timeout();
|
||||||
|
}
|
||||||
|
|
||||||
|
stonith_watchdog_timeout_ms = timeout_ms;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
425
SOURCES/002-acl_group.patch
Normal file
425
SOURCES/002-acl_group.patch
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
From 80c64be80f2bffdcf5d2432e1e59d633fd68d516 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Grace Chin <gchin@redhat.com>
|
||||||
|
Date: Mon, 13 Jun 2022 09:02:32 -0400
|
||||||
|
Subject: [PATCH 1/4] Add pcmk__is_user_in_group()
|
||||||
|
|
||||||
|
---
|
||||||
|
lib/common/crmcommon_private.h | 3 +++
|
||||||
|
lib/common/utils.c | 33 +++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 36 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/common/crmcommon_private.h b/lib/common/crmcommon_private.h
|
||||||
|
index 6b7be9c68..c2fcb0adf 100644
|
||||||
|
--- a/lib/common/crmcommon_private.h
|
||||||
|
+++ b/lib/common/crmcommon_private.h
|
||||||
|
@@ -96,6 +96,9 @@ void pcmk__free_acls(GList *acls);
|
||||||
|
G_GNUC_INTERNAL
|
||||||
|
void pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user);
|
||||||
|
|
||||||
|
+G_GNUC_INTERNAL
|
||||||
|
+bool pcmk__is_user_in_group(const char *user, const char *group);
|
||||||
|
+
|
||||||
|
G_GNUC_INTERNAL
|
||||||
|
void pcmk__apply_acl(xmlNode *xml);
|
||||||
|
|
||||||
|
diff --git a/lib/common/utils.c b/lib/common/utils.c
|
||||||
|
index 2dfbef278..f23583acb 100644
|
||||||
|
--- a/lib/common/utils.c
|
||||||
|
+++ b/lib/common/utils.c
|
||||||
|
@@ -27,6 +27,7 @@
|
||||||
|
#include <time.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <signal.h>
|
||||||
|
+#include <grp.h>
|
||||||
|
|
||||||
|
#include <qb/qbdefs.h>
|
||||||
|
|
||||||
|
@@ -53,6 +54,38 @@ gboolean crm_config_error = FALSE;
|
||||||
|
gboolean crm_config_warning = FALSE;
|
||||||
|
char *crm_system_name = NULL;
|
||||||
|
|
||||||
|
+bool
|
||||||
|
+pcmk__is_user_in_group(const char *user, const char *group)
|
||||||
|
+{
|
||||||
|
+ struct group *grent;
|
||||||
|
+ char **gr_mem;
|
||||||
|
+
|
||||||
|
+ if (user == NULL || group == NULL) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ setgrent();
|
||||||
|
+ while ((grent = getgrent()) != NULL) {
|
||||||
|
+ if (grent->gr_mem == NULL) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if(strcmp(group, grent->gr_name) != 0) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ gr_mem = grent->gr_mem;
|
||||||
|
+ while (*gr_mem != NULL) {
|
||||||
|
+ if (!strcmp(user, *gr_mem++)) {
|
||||||
|
+ endgrent();
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ endgrent();
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int
|
||||||
|
crm_user_lookup(const char *name, uid_t * uid, gid_t * gid)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From 5fbe5c310de00390fb36d866823a7745ba4812e3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Grace Chin <gchin@redhat.com>
|
||||||
|
Date: Mon, 13 Jun 2022 09:04:57 -0400
|
||||||
|
Subject: [PATCH 2/4] Add unit test for pcmk__is_user_in_group()
|
||||||
|
|
||||||
|
---
|
||||||
|
lib/common/Makefile.am | 2 +-
|
||||||
|
lib/common/mock.c | 31 +++++--
|
||||||
|
lib/common/mock_private.h | 11 +++
|
||||||
|
lib/common/tests/acl/Makefile.am | 11 ++-
|
||||||
|
.../tests/acl/pcmk__is_user_in_group_test.c | 92 +++++++++++++++++++
|
||||||
|
5 files changed, 137 insertions(+), 10 deletions(-)
|
||||||
|
create mode 100644 lib/common/tests/acl/pcmk__is_user_in_group_test.c
|
||||||
|
|
||||||
|
diff --git a/lib/common/Makefile.am b/lib/common/Makefile.am
|
||||||
|
index d7aae53bf..04d56dc3c 100644
|
||||||
|
--- a/lib/common/Makefile.am
|
||||||
|
+++ b/lib/common/Makefile.am
|
||||||
|
@@ -94,7 +94,7 @@ libcrmcommon_la_SOURCES += watchdog.c
|
||||||
|
libcrmcommon_la_SOURCES += xml.c
|
||||||
|
libcrmcommon_la_SOURCES += xpath.c
|
||||||
|
|
||||||
|
-WRAPPED = calloc getenv getpwnam_r uname
|
||||||
|
+WRAPPED = calloc getenv getpwnam_r uname setgrent getgrent endgrent
|
||||||
|
WRAPPED_FLAGS = $(foreach fn,$(WRAPPED),-Wl,--wrap=$(fn))
|
||||||
|
|
||||||
|
libcrmcommon_test_la_SOURCES = $(libcrmcommon_la_SOURCES)
|
||||||
|
diff --git a/lib/common/mock.c b/lib/common/mock.c
|
||||||
|
index 55812ddbc..fa9431e6d 100644
|
||||||
|
--- a/lib/common/mock.c
|
||||||
|
+++ b/lib/common/mock.c
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
+#include <grp.h>
|
||||||
|
|
||||||
|
#include "mock_private.h"
|
||||||
|
|
||||||
|
@@ -18,13 +19,13 @@
|
||||||
|
* libcrmcommon_test.a, not into libcrmcommon.so. It is used to support
|
||||||
|
* constructing mock versions of library functions for unit testing.
|
||||||
|
*
|
||||||
|
- * Each unit test will only ever want to use a mocked version of one or two
|
||||||
|
- * library functions. However, we need to mark all the mocked functions as
|
||||||
|
- * wrapped (with -Wl,--wrap= in the LDFLAGS) in libcrmcommon_test.a so that
|
||||||
|
- * all those unit tests can share the same special test library. The unit
|
||||||
|
- * test then defines its own wrapped function. Because a unit test won't
|
||||||
|
- * define every single wrapped function, there will be undefined references
|
||||||
|
- * at link time.
|
||||||
|
+ * Each unit test will only ever want to use a mocked version of a few
|
||||||
|
+ * library functions (i.e. not all of them). However, we need to mark all
|
||||||
|
+ * the mocked functions as wrapped (with -Wl,--wrap= in the LDFLAGS) in
|
||||||
|
+ * libcrmcommon_test.a so that all those unit tests can share the same
|
||||||
|
+ * special test library. The unit test then defines its own wrapped
|
||||||
|
+ * function. Because a unit test won't define every single wrapped
|
||||||
|
+ * function, there will be undefined references at link time.
|
||||||
|
*
|
||||||
|
* This file takes care of those undefined references. It defines a
|
||||||
|
* wrapped version of every function that simply calls the real libc
|
||||||
|
@@ -74,3 +75,19 @@ int __attribute__((weak))
|
||||||
|
__wrap_uname(struct utsname *buf) {
|
||||||
|
return __real_uname(buf);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void __attribute__((weak))
|
||||||
|
+__wrap_setgrent(void) {
|
||||||
|
+ __real_setgrent();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+struct group * __attribute__((weak))
|
||||||
|
+__wrap_getgrent(void) {
|
||||||
|
+ return __real_getgrent();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void __attribute__((weak))
|
||||||
|
+__wrap_endgrent(void) {
|
||||||
|
+ __real_endgrent();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/lib/common/mock_private.h b/lib/common/mock_private.h
|
||||||
|
index 3df7c9839..0c1134cc3 100644
|
||||||
|
--- a/lib/common/mock_private.h
|
||||||
|
+++ b/lib/common/mock_private.h
|
||||||
|
@@ -14,6 +14,7 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
+#include <grp.h>
|
||||||
|
|
||||||
|
/* This header is for the sole use of libcrmcommon_test. */
|
||||||
|
|
||||||
|
@@ -31,4 +32,14 @@ int __wrap_getpwnam_r(const char *name, struct passwd *pwd,
|
||||||
|
int __real_uname(struct utsname *buf);
|
||||||
|
int __wrap_uname(struct utsname *buf);
|
||||||
|
|
||||||
|
+void __real_setgrent(void);
|
||||||
|
+void __wrap_setgrent(void);
|
||||||
|
+
|
||||||
|
+struct group *__real_getgrent(void);
|
||||||
|
+struct group *__wrap_getgrent(void);
|
||||||
|
+
|
||||||
|
+void __real_endgrent(void);
|
||||||
|
+void __wrap_endgrent(void);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
#endif // MOCK_PRIVATE__H
|
||||||
|
diff --git a/lib/common/tests/acl/Makefile.am b/lib/common/tests/acl/Makefile.am
|
||||||
|
index 679c9cb8e..a73fc354c 100644
|
||||||
|
--- a/lib/common/tests/acl/Makefile.am
|
||||||
|
+++ b/lib/common/tests/acl/Makefile.am
|
||||||
|
@@ -1,19 +1,26 @@
|
||||||
|
#
|
||||||
|
-# Copyright 2021 the Pacemaker project contributors
|
||||||
|
+# Copyright 2021-2022 the Pacemaker project contributors
|
||||||
|
#
|
||||||
|
# The version control history for this file may have further details.
|
||||||
|
#
|
||||||
|
# This source code is licensed under the GNU General Public License version 2
|
||||||
|
# or later (GPLv2+) WITHOUT ANY WARRANTY.
|
||||||
|
#
|
||||||
|
-AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
|
||||||
|
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/lib/common
|
||||||
|
LDADD = $(top_builddir)/lib/common/libcrmcommon.la -lcmocka
|
||||||
|
|
||||||
|
+pcmk__is_user_in_group_test_LDADD = $(top_builddir)/lib/common/libcrmcommon_test.la -lcmocka
|
||||||
|
+pcmk__is_user_in_group_test_LDFLAGS = \
|
||||||
|
+ -Wl,--wrap=setgrent \
|
||||||
|
+ -Wl,--wrap=getgrent \
|
||||||
|
+ -Wl,--wrap=endgrent
|
||||||
|
+
|
||||||
|
include $(top_srcdir)/mk/tap.mk
|
||||||
|
|
||||||
|
# Add "_test" to the end of all test program names to simplify .gitignore.
|
||||||
|
|
||||||
|
check_PROGRAMS = \
|
||||||
|
+ pcmk__is_user_in_group_test \
|
||||||
|
pcmk_acl_required_test \
|
||||||
|
xml_acl_denied_test \
|
||||||
|
xml_acl_enabled_test
|
||||||
|
diff --git a/lib/common/tests/acl/pcmk__is_user_in_group_test.c b/lib/common/tests/acl/pcmk__is_user_in_group_test.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..67b8c2c7c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/lib/common/tests/acl/pcmk__is_user_in_group_test.c
|
||||||
|
@@ -0,0 +1,92 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2020-2022 the Pacemaker project contributors
|
||||||
|
+ *
|
||||||
|
+ * The version control history for this file may have further details.
|
||||||
|
+ *
|
||||||
|
+ * This source code is licensed under the GNU Lesser General Public License
|
||||||
|
+ * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <crm_internal.h>
|
||||||
|
+#include <crm/common/acl.h>
|
||||||
|
+#include "../../crmcommon_private.h"
|
||||||
|
+
|
||||||
|
+#include "mock_private.h"
|
||||||
|
+
|
||||||
|
+#include <stdarg.h>
|
||||||
|
+#include <stddef.h>
|
||||||
|
+#include <stdint.h>
|
||||||
|
+#include <setjmp.h>
|
||||||
|
+#include <cmocka.h>
|
||||||
|
+
|
||||||
|
+// THe index of the group that is going to be returned next from "get group entry" (getgrent)
|
||||||
|
+static int group_idx = 0;
|
||||||
|
+
|
||||||
|
+// Data used for testing
|
||||||
|
+static const char* grp0_members[] = {
|
||||||
|
+ "user0", "user1", NULL
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const char* grp1_members[] = {
|
||||||
|
+ "user1", NULL
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const char* grp2_members[] = {
|
||||||
|
+ "user2", "user1", NULL
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+// an array of "groups" (a struct from grp.h), the members of the groups are initalized here to some testing data.
|
||||||
|
+// Casting away the consts to make the compiler happy and simplify initialization.
|
||||||
|
+// We never actually change these variables during the test!
|
||||||
|
+// string literal = const char* (cannot be changed b/c ? ) vs. char* (its getting casted to this)
|
||||||
|
+static const int NUM_GROUPS = 3;
|
||||||
|
+static struct group groups[] = {
|
||||||
|
+ {(char*)"grp0", (char*)"", 0, (char**)grp0_members},
|
||||||
|
+ {(char*)"grp1", (char*)"", 1, (char**)grp1_members},
|
||||||
|
+ {(char*)"grp2", (char*)"", 2, (char**)grp2_members},
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+// This function resets the group_idx to 0.
|
||||||
|
+void
|
||||||
|
+__wrap_setgrent(void) {
|
||||||
|
+ group_idx = 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+// This function returns the next group entry in the list of groups, or
|
||||||
|
+// NULL if there aren't any left.
|
||||||
|
+// group_idx is a global variable which keeps track of where you are in the list
|
||||||
|
+struct group *
|
||||||
|
+__wrap_getgrent(void) {
|
||||||
|
+ if(group_idx >= NUM_GROUPS) return NULL;
|
||||||
|
+ return &groups[group_idx++];
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+__wrap_endgrent(void) {
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+is_pcmk__is_user_in_group(void **state)
|
||||||
|
+{
|
||||||
|
+ // null user
|
||||||
|
+ assert_false(pcmk__is_user_in_group(NULL, "grp0"));
|
||||||
|
+ // null group
|
||||||
|
+ assert_false(pcmk__is_user_in_group("user0", NULL));
|
||||||
|
+ // nonexistent group
|
||||||
|
+ assert_false(pcmk__is_user_in_group("user0", "nonexistent_group"));
|
||||||
|
+ // user is in group
|
||||||
|
+ assert_true(pcmk__is_user_in_group("user0", "grp0"));
|
||||||
|
+ // user is not in group
|
||||||
|
+ assert_false(pcmk__is_user_in_group("user2", "grp0"));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main(int argc, char **argv)
|
||||||
|
+{
|
||||||
|
+ const struct CMUnitTest tests[] = {
|
||||||
|
+ cmocka_unit_test(is_pcmk__is_user_in_group)
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cmocka_set_message_output(CM_OUTPUT_TAP);
|
||||||
|
+ return cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From 1bb7fda60f5b8547d7457f20543b7e50089cf06b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Grace Chin <gchin@redhat.com>
|
||||||
|
Date: Mon, 13 Jun 2022 09:17:36 -0400
|
||||||
|
Subject: [PATCH 3/4] Add ACL group support
|
||||||
|
|
||||||
|
closes T61
|
||||||
|
---
|
||||||
|
lib/common/acl.c | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/common/acl.c b/lib/common/acl.c
|
||||||
|
index f68069bbd..d7f8469b1 100644
|
||||||
|
--- a/lib/common/acl.c
|
||||||
|
+++ b/lib/common/acl.c
|
||||||
|
@@ -320,6 +320,13 @@ pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user)
|
||||||
|
crm_debug("Unpacking ACLs for user '%s'", id);
|
||||||
|
p->acls = parse_acl_entry(acls, child, p->acls);
|
||||||
|
}
|
||||||
|
+ } else if (!strcmp(tag, XML_ACL_TAG_GROUP)) {
|
||||||
|
+ const char *id = crm_element_value(child, XML_ATTR_ID);
|
||||||
|
+
|
||||||
|
+ if (id && pcmk__is_user_in_group(user,id)) {
|
||||||
|
+ crm_debug("Unpacking ACLs for group '%s'", id);
|
||||||
|
+ p->acls = parse_acl_entry(acls, child, p->acls);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From f4efd55d9424d34908ba3e2bcffe16c00b2cf660 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Grace Chin <gchin@redhat.com>
|
||||||
|
Date: Mon, 13 Jun 2022 09:20:36 -0400
|
||||||
|
Subject: [PATCH 4/4] Allow acl_target and acl_group elements to take a 'name'
|
||||||
|
attribute to use a name different from 'id'
|
||||||
|
|
||||||
|
closes T60
|
||||||
|
---
|
||||||
|
include/crm/msg_xml.h | 1 +
|
||||||
|
lib/common/acl.c | 21 +++++++++++++++++----
|
||||||
|
2 files changed, 18 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/crm/msg_xml.h b/include/crm/msg_xml.h
|
||||||
|
index b36dcf060..6470520b1 100644
|
||||||
|
--- a/include/crm/msg_xml.h
|
||||||
|
+++ b/include/crm/msg_xml.h
|
||||||
|
@@ -133,6 +133,7 @@ extern "C" {
|
||||||
|
# define XML_ATTR_VERSION "version"
|
||||||
|
# define XML_ATTR_DESC "description"
|
||||||
|
# define XML_ATTR_ID "id"
|
||||||
|
+# define XML_ATTR_NAME "name"
|
||||||
|
# define XML_ATTR_IDREF "id-ref"
|
||||||
|
# define XML_ATTR_ID_LONG "long-id"
|
||||||
|
# define XML_ATTR_TYPE "type"
|
||||||
|
diff --git a/lib/common/acl.c b/lib/common/acl.c
|
||||||
|
index d7f8469b1..b9f7472ee 100644
|
||||||
|
--- a/lib/common/acl.c
|
||||||
|
+++ b/lib/common/acl.c
|
||||||
|
@@ -278,8 +278,13 @@ pcmk__apply_acl(xmlNode *xml)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \internal
|
||||||
|
- * \brief Unpack ACLs for a given user
|
||||||
|
- *
|
||||||
|
+ * \brief Unpack ACLs for a given user into the
|
||||||
|
+ * metadata of the target XML tree
|
||||||
|
+ *
|
||||||
|
+ * Taking the description of ACLs from the source XML tree and
|
||||||
|
+ * marking up the target XML tree with access information for the
|
||||||
|
+ * given user by tacking it onto the relevant nodes
|
||||||
|
+ *
|
||||||
|
* \param[in] source XML with ACL definitions
|
||||||
|
* \param[in,out] target XML that ACLs will be applied to
|
||||||
|
* \param[in] user Username whose ACLs need to be unpacked
|
||||||
|
@@ -314,14 +319,22 @@ pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user)
|
||||||
|
|
||||||
|
if (!strcmp(tag, XML_ACL_TAG_USER)
|
||||||
|
|| !strcmp(tag, XML_ACL_TAG_USERv1)) {
|
||||||
|
- const char *id = crm_element_value(child, XML_ATTR_ID);
|
||||||
|
+ const char *id = crm_element_value(child, XML_ATTR_NAME);
|
||||||
|
+
|
||||||
|
+ if (id == NULL) {
|
||||||
|
+ id = crm_element_value(child, XML_ATTR_ID);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (id && strcmp(id, user) == 0) {
|
||||||
|
crm_debug("Unpacking ACLs for user '%s'", id);
|
||||||
|
p->acls = parse_acl_entry(acls, child, p->acls);
|
||||||
|
}
|
||||||
|
} else if (!strcmp(tag, XML_ACL_TAG_GROUP)) {
|
||||||
|
- const char *id = crm_element_value(child, XML_ATTR_ID);
|
||||||
|
+ const char *id = crm_element_value(child, XML_ATTR_NAME);
|
||||||
|
+
|
||||||
|
+ if (id == NULL) {
|
||||||
|
+ id = crm_element_value(child, XML_ATTR_ID);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (id && pcmk__is_user_in_group(user,id)) {
|
||||||
|
crm_debug("Unpacking ACLs for group '%s'", id);
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
88
SOURCES/003-regression.patch
Normal file
88
SOURCES/003-regression.patch
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
From 9853f4d05a376062d60f2e4c90938e587992237b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chris Lumens <clumens@redhat.com>
|
||||||
|
Date: Mon, 27 Jun 2022 12:06:24 -0400
|
||||||
|
Subject: [PATCH 1/2] Fix: tools: Don't output "(null)" in crm_attribute's
|
||||||
|
quiet mode.
|
||||||
|
|
||||||
|
If the attribute queried for has no value, simply do not output
|
||||||
|
anything.
|
||||||
|
|
||||||
|
Regression in 2.1.3 introduced by 8c03553bbf
|
||||||
|
|
||||||
|
Fixes T502
|
||||||
|
See: rhbz#2099331
|
||||||
|
---
|
||||||
|
tools/crm_attribute.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tools/crm_attribute.c b/tools/crm_attribute.c
|
||||||
|
index 0bd9dee81..b1463f906 100644
|
||||||
|
--- a/tools/crm_attribute.c
|
||||||
|
+++ b/tools/crm_attribute.c
|
||||||
|
@@ -56,7 +56,9 @@ attribute_text(pcmk__output_t *out, va_list args)
|
||||||
|
char *host G_GNUC_UNUSED = va_arg(args, char *);
|
||||||
|
|
||||||
|
if (out->quiet) {
|
||||||
|
- pcmk__formatted_printf(out, "%s\n", value);
|
||||||
|
+ if (value != NULL) {
|
||||||
|
+ pcmk__formatted_printf(out, "%s\n", value);
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
out->info(out, "%s%s %s%s %s%s value=%s",
|
||||||
|
scope ? "scope=" : "", scope ? scope : "",
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From 16d00a9b3ef27afd09f5c046ea1be50fc664ed84 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chris Lumens <clumens@redhat.com>
|
||||||
|
Date: Mon, 27 Jun 2022 12:18:06 -0400
|
||||||
|
Subject: [PATCH 2/2] Test: cts: Add a test for querying an attribute that does
|
||||||
|
not exist.
|
||||||
|
|
||||||
|
---
|
||||||
|
cts/cli/regression.tools.exp | 4 ++++
|
||||||
|
cts/cts-cli.in | 5 +++++
|
||||||
|
2 files changed, 9 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/cts/cli/regression.tools.exp b/cts/cli/regression.tools.exp
|
||||||
|
index 0d1cfa2ab..464472d42 100644
|
||||||
|
--- a/cts/cli/regression.tools.exp
|
||||||
|
+++ b/cts/cli/regression.tools.exp
|
||||||
|
@@ -24,6 +24,10 @@ A new shadow instance was created. To begin using it paste the following into y
|
||||||
|
</cib>
|
||||||
|
=#=#=#= End test: Validate CIB - OK (0) =#=#=#=
|
||||||
|
* Passed: cibadmin - Validate CIB
|
||||||
|
+=#=#=#= Begin test: Query the value of an attribute that does not exist =#=#=#=
|
||||||
|
+crm_attribute: Error performing operation: No such device or address
|
||||||
|
+=#=#=#= End test: Query the value of an attribute that does not exist - No such object (105) =#=#=#=
|
||||||
|
+* Passed: crm_attribute - Query the value of an attribute that does not exist
|
||||||
|
=#=#=#= Begin test: Configure something before erasing =#=#=#=
|
||||||
|
=#=#=#= Current cib after: Configure something before erasing =#=#=#=
|
||||||
|
<cib epoch="2" num_updates="0" admin_epoch="0">
|
||||||
|
diff --git a/cts/cts-cli.in b/cts/cts-cli.in
|
||||||
|
index 8565c485a..b895d36ec 100755
|
||||||
|
--- a/cts/cts-cli.in
|
||||||
|
+++ b/cts/cts-cli.in
|
||||||
|
@@ -511,6 +511,10 @@ function test_tools() {
|
||||||
|
cmd="cibadmin -Q"
|
||||||
|
test_assert $CRM_EX_OK
|
||||||
|
|
||||||
|
+ desc="Query the value of an attribute that does not exist"
|
||||||
|
+ cmd="crm_attribute -n ABCD --query --quiet"
|
||||||
|
+ test_assert $CRM_EX_NOSUCH 0
|
||||||
|
+
|
||||||
|
desc="Configure something before erasing"
|
||||||
|
cmd="crm_attribute -n cluster-delay -v 60s"
|
||||||
|
test_assert $CRM_EX_OK
|
||||||
|
@@ -1980,6 +1984,7 @@ for t in $tests; do
|
||||||
|
-e 's/ end=\"[0-9][-+: 0-9]*Z*\"/ end=\"\"/' \
|
||||||
|
-e 's/ start=\"[0-9][-+: 0-9]*Z*\"/ start=\"\"/' \
|
||||||
|
-e 's/^Error checking rule: Device not configured/Error checking rule: No such device or address/' \
|
||||||
|
+ -e 's/Error performing operation: Device not configured/Error performing operation: No such device or address/' \
|
||||||
|
-e 's/\(Injecting attribute last-failure-ping#monitor_10000=\)[0-9]*/\1/' \
|
||||||
|
-e 's/^lt-//' \
|
||||||
|
-e 's/ocf::/ocf:/' \
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
624
SOURCES/004-schema.patch
Normal file
624
SOURCES/004-schema.patch
Normal file
@ -0,0 +1,624 @@
|
|||||||
|
From e8f96dec79bb33c11d39c9037ac623f18a67b539 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Petr Pavlu <petr.pavlu@suse.com>
|
||||||
|
Date: Tue, 24 May 2022 18:08:57 +0200
|
||||||
|
Subject: [PATCH] Low: schemas: copy API schemas in preparation for changes
|
||||||
|
|
||||||
|
Copy crm_mon, crm_simulate and nodes API schemas in preparation for
|
||||||
|
changes and bump the external reference version in crm_mon and
|
||||||
|
crm_simulate to point to the new nodes schema.
|
||||||
|
---
|
||||||
|
include/crm/common/output_internal.h | 2 +-
|
||||||
|
xml/api/crm_mon-2.21.rng | 183 +++++++++++++++
|
||||||
|
xml/api/crm_simulate-2.21.rng | 338 +++++++++++++++++++++++++++
|
||||||
|
xml/api/nodes-2.21.rng | 51 ++++
|
||||||
|
4 files changed, 573 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 xml/api/crm_mon-2.21.rng
|
||||||
|
create mode 100644 xml/api/crm_simulate-2.21.rng
|
||||||
|
create mode 100644 xml/api/nodes-2.21.rng
|
||||||
|
|
||||||
|
diff --git a/include/crm/common/output_internal.h b/include/crm/common/output_internal.h
|
||||||
|
index 577fd5247..74ee833c1 100644
|
||||||
|
--- a/include/crm/common/output_internal.h
|
||||||
|
+++ b/include/crm/common/output_internal.h
|
||||||
|
@@ -28,7 +28,7 @@ extern "C" {
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
-# define PCMK__API_VERSION "2.20"
|
||||||
|
+# define PCMK__API_VERSION "2.21"
|
||||||
|
|
||||||
|
#if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
|
||||||
|
# define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
|
||||||
|
diff --git a/xml/api/crm_mon-2.21.rng b/xml/api/crm_mon-2.21.rng
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..37036d665
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/xml/api/crm_mon-2.21.rng
|
||||||
|
@@ -0,0 +1,183 @@
|
||||||
|
+<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||||
|
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
+
|
||||||
|
+ <start>
|
||||||
|
+ <ref name="element-crm-mon"/>
|
||||||
|
+ </start>
|
||||||
|
+
|
||||||
|
+ <define name="element-crm-mon">
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="element-summary" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="nodes-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="resources-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="node-attributes-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <externalRef href="node-history-2.12.rng"/>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="failures-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="fence-event-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="tickets-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="bans-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-summary">
|
||||||
|
+ <element name="summary">
|
||||||
|
+ <optional>
|
||||||
|
+ <element name="stack">
|
||||||
|
+ <attribute name="type"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <element name="current_dc">
|
||||||
|
+ <attribute name="present"> <data type="boolean" /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <group>
|
||||||
|
+ <attribute name="version"> <text /> </attribute>
|
||||||
|
+ <attribute name="name"> <text /> </attribute>
|
||||||
|
+ <attribute name="id"> <text /> </attribute>
|
||||||
|
+ <attribute name="with_quorum"> <data type="boolean" /> </attribute>
|
||||||
|
+ </group>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <element name="last_update">
|
||||||
|
+ <attribute name="time"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ <element name="last_change">
|
||||||
|
+ <attribute name="time"> <text /> </attribute>
|
||||||
|
+ <attribute name="user"> <text /> </attribute>
|
||||||
|
+ <attribute name="client"> <text /> </attribute>
|
||||||
|
+ <attribute name="origin"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <element name="nodes_configured">
|
||||||
|
+ <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ <element name="resources_configured">
|
||||||
|
+ <attribute name="number"> <data type="nonNegativeInteger" /> </attribute>
|
||||||
|
+ <attribute name="disabled"> <data type="nonNegativeInteger" /> </attribute>
|
||||||
|
+ <attribute name="blocked"> <data type="nonNegativeInteger" /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <element name="cluster_options">
|
||||||
|
+ <attribute name="stonith-enabled"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="symmetric-cluster"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="no-quorum-policy"> <text /> </attribute>
|
||||||
|
+ <attribute name="maintenance-mode"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="stop-all-resources"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="stonith-timeout-ms"> <data type="integer" /> </attribute>
|
||||||
|
+ <attribute name="priority-fencing-delay-ms"> <data type="integer" /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="resources-list">
|
||||||
|
+ <element name="resources">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="resources-2.4.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="nodes-list">
|
||||||
|
+ <element name="nodes">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="nodes-2.21.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="node-attributes-list">
|
||||||
|
+ <element name="node_attributes">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="node-attrs-2.8.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="failures-list">
|
||||||
|
+ <element name="failures">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="failure-2.8.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="fence-event-list">
|
||||||
|
+ <element name="fence_history">
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="status"> <data type="integer" /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="fence-event-2.15.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="tickets-list">
|
||||||
|
+ <element name="tickets">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-ticket" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="bans-list">
|
||||||
|
+ <element name="bans">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-ban" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-ticket">
|
||||||
|
+ <element name="ticket">
|
||||||
|
+ <attribute name="id"> <text /> </attribute>
|
||||||
|
+ <attribute name="status">
|
||||||
|
+ <choice>
|
||||||
|
+ <value>granted</value>
|
||||||
|
+ <value>revoked</value>
|
||||||
|
+ </choice>
|
||||||
|
+ </attribute>
|
||||||
|
+ <attribute name="standby"> <data type="boolean" /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="last-granted"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-ban">
|
||||||
|
+ <element name="ban">
|
||||||
|
+ <attribute name="id"> <text /> </attribute>
|
||||||
|
+ <attribute name="resource"> <text /> </attribute>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <attribute name="weight"> <data type="integer" /> </attribute>
|
||||||
|
+ <attribute name="promoted-only"> <data type="boolean" /> </attribute>
|
||||||
|
+ <!-- DEPRECATED: master_only is a duplicate of promoted-only that is
|
||||||
|
+ provided solely for API backward compatibility. It will be
|
||||||
|
+ removed in a future release. Check promoted-only instead.
|
||||||
|
+ -->
|
||||||
|
+ <attribute name="master_only"> <data type="boolean" /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+</grammar>
|
||||||
|
diff --git a/xml/api/crm_simulate-2.21.rng b/xml/api/crm_simulate-2.21.rng
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..75a9b399b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/xml/api/crm_simulate-2.21.rng
|
||||||
|
@@ -0,0 +1,338 @@
|
||||||
|
+<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||||
|
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
+
|
||||||
|
+ <start>
|
||||||
|
+ <ref name="element-crm-simulate"/>
|
||||||
|
+ </start>
|
||||||
|
+
|
||||||
|
+ <define name="element-crm-simulate">
|
||||||
|
+ <choice>
|
||||||
|
+ <ref name="timings-list" />
|
||||||
|
+ <group>
|
||||||
|
+ <ref name="cluster-status" />
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="modifications-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="allocations-utilizations-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="action-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="cluster-injected-actions-list" />
|
||||||
|
+ <ref name="revised-cluster-status" />
|
||||||
|
+ </optional>
|
||||||
|
+ </group>
|
||||||
|
+ </choice>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="allocations-utilizations-list">
|
||||||
|
+ <choice>
|
||||||
|
+ <element name="allocations">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <choice>
|
||||||
|
+ <ref name="element-allocation" />
|
||||||
|
+ <ref name="element-promotion" />
|
||||||
|
+ </choice>
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ <element name="utilizations">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <choice>
|
||||||
|
+ <ref name="element-capacity" />
|
||||||
|
+ <ref name="element-utilization" />
|
||||||
|
+ </choice>
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ <element name="allocations_utilizations">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <choice>
|
||||||
|
+ <ref name="element-allocation" />
|
||||||
|
+ <ref name="element-promotion" />
|
||||||
|
+ <ref name="element-capacity" />
|
||||||
|
+ <ref name="element-utilization" />
|
||||||
|
+ </choice>
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </choice>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="cluster-status">
|
||||||
|
+ <element name="cluster_status">
|
||||||
|
+ <ref name="nodes-list" />
|
||||||
|
+ <ref name="resources-list" />
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="node-attributes-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <externalRef href="node-history-2.12.rng" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="failures-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="modifications-list">
|
||||||
|
+ <element name="modifications">
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="quorum"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="watchdog"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-inject-modify-node" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-inject-modify-ticket" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-inject-spec" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-inject-attr" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="revised-cluster-status">
|
||||||
|
+ <element name="revised_cluster_status">
|
||||||
|
+ <ref name="nodes-list" />
|
||||||
|
+ <ref name="resources-list" />
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="node-attributes-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <ref name="failures-list" />
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-attr">
|
||||||
|
+ <element name="inject_attr">
|
||||||
|
+ <attribute name="cib_node"> <text /> </attribute>
|
||||||
|
+ <attribute name="name"> <text /> </attribute>
|
||||||
|
+ <attribute name="node_path"> <text /> </attribute>
|
||||||
|
+ <attribute name="value"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-modify-node">
|
||||||
|
+ <element name="modify_node">
|
||||||
|
+ <attribute name="action"> <text /> </attribute>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-spec">
|
||||||
|
+ <element name="inject_spec">
|
||||||
|
+ <attribute name="spec"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-modify-ticket">
|
||||||
|
+ <element name="modify_ticket">
|
||||||
|
+ <attribute name="action"> <text /> </attribute>
|
||||||
|
+ <attribute name="ticket"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="cluster-injected-actions-list">
|
||||||
|
+ <element name="transition">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-injected-actions" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="node-attributes-list">
|
||||||
|
+ <element name="node_attributes">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="node-attrs-2.8.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="failures-list">
|
||||||
|
+ <element name="failures">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="failure-2.8.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="nodes-list">
|
||||||
|
+ <element name="nodes">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="nodes-2.21.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="resources-list">
|
||||||
|
+ <element name="resources">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <externalRef href="resources-2.4.rng" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="timings-list">
|
||||||
|
+ <element name="timings">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-timing" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="action-list">
|
||||||
|
+ <element name="actions">
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-node-action" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <ref name="element-rsc-action" />
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-allocation">
|
||||||
|
+ <element name="node_weight">
|
||||||
|
+ <attribute name="function"> <text /> </attribute>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <externalRef href="../score.rng" />
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="id"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-capacity">
|
||||||
|
+ <element name="capacity">
|
||||||
|
+ <attribute name="comment"> <text /> </attribute>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <element>
|
||||||
|
+ <anyName />
|
||||||
|
+ <text />
|
||||||
|
+ </element>
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-cluster-action">
|
||||||
|
+ <element name="cluster_action">
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <attribute name="task"> <text /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="id"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-injected-actions">
|
||||||
|
+ <choice>
|
||||||
|
+ <ref name="element-inject-cluster-action" />
|
||||||
|
+ <ref name="element-inject-fencing-action" />
|
||||||
|
+ <ref name="element-inject-pseudo-action" />
|
||||||
|
+ <ref name="element-inject-rsc-action" />
|
||||||
|
+ </choice>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-fencing-action">
|
||||||
|
+ <element name="fencing_action">
|
||||||
|
+ <attribute name="op"> <text /> </attribute>
|
||||||
|
+ <attribute name="target"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-node-action">
|
||||||
|
+ <element name="node_action">
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <attribute name="reason"> <text /> </attribute>
|
||||||
|
+ <attribute name="task"> <text /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-promotion">
|
||||||
|
+ <element name="promotion_score">
|
||||||
|
+ <attribute name="id"> <text /> </attribute>
|
||||||
|
+ <externalRef href="../score.rng" />
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-pseudo-action">
|
||||||
|
+ <element name="pseudo_action">
|
||||||
|
+ <attribute name="task"> <text /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-inject-rsc-action">
|
||||||
|
+ <element name="rsc_action">
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <attribute name="op"> <text /> </attribute>
|
||||||
|
+ <attribute name="resource"> <text /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="interval"> <data type="integer" /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-timing">
|
||||||
|
+ <element name="timing">
|
||||||
|
+ <attribute name="file"> <text /> </attribute>
|
||||||
|
+ <attribute name="duration"> <data type="double" /> </attribute>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-rsc-action">
|
||||||
|
+ <element name="rsc_action">
|
||||||
|
+ <attribute name="action"> <text /> </attribute>
|
||||||
|
+ <attribute name="resource"> <text /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="blocked"> <data type="boolean" /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="dest"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="next-role"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="reason"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="role"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="source"> <text /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+
|
||||||
|
+ <define name="element-utilization">
|
||||||
|
+ <element name="utilization">
|
||||||
|
+ <attribute name="function"> <text /> </attribute>
|
||||||
|
+ <attribute name="node"> <text /> </attribute>
|
||||||
|
+ <attribute name="resource"> <text /> </attribute>
|
||||||
|
+ <zeroOrMore>
|
||||||
|
+ <element>
|
||||||
|
+ <anyName />
|
||||||
|
+ <text />
|
||||||
|
+ </element>
|
||||||
|
+ </zeroOrMore>
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+</grammar>
|
||||||
|
diff --git a/xml/api/nodes-2.21.rng b/xml/api/nodes-2.21.rng
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..df4c77f37
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/xml/api/nodes-2.21.rng
|
||||||
|
@@ -0,0 +1,51 @@
|
||||||
|
+<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
+<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||||
|
+ datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||||
|
+
|
||||||
|
+ <start>
|
||||||
|
+ <ref name="element-full-node"/>
|
||||||
|
+ </start>
|
||||||
|
+
|
||||||
|
+ <define name="element-full-node">
|
||||||
|
+ <element name="node">
|
||||||
|
+ <attribute name="name"> <text/> </attribute>
|
||||||
|
+ <attribute name="id"> <text/> </attribute>
|
||||||
|
+ <attribute name="online"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="standby"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="standby_onfail"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="maintenance"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="pending"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="unclean"> <data type="boolean" /> </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="health">
|
||||||
|
+ <choice>
|
||||||
|
+ <value>red</value>
|
||||||
|
+ <value>yellow</value>
|
||||||
|
+ <value>green</value>
|
||||||
|
+ </choice>
|
||||||
|
+ </attribute>
|
||||||
|
+ </optional>
|
||||||
|
+ <attribute name="shutdown"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="expected_up"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="is_dc"> <data type="boolean" /> </attribute>
|
||||||
|
+ <attribute name="resources_running"> <data type="nonNegativeInteger" /> </attribute>
|
||||||
|
+ <attribute name="type">
|
||||||
|
+ <choice>
|
||||||
|
+ <value>unknown</value>
|
||||||
|
+ <value>member</value>
|
||||||
|
+ <value>remote</value>
|
||||||
|
+ <value>ping</value>
|
||||||
|
+ </choice>
|
||||||
|
+ </attribute>
|
||||||
|
+ <optional>
|
||||||
|
+ <!-- for virtualized pacemaker_remote nodes, crm_mon 1.1.13 uses
|
||||||
|
+ "container_id" while later versions use "id_as_resource" -->
|
||||||
|
+ <choice>
|
||||||
|
+ <attribute name="container_id"> <text/> </attribute>
|
||||||
|
+ <attribute name="id_as_resource"> <text/> </attribute>
|
||||||
|
+ </choice>
|
||||||
|
+ </optional>
|
||||||
|
+ <externalRef href="resources-2.4.rng" />
|
||||||
|
+ </element>
|
||||||
|
+ </define>
|
||||||
|
+</grammar>
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -1,73 +0,0 @@
|
|||||||
From 09ef95a2eed48b4eb7488788a1b655d67eafe783 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Chris Lumens <clumens@redhat.com>
|
|
||||||
Date: Tue, 30 Nov 2021 14:47:12 -0500
|
|
||||||
Subject: [PATCH] Low: libcrmservice: Handle systemd service templates.
|
|
||||||
|
|
||||||
These unit files (which have an @ sign at the end) expect to be
|
|
||||||
parameterized by an instance name. Not providing an instance name
|
|
||||||
causes the dbus lookup to fail, and we fall back to assume this is an
|
|
||||||
LSB service. If the user doesn't provide an instance name, just add a
|
|
||||||
fake one. It doesn't seem to matter what name is given for the lookup.
|
|
||||||
|
|
||||||
See: rhbz#2003151
|
|
||||||
---
|
|
||||||
lib/services/systemd.c | 22 ++++++++++++++++------
|
|
||||||
1 file changed, 16 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/services/systemd.c b/lib/services/systemd.c
|
|
||||||
index 8e9fff484..27a3b376d 100644
|
|
||||||
--- a/lib/services/systemd.c
|
|
||||||
+++ b/lib/services/systemd.c
|
|
||||||
@@ -206,17 +206,27 @@ systemd_unit_extension(const char *name)
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
-systemd_service_name(const char *name)
|
|
||||||
+systemd_service_name(const char *name, bool add_instance_name)
|
|
||||||
{
|
|
||||||
- if (name == NULL) {
|
|
||||||
+ if (pcmk__str_empty(name)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (systemd_unit_extension(name)) {
|
|
||||||
return strdup(name);
|
|
||||||
- }
|
|
||||||
|
|
||||||
- return crm_strdup_printf("%s.service", name);
|
|
||||||
+ /* Services that end with an @ sign are systemd templates. They expect an
|
|
||||||
+ * instance name to follow the service name. If no instance name was
|
|
||||||
+ * provided, just add "x" to the string as the instance name. It doesn't
|
|
||||||
+ * seem to matter for purposes of looking up whether a service exists or
|
|
||||||
+ * not.
|
|
||||||
+ */
|
|
||||||
+ } else if (add_instance_name && *(name+strlen(name)-1) == '@') {
|
|
||||||
+ return crm_strdup_printf("%sx.service", name);
|
|
||||||
+
|
|
||||||
+ } else {
|
|
||||||
+ return crm_strdup_printf("%s.service", name);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
@@ -427,7 +437,7 @@ invoke_unit_by_name(const char *arg_name, svc_action_t *op, char **path)
|
|
||||||
CRM_ASSERT(msg != NULL);
|
|
||||||
|
|
||||||
// Add the (expanded) unit name as the argument
|
|
||||||
- name = systemd_service_name(arg_name);
|
|
||||||
+ name = systemd_service_name(arg_name, op == NULL || pcmk__str_eq(op->action, "meta-data", pcmk__str_none));
|
|
||||||
CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,
|
|
||||||
DBUS_TYPE_INVALID));
|
|
||||||
free(name);
|
|
||||||
@@ -944,7 +954,7 @@ invoke_unit_by_path(svc_action_t *op, const char *unit)
|
|
||||||
/* (ss) */
|
|
||||||
{
|
|
||||||
const char *replace_s = "replace";
|
|
||||||
- char *name = systemd_service_name(op->agent);
|
|
||||||
+ char *name = systemd_service_name(op->agent, pcmk__str_eq(op->action, "meta-data", pcmk__str_none));
|
|
||||||
|
|
||||||
CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID));
|
|
||||||
CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &replace_s, DBUS_TYPE_INVALID));
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
46
SOURCES/005-schema.patch
Normal file
46
SOURCES/005-schema.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From 5b6280ac1a213e176aee6d61945b3283ea060a88 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Petr Pavlu <petr.pavlu@suse.com>
|
||||||
|
Date: Tue, 24 May 2022 18:02:31 +0200
|
||||||
|
Subject: [PATCH] Feature: tools: report CRM feature set of nodes by crm_mon
|
||||||
|
|
||||||
|
Enable crm_mon to report when CRM feature set is not consistent among
|
||||||
|
online nodes and output a version of each node if --show-detail is
|
||||||
|
specified.
|
||||||
|
---
|
||||||
|
xml/api/crm_mon-2.21.rng | 3 +
|
||||||
|
xml/api/nodes-2.21.rng | 3 +
|
||||||
|
9 files changed, 508 insertions(+), 125 deletions(-)
|
||||||
|
create mode 100644 cts/cli/crm_mon-feature_set.xml
|
||||||
|
create mode 100644 cts/cli/regression.feature_set.exp
|
||||||
|
|
||||||
|
diff --git a/xml/api/crm_mon-2.21.rng b/xml/api/crm_mon-2.21.rng
|
||||||
|
index 37036d665..e99bcc3d7 100644
|
||||||
|
--- a/xml/api/crm_mon-2.21.rng
|
||||||
|
+++ b/xml/api/crm_mon-2.21.rng
|
||||||
|
@@ -54,6 +54,9 @@
|
||||||
|
<attribute name="with_quorum"> <data type="boolean" /> </attribute>
|
||||||
|
</group>
|
||||||
|
</optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="mixed_version"> <data type="boolean" /> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
|
<optional>
|
||||||
|
diff --git a/xml/api/nodes-2.21.rng b/xml/api/nodes-2.21.rng
|
||||||
|
index df4c77f37..7e236ba63 100644
|
||||||
|
--- a/xml/api/nodes-2.21.rng
|
||||||
|
+++ b/xml/api/nodes-2.21.rng
|
||||||
|
@@ -25,6 +25,9 @@
|
||||||
|
</choice>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
|
+ <optional>
|
||||||
|
+ <attribute name="feature_set"> <text/> </attribute>
|
||||||
|
+ </optional>
|
||||||
|
<attribute name="shutdown"> <data type="boolean" /> </attribute>
|
||||||
|
<attribute name="expected_up"> <data type="boolean" /> </attribute>
|
||||||
|
<attribute name="is_dc"> <data type="boolean" /> </attribute>
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
1686
SOURCES/006-crm_resource.patch
Normal file
1686
SOURCES/006-crm_resource.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,143 +0,0 @@
|
|||||||
From b52fe799c89637e2a761a5725c2376db5c05f2d1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 30 Nov 2021 15:51:54 -0600
|
|
||||||
Subject: [PATCH 1/2] Low: resources: remove DOCTYPE from OCF 1.1-compliant
|
|
||||||
agents
|
|
||||||
|
|
||||||
OCF 1.1 replaced the DTD schema with RNG, but DOCTYPE still refers to the DTD.
|
|
||||||
There's no DOCTYPE for RNG, and DOCTYPE is optional, so just remove it.
|
|
||||||
---
|
|
||||||
extra/resources/Dummy | 3 +--
|
|
||||||
extra/resources/HealthIOWait | 3 +--
|
|
||||||
extra/resources/Stateful | 3 +--
|
|
||||||
extra/resources/attribute | 3 +--
|
|
||||||
extra/resources/ping | 3 +--
|
|
||||||
extra/resources/remote | 3 +--
|
|
||||||
6 files changed, 6 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/extra/resources/Dummy b/extra/resources/Dummy
|
|
||||||
index a344deac0..56584e564 100755
|
|
||||||
--- a/extra/resources/Dummy
|
|
||||||
+++ b/extra/resources/Dummy
|
|
||||||
@@ -58,8 +58,7 @@
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
-<resource-agent name="Dummy" version="2.0">
|
|
||||||
+<resource-agent name="Dummy" version="2.1">
|
|
||||||
<version>1.1</version>
|
|
||||||
|
|
||||||
<longdesc lang="en">
|
|
||||||
diff --git a/extra/resources/HealthIOWait b/extra/resources/HealthIOWait
|
|
||||||
index 43a8b70c4..5f1483ef7 100755
|
|
||||||
--- a/extra/resources/HealthIOWait
|
|
||||||
+++ b/extra/resources/HealthIOWait
|
|
||||||
@@ -25,8 +25,7 @@
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
-<resource-agent name="HealthIOWait" version="1.1">
|
|
||||||
+<resource-agent name="HealthIOWait" version="1.2">
|
|
||||||
<version>1.1</version>
|
|
||||||
|
|
||||||
<longdesc lang="en">
|
|
||||||
diff --git a/extra/resources/Stateful b/extra/resources/Stateful
|
|
||||||
index ae3424bbf..0d2062d51 100755
|
|
||||||
--- a/extra/resources/Stateful
|
|
||||||
+++ b/extra/resources/Stateful
|
|
||||||
@@ -39,8 +39,7 @@ SCORE_PROMOTED=10
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
-<resource-agent name="Stateful" version="1.1">
|
|
||||||
+<resource-agent name="Stateful" version="1.2">
|
|
||||||
<version>1.1</version>
|
|
||||||
|
|
||||||
<longdesc lang="en">
|
|
||||||
diff --git a/extra/resources/attribute b/extra/resources/attribute
|
|
||||||
index 1800dff8f..a2bd353e0 100755
|
|
||||||
--- a/extra/resources/attribute
|
|
||||||
+++ b/extra/resources/attribute
|
|
||||||
@@ -57,8 +57,7 @@ END
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
-<resource-agent name="attribute" version="1.1">
|
|
||||||
+<resource-agent name="attribute" version="1.2">
|
|
||||||
<version>1.1</version>
|
|
||||||
<shortdesc lang="en">Manages a node attribute</shortdesc>
|
|
||||||
<longdesc lang="en">
|
|
||||||
diff --git a/extra/resources/ping b/extra/resources/ping
|
|
||||||
index 6e296979f..7cc6b802d 100755
|
|
||||||
--- a/extra/resources/ping
|
|
||||||
+++ b/extra/resources/ping
|
|
||||||
@@ -36,8 +36,7 @@
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
-<resource-agent name="ping" version="1.1">
|
|
||||||
+<resource-agent name="ping" version="1.2">
|
|
||||||
<version>1.1</version>
|
|
||||||
|
|
||||||
<longdesc lang="en">
|
|
||||||
diff --git a/extra/resources/remote b/extra/resources/remote
|
|
||||||
index a53262bb6..f7e40dc81 100755
|
|
||||||
--- a/extra/resources/remote
|
|
||||||
+++ b/extra/resources/remote
|
|
||||||
@@ -24,8 +24,7 @@
|
|
||||||
meta_data() {
|
|
||||||
cat <<END
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
|
|
||||||
-<resource-agent name="remote" version="1.0">
|
|
||||||
+<resource-agent name="remote" version="1.1">
|
|
||||||
<version>1.1</version>
|
|
||||||
<shortdesc lang="en">Pacemaker Remote connection</shortdesc>
|
|
||||||
<parameters>
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 70f469120f8db6a024c786466ee74a6c7fbd1f43 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 30 Nov 2021 15:53:39 -0600
|
|
||||||
Subject: [PATCH 2/2] Fix: resources: use correct syntax in Stateful meta-data
|
|
||||||
|
|
||||||
The OCF standard only allows "0" or "1" for booleans.
|
|
||||||
|
|
||||||
This fixes incorrect ocf:pacemaker:Stateful meta-data syntax introduced by
|
|
||||||
7024398 as a regression in the 2.1.0 release.
|
|
||||||
---
|
|
||||||
extra/resources/Stateful | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/extra/resources/Stateful b/extra/resources/Stateful
|
|
||||||
index 0d2062d51..2ebe6725f 100755
|
|
||||||
--- a/extra/resources/Stateful
|
|
||||||
+++ b/extra/resources/Stateful
|
|
||||||
@@ -57,7 +57,7 @@ Location to store the resource state in
|
|
||||||
<content type="string" default="${HA_VARRUN%%/}/Stateful-${OCF_RESOURCE_INSTANCE}.state" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
-<parameter name="envfile" reloadable="true">
|
|
||||||
+<parameter name="envfile" reloadable="1">
|
|
||||||
<longdesc lang="en">
|
|
||||||
If this is set, the environment will be dumped to this file for every call.
|
|
||||||
</longdesc>
|
|
||||||
@@ -65,7 +65,7 @@ If this is set, the environment will be dumped to this file for every call.
|
|
||||||
<content type="string" default="" />
|
|
||||||
</parameter>
|
|
||||||
|
|
||||||
-<parameter name="notify_delay" reloadable="true">
|
|
||||||
+<parameter name="notify_delay" reloadable="1">
|
|
||||||
<longdesc lang="en">
|
|
||||||
The notify action will sleep for this many seconds before returning,
|
|
||||||
to simulate a long-running notify.
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
From f491d9d5a7ed554fed985de356bb085fdec3421c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 7 Dec 2021 09:01:00 -0600
|
|
||||||
Subject: [PATCH] Fix: fencer: avoid memory leak when broadcasting history
|
|
||||||
differences
|
|
||||||
|
|
||||||
Regression introduced in 2.1.0 by dbc27b2
|
|
||||||
---
|
|
||||||
daemons/fenced/fenced_history.c | 7 +++++--
|
|
||||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/fenced/fenced_history.c b/daemons/fenced/fenced_history.c
|
|
||||||
index bc159383c..a9c57dc86 100644
|
|
||||||
--- a/daemons/fenced/fenced_history.c
|
|
||||||
+++ b/daemons/fenced/fenced_history.c
|
|
||||||
@@ -484,8 +484,6 @@ stonith_fence_history(xmlNode *msg, xmlNode **output,
|
|
||||||
!pcmk__str_eq(remote_peer, stonith_our_uname, pcmk__str_casei)) {
|
|
||||||
xmlNode *history = get_xpath_object("//" F_STONITH_HISTORY_LIST,
|
|
||||||
msg, LOG_NEVER);
|
|
||||||
- GHashTable *received_history =
|
|
||||||
- history?stonith_xml_history_to_list(history):NULL;
|
|
||||||
|
|
||||||
/* either a broadcast created directly upon stonith-API request
|
|
||||||
* or a diff as response to such a thing
|
|
||||||
@@ -497,6 +495,11 @@ stonith_fence_history(xmlNode *msg, xmlNode **output,
|
|
||||||
if (!history ||
|
|
||||||
!crm_is_true(crm_element_value(history,
|
|
||||||
F_STONITH_DIFFERENTIAL))) {
|
|
||||||
+ GHashTable *received_history = NULL;
|
|
||||||
+
|
|
||||||
+ if (history != NULL) {
|
|
||||||
+ received_history = stonith_xml_history_to_list(history);
|
|
||||||
+ }
|
|
||||||
out_history =
|
|
||||||
stonith_local_history_diff_and_merge(received_history, TRUE, NULL);
|
|
||||||
if (out_history) {
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
108
SOURCES/007-stonith_admin.patch
Normal file
108
SOURCES/007-stonith_admin.patch
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
From d6294dd28b6d95ad3844824996717f9959d97ac6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Reid Wahl <nrwahl@protonmail.com>
|
||||||
|
Date: Thu, 30 Jun 2022 11:07:32 -0700
|
||||||
|
Subject: [PATCH 1/2] Fix: Use correct boolean in stonith__validate_agent_xml
|
||||||
|
|
||||||
|
This fixes a regression introduced by 91a2b2e that flips the boolean
|
||||||
|
values for "valid" in the XML output.
|
||||||
|
|
||||||
|
Resolves: RHBZ#2102292 (partial)
|
||||||
|
|
||||||
|
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
|
||||||
|
---
|
||||||
|
lib/fencing/st_output.c | 7 +++----
|
||||||
|
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/fencing/st_output.c b/lib/fencing/st_output.c
|
||||||
|
index e0ff848c2..eb10ad0c5 100644
|
||||||
|
--- a/lib/fencing/st_output.c
|
||||||
|
+++ b/lib/fencing/st_output.c
|
||||||
|
@@ -528,10 +528,9 @@ validate_agent_xml(pcmk__output_t *out, va_list args) {
|
||||||
|
char *error_output = va_arg(args, char *);
|
||||||
|
int rc = va_arg(args, int);
|
||||||
|
|
||||||
|
- xmlNodePtr node = pcmk__output_create_xml_node(out, "validate",
|
||||||
|
- "agent", agent,
|
||||||
|
- "valid", pcmk__btoa(rc),
|
||||||
|
- NULL);
|
||||||
|
+ xmlNodePtr node = pcmk__output_create_xml_node(
|
||||||
|
+ out, "validate", "agent", agent, "valid", pcmk__btoa(rc == pcmk_ok),
|
||||||
|
+ NULL);
|
||||||
|
|
||||||
|
if (device != NULL) {
|
||||||
|
crm_xml_add(node, "device", device);
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From 81e83683e69b4f147f40f5353f8e68032758a104 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Reid Wahl <nrwahl@protonmail.com>
|
||||||
|
Date: Wed, 29 Jun 2022 18:15:33 -0700
|
||||||
|
Subject: [PATCH 2/2] Fix: Use failed action result in rhcs_validate and
|
||||||
|
_get_metadata
|
||||||
|
|
||||||
|
If an action failed but has a non-NULL result, get the rc and other
|
||||||
|
attributes from that result.
|
||||||
|
|
||||||
|
This fixes a regression introduced by b441925, in which failure XML
|
||||||
|
output now contains a CRM_EX_CONNECTED rc instead of the correct one and
|
||||||
|
does not contain stdout/stderr. That commit caused
|
||||||
|
services__execute_file() to return a proper rc instead of TRUE. A
|
||||||
|
non-pcmk_ok bubbled up the call chain causing
|
||||||
|
internal_stonith_action_execute() to return -ECONNABORTED. Then
|
||||||
|
rhcs_validate() and _get_metadata() would use this rc instead of the one
|
||||||
|
attached to the result.
|
||||||
|
|
||||||
|
Resolves: RHBZ#2102292
|
||||||
|
|
||||||
|
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
|
||||||
|
---
|
||||||
|
lib/fencing/st_rhcs.c | 10 +++++-----
|
||||||
|
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/fencing/st_rhcs.c b/lib/fencing/st_rhcs.c
|
||||||
|
index 39485013e..029c97eea 100644
|
||||||
|
--- a/lib/fencing/st_rhcs.c
|
||||||
|
+++ b/lib/fencing/st_rhcs.c
|
||||||
|
@@ -130,16 +130,15 @@ stonith__rhcs_get_metadata(const char *agent, int timeout, xmlNode **metadata)
|
||||||
|
stonith_action_t *action = stonith_action_create(agent, "metadata", NULL, 0,
|
||||||
|
5, NULL, NULL, NULL);
|
||||||
|
int rc = stonith__execute(action);
|
||||||
|
+ result = stonith__action_result(action);
|
||||||
|
|
||||||
|
- if (rc < 0) {
|
||||||
|
+ if (rc < 0 && result == NULL) {
|
||||||
|
crm_warn("Could not execute metadata action for %s: %s "
|
||||||
|
CRM_XS " rc=%d", agent, pcmk_strerror(rc), rc);
|
||||||
|
stonith__destroy_action(action);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
- result = stonith__action_result(action);
|
||||||
|
-
|
||||||
|
if (result->execution_status != PCMK_EXEC_DONE) {
|
||||||
|
crm_warn("Could not execute metadata action for %s: %s",
|
||||||
|
agent, pcmk_exec_status_str(result->execution_status));
|
||||||
|
@@ -262,6 +261,7 @@ stonith__rhcs_validate(stonith_t *st, int call_options, const char *target,
|
||||||
|
int remaining_timeout = timeout;
|
||||||
|
xmlNode *metadata = NULL;
|
||||||
|
stonith_action_t *action = NULL;
|
||||||
|
+ pcmk__action_result_t *result = NULL;
|
||||||
|
|
||||||
|
if (host_arg == NULL) {
|
||||||
|
time_t start_time = time(NULL);
|
||||||
|
@@ -298,9 +298,9 @@ stonith__rhcs_validate(stonith_t *st, int call_options, const char *target,
|
||||||
|
NULL, host_arg);
|
||||||
|
|
||||||
|
rc = stonith__execute(action);
|
||||||
|
- if (rc == pcmk_ok) {
|
||||||
|
- pcmk__action_result_t *result = stonith__action_result(action);
|
||||||
|
+ result = stonith__action_result(action);
|
||||||
|
|
||||||
|
+ if (result != NULL) {
|
||||||
|
rc = pcmk_rc2legacy(stonith__result2rc(result));
|
||||||
|
|
||||||
|
// Take ownership of output so stonith__destroy_action() doesn't free it
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -1,43 +0,0 @@
|
|||||||
From 0339e89f3238b31df78b864dae8684b82c370741 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 13 Dec 2021 15:22:40 -0600
|
|
||||||
Subject: [PATCH] Fix: fencer: get current time correctly
|
|
||||||
|
|
||||||
f52bc8e1ce (2.1.2) introduced a regression by using clock_gettime() with
|
|
||||||
CLOCK_MONOTONIC to get the current time. Use qb_util_timespec_from_epoch_get()
|
|
||||||
instead (which as of this writing uses clock_gettime() with CLOCK_REALTIME if
|
|
||||||
available, and falls back to gettimeofday() if not).
|
|
||||||
---
|
|
||||||
daemons/fenced/fenced_commands.c | 11 +++--------
|
|
||||||
1 file changed, 3 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/fenced/fenced_commands.c b/daemons/fenced/fenced_commands.c
|
|
||||||
index f34cb4f13..7685cb8c3 100644
|
|
||||||
--- a/daemons/fenced/fenced_commands.c
|
|
||||||
+++ b/daemons/fenced/fenced_commands.c
|
|
||||||
@@ -2746,19 +2746,14 @@ bool fencing_peer_active(crm_node_t *peer)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
-void set_fencing_completed(remote_fencing_op_t * op)
|
|
||||||
+void
|
|
||||||
+set_fencing_completed(remote_fencing_op_t *op)
|
|
||||||
{
|
|
||||||
-#ifdef CLOCK_MONOTONIC
|
|
||||||
struct timespec tv;
|
|
||||||
|
|
||||||
- clock_gettime(CLOCK_MONOTONIC, &tv);
|
|
||||||
-
|
|
||||||
+ qb_util_timespec_from_epoch_get(&tv);
|
|
||||||
op->completed = tv.tv_sec;
|
|
||||||
op->completed_nsec = tv.tv_nsec;
|
|
||||||
-#else
|
|
||||||
- op->completed = time(NULL);
|
|
||||||
- op->completed_nsec = 0L;
|
|
||||||
-#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
34
SOURCES/008-metadata.patch
Normal file
34
SOURCES/008-metadata.patch
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
From e4d9c795dfe2d6737c777a265292864da98dae8f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Reid Wahl <nrwahl@protonmail.com>
|
||||||
|
Date: Thu, 30 Jun 2022 14:40:31 -0700
|
||||||
|
Subject: [PATCH] Low: Always null-check result in stonith__rhcs_get_metadata
|
||||||
|
|
||||||
|
Null-check result even if rc == 0.
|
||||||
|
|
||||||
|
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
|
||||||
|
---
|
||||||
|
lib/fencing/st_rhcs.c | 8 +++++---
|
||||||
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/fencing/st_rhcs.c b/lib/fencing/st_rhcs.c
|
||||||
|
index 029c97eea..dfccff2cb 100644
|
||||||
|
--- a/lib/fencing/st_rhcs.c
|
||||||
|
+++ b/lib/fencing/st_rhcs.c
|
||||||
|
@@ -132,9 +132,11 @@ stonith__rhcs_get_metadata(const char *agent, int timeout, xmlNode **metadata)
|
||||||
|
int rc = stonith__execute(action);
|
||||||
|
result = stonith__action_result(action);
|
||||||
|
|
||||||
|
- if (rc < 0 && result == NULL) {
|
||||||
|
- crm_warn("Could not execute metadata action for %s: %s "
|
||||||
|
- CRM_XS " rc=%d", agent, pcmk_strerror(rc), rc);
|
||||||
|
+ if (result == NULL) {
|
||||||
|
+ if (rc < 0) {
|
||||||
|
+ crm_warn("Could not execute metadata action for %s: %s "
|
||||||
|
+ CRM_XS " rc=%d", agent, pcmk_strerror(rc), rc);
|
||||||
|
+ }
|
||||||
|
stonith__destroy_action(action);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
94
SOURCES/009-validate.patch
Normal file
94
SOURCES/009-validate.patch
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
From d00a6abde7e6a41f8bc6085c875cb8072aff499b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chris Lumens <clumens@redhat.com>
|
||||||
|
Date: Thu, 30 Jun 2022 09:25:05 -0400
|
||||||
|
Subject: [PATCH 1/2] Fix: libstonithd: Add the "Agent not found..." message to
|
||||||
|
formatted output.
|
||||||
|
|
||||||
|
---
|
||||||
|
lib/fencing/st_client.c | 11 ++++++++---
|
||||||
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
|
||||||
|
index 137642af7..971bbe9a5 100644
|
||||||
|
--- a/lib/fencing/st_client.c
|
||||||
|
+++ b/lib/fencing/st_client.c
|
||||||
|
@@ -1763,9 +1763,14 @@ stonith_api_validate(stonith_t *st, int call_options, const char *rsc_id,
|
||||||
|
default:
|
||||||
|
rc = -EINVAL;
|
||||||
|
errno = EINVAL;
|
||||||
|
- crm_perror(LOG_ERR,
|
||||||
|
- "Agent %s not found or does not support validation",
|
||||||
|
- agent);
|
||||||
|
+
|
||||||
|
+ if (error_output) {
|
||||||
|
+ *error_output = crm_strdup_printf("Agent %s not found or does not support validation",
|
||||||
|
+ agent);
|
||||||
|
+ } else {
|
||||||
|
+ crm_err("Agent %s not found or does not support validation", agent);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_hash_table_destroy(params_table);
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From f3a5fc961c30556b975011773e4cebf323bec38e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chris Lumens <clumens@redhat.com>
|
||||||
|
Date: Fri, 1 Jul 2022 10:38:45 -0400
|
||||||
|
Subject: [PATCH 2/2] Refactor: libstonithd: Split apart error conditions when
|
||||||
|
validating.
|
||||||
|
|
||||||
|
The "not found" and "can't validate" cases were previously jumbled
|
||||||
|
together. Now, return ENOENT if the agent is not found and EOPNOTSUPP
|
||||||
|
if it can't validate. The only caller appears to be handling both cases
|
||||||
|
correctly already, so no changes are needed there.
|
||||||
|
---
|
||||||
|
lib/fencing/st_client.c | 21 +++++++++++++++++----
|
||||||
|
1 file changed, 17 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
|
||||||
|
index 971bbe9a5..192334812 100644
|
||||||
|
--- a/lib/fencing/st_client.c
|
||||||
|
+++ b/lib/fencing/st_client.c
|
||||||
|
@@ -1760,19 +1760,32 @@ stonith_api_validate(stonith_t *st, int call_options, const char *rsc_id,
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+ case st_namespace_invalid:
|
||||||
|
+ errno = ENOENT;
|
||||||
|
+ rc = -errno;
|
||||||
|
+
|
||||||
|
+ if (error_output) {
|
||||||
|
+ *error_output = crm_strdup_printf("Agent %s not found", agent);
|
||||||
|
+ } else {
|
||||||
|
+ crm_err("Agent %s not found", agent);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
default:
|
||||||
|
- rc = -EINVAL;
|
||||||
|
- errno = EINVAL;
|
||||||
|
+ errno = EOPNOTSUPP;
|
||||||
|
+ rc = -errno;
|
||||||
|
|
||||||
|
if (error_output) {
|
||||||
|
- *error_output = crm_strdup_printf("Agent %s not found or does not support validation",
|
||||||
|
+ *error_output = crm_strdup_printf("Agent %s does not support validation",
|
||||||
|
agent);
|
||||||
|
} else {
|
||||||
|
- crm_err("Agent %s not found or does not support validation", agent);
|
||||||
|
+ crm_err("Agent %s does not support validation", agent);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
g_hash_table_destroy(params_table);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
47
SOURCES/010-regression.patch
Normal file
47
SOURCES/010-regression.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From e5f80059c7f1c0ad3264dc2a2a61e64cded0fe0f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hideo Yamauchi <renayama19661014@ybb.ne.jp>
|
||||||
|
Date: Tue, 12 Jul 2022 14:45:55 +0900
|
||||||
|
Subject: [PATCH] High: scheduler: Resolves an issue where STONITH devices
|
||||||
|
cannot be registered.
|
||||||
|
|
||||||
|
---
|
||||||
|
lib/pacemaker/pcmk_sched_allocate.c | 10 ++++++++++
|
||||||
|
1 file changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/pacemaker/pcmk_sched_allocate.c b/lib/pacemaker/pcmk_sched_allocate.c
|
||||||
|
index 85df6ace8..a7fe9c8d6 100644
|
||||||
|
--- a/lib/pacemaker/pcmk_sched_allocate.c
|
||||||
|
+++ b/lib/pacemaker/pcmk_sched_allocate.c
|
||||||
|
@@ -724,12 +724,18 @@ log_unrunnable_actions(pe_working_set_t *data_set)
|
||||||
|
static void
|
||||||
|
unpack_cib(xmlNode *cib, unsigned long long flags, pe_working_set_t *data_set)
|
||||||
|
{
|
||||||
|
+ const char* localhost_save = NULL;
|
||||||
|
+
|
||||||
|
if (pcmk_is_set(data_set->flags, pe_flag_have_status)) {
|
||||||
|
crm_trace("Reusing previously calculated cluster status");
|
||||||
|
pe__set_working_set_flags(data_set, flags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (data_set->localhost) {
|
||||||
|
+ localhost_save = data_set->localhost;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
CRM_ASSERT(cib != NULL);
|
||||||
|
crm_trace("Calculating cluster status");
|
||||||
|
|
||||||
|
@@ -740,6 +746,10 @@ unpack_cib(xmlNode *cib, unsigned long long flags, pe_working_set_t *data_set)
|
||||||
|
*/
|
||||||
|
set_working_set_defaults(data_set);
|
||||||
|
|
||||||
|
+ if (localhost_save) {
|
||||||
|
+ data_set->localhost = localhost_save;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
pe__set_working_set_flags(data_set, flags);
|
||||||
|
data_set->input = cib;
|
||||||
|
cluster_status(data_set); // Sets pe_flag_have_status
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
178
SOURCES/011-unfencing.patch
Normal file
178
SOURCES/011-unfencing.patch
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
From b1094468ab0f7c6d2f5b457b721f3a852a9cae2c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Thu, 14 Jul 2022 13:09:51 +0200
|
||||||
|
Subject: [PATCH 1/2] Fix: do unfencing equally for cluster-nodes & remotes
|
||||||
|
|
||||||
|
Fixes T28
|
||||||
|
---
|
||||||
|
lib/pengine/utils.c | 8 ++------
|
||||||
|
1 file changed, 2 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/pengine/utils.c b/lib/pengine/utils.c
|
||||||
|
index 0c2eb3c16..83f76cccf 100644
|
||||||
|
--- a/lib/pengine/utils.c
|
||||||
|
+++ b/lib/pengine/utils.c
|
||||||
|
@@ -1201,12 +1201,8 @@ pe_fence_op(pe_node_t * node, const char *op, bool optional, const char *reason,
|
||||||
|
add_hash_param(stonith_op->meta, XML_LRM_ATTR_TARGET_UUID, node->details->id);
|
||||||
|
add_hash_param(stonith_op->meta, "stonith_action", op);
|
||||||
|
|
||||||
|
- if (pe__is_guest_or_remote_node(node)
|
||||||
|
- && pcmk_is_set(data_set->flags, pe_flag_enable_unfencing)) {
|
||||||
|
- /* Extra work to detect device changes on remotes
|
||||||
|
- *
|
||||||
|
- * We may do this for all nodes in the future, but for now
|
||||||
|
- * the pcmk__check_action_config() based stuff works fine.
|
||||||
|
+ if (pcmk_is_set(data_set->flags, pe_flag_enable_unfencing)) {
|
||||||
|
+ /* Extra work to detect device changes
|
||||||
|
*/
|
||||||
|
long max = 1024;
|
||||||
|
long digests_all_offset = 0;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
||||||
|
|
||||||
|
From f5db6e2c94273623a49f36f1bdb6c39315c53cab Mon Sep 17 00:00:00 2001
|
||||||
|
From: Klaus Wenninger <klaus.wenninger@aon.at>
|
||||||
|
Date: Thu, 14 Jul 2022 11:29:05 +0200
|
||||||
|
Subject: [PATCH 2/2] Test: cts-scheduler: update expected output for changes
|
||||||
|
in unfencing
|
||||||
|
|
||||||
|
---
|
||||||
|
cts/scheduler/exp/start-then-stop-with-unfence.exp | 2 +-
|
||||||
|
cts/scheduler/exp/unfence-definition.exp | 6 +++---
|
||||||
|
cts/scheduler/exp/unfence-device.exp | 6 +++---
|
||||||
|
cts/scheduler/exp/unfence-parameters.exp | 6 +++---
|
||||||
|
cts/scheduler/exp/unfence-startup.exp | 4 ++--
|
||||||
|
5 files changed, 12 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cts/scheduler/exp/start-then-stop-with-unfence.exp b/cts/scheduler/exp/start-then-stop-with-unfence.exp
|
||||||
|
index b1868586f..69cfb63de 100644
|
||||||
|
--- a/cts/scheduler/exp/start-then-stop-with-unfence.exp
|
||||||
|
+++ b/cts/scheduler/exp/start-then-stop-with-unfence.exp
|
||||||
|
@@ -151,7 +151,7 @@
|
||||||
|
<synapse id="11">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="5" operation="stonith" operation_key="stonith-rhel7-node1.example.com-on" on_node="rhel7-node1.example.com" on_node_uuid="1">
|
||||||
|
- <attributes CRM_meta_on_node="rhel7-node1.example.com" CRM_meta_on_node_uuid="1" CRM_meta_probe_complete="true" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="mpath-node1:fence_mpath:019ed48e26413030411da3ae8888a649,mpath-node2:fence_mpath:b97ef86afabe0426040d1bef247023ee," CRM_meta_digests_secure="mpath-node1:fence_mpath:21f9562fe6837f7357aab98ba69f71fb,mpath-node2:fence_mpath:563e5d6a67b7dcdb65d2f0325aed9fc1," CRM_meta_on_node="rhel7-node1.example.com" CRM_meta_on_node_uuid="1" CRM_meta_probe_complete="true" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
diff --git a/cts/scheduler/exp/unfence-definition.exp b/cts/scheduler/exp/unfence-definition.exp
|
||||||
|
index 840a8d212..6a098ed3c 100644
|
||||||
|
--- a/cts/scheduler/exp/unfence-definition.exp
|
||||||
|
+++ b/cts/scheduler/exp/unfence-definition.exp
|
||||||
|
@@ -373,7 +373,7 @@
|
||||||
|
<synapse id="22">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="29" operation="stonith" operation_key="stonith-virt-4-reboot" on_node="virt-4" on_node_uuid="4">
|
||||||
|
- <attributes CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
|
||||||
|
<downed>
|
||||||
|
<node id="4"/>
|
||||||
|
</downed>
|
||||||
|
@@ -384,7 +384,7 @@
|
||||||
|
<synapse id="23">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="3" operation="stonith" operation_key="stonith-virt-3-on" on_node="virt-3" on_node_uuid="3">
|
||||||
|
- <attributes CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
@@ -392,7 +392,7 @@
|
||||||
|
<synapse id="24">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="1" operation="stonith" operation_key="stonith-virt-1-on" on_node="virt-1" on_node_uuid="1">
|
||||||
|
- <attributes CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs>
|
||||||
|
diff --git a/cts/scheduler/exp/unfence-device.exp b/cts/scheduler/exp/unfence-device.exp
|
||||||
|
index a39fc758f..452351d98 100644
|
||||||
|
--- a/cts/scheduler/exp/unfence-device.exp
|
||||||
|
+++ b/cts/scheduler/exp/unfence-device.exp
|
||||||
|
@@ -76,7 +76,7 @@
|
||||||
|
<synapse id="5">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="6" operation="stonith" operation_key="stonith-virt-013-on" on_node="virt-013" on_node_uuid="3">
|
||||||
|
- <attributes CRM_meta_on_node="virt-013" CRM_meta_on_node_uuid="3" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fence_scsi:fence_scsi:5950f402238c1e5058a556fe39bb09de," CRM_meta_digests_secure="fence_scsi:fence_scsi:a911b9a554cdc5844d863a91b1ef283a," CRM_meta_on_node="virt-013" CRM_meta_on_node_uuid="3" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
@@ -84,7 +84,7 @@
|
||||||
|
<synapse id="6">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="4" operation="stonith" operation_key="stonith-virt-009-on" on_node="virt-009" on_node_uuid="2">
|
||||||
|
- <attributes CRM_meta_on_node="virt-009" CRM_meta_on_node_uuid="2" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fence_scsi:fence_scsi:5950f402238c1e5058a556fe39bb09de," CRM_meta_digests_secure="fence_scsi:fence_scsi:a911b9a554cdc5844d863a91b1ef283a," CRM_meta_on_node="virt-009" CRM_meta_on_node_uuid="2" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
@@ -92,7 +92,7 @@
|
||||||
|
<synapse id="7">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="2" operation="stonith" operation_key="stonith-virt-008-on" on_node="virt-008" on_node_uuid="1">
|
||||||
|
- <attributes CRM_meta_on_node="virt-008" CRM_meta_on_node_uuid="1" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fence_scsi:fence_scsi:5950f402238c1e5058a556fe39bb09de," CRM_meta_digests_secure="fence_scsi:fence_scsi:a911b9a554cdc5844d863a91b1ef283a," CRM_meta_on_node="virt-008" CRM_meta_on_node_uuid="1" CRM_meta_shutdown="0" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
diff --git a/cts/scheduler/exp/unfence-parameters.exp b/cts/scheduler/exp/unfence-parameters.exp
|
||||||
|
index 3e70cb8e9..268bf008e 100644
|
||||||
|
--- a/cts/scheduler/exp/unfence-parameters.exp
|
||||||
|
+++ b/cts/scheduler/exp/unfence-parameters.exp
|
||||||
|
@@ -357,7 +357,7 @@
|
||||||
|
<synapse id="21">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="28" operation="stonith" operation_key="stonith-virt-4-reboot" on_node="virt-4" on_node_uuid="4">
|
||||||
|
- <attributes CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
|
||||||
|
<downed>
|
||||||
|
<node id="4"/>
|
||||||
|
</downed>
|
||||||
|
@@ -368,7 +368,7 @@
|
||||||
|
<synapse id="22">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="3" operation="stonith" operation_key="stonith-virt-3-on" on_node="virt-3" on_node_uuid="3">
|
||||||
|
- <attributes CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
@@ -376,7 +376,7 @@
|
||||||
|
<synapse id="23">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="1" operation="stonith" operation_key="stonith-virt-1-on" on_node="virt-1" on_node_uuid="1">
|
||||||
|
- <attributes CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-1" CRM_meta_on_node_uuid="1" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs>
|
||||||
|
diff --git a/cts/scheduler/exp/unfence-startup.exp b/cts/scheduler/exp/unfence-startup.exp
|
||||||
|
index 6745bff4b..f2d38e80c 100644
|
||||||
|
--- a/cts/scheduler/exp/unfence-startup.exp
|
||||||
|
+++ b/cts/scheduler/exp/unfence-startup.exp
|
||||||
|
@@ -173,7 +173,7 @@
|
||||||
|
<synapse id="11">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="28" operation="stonith" operation_key="stonith-virt-4-reboot" on_node="virt-4" on_node_uuid="4">
|
||||||
|
- <attributes CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-4" CRM_meta_on_node_uuid="4" CRM_meta_stonith_action="reboot" />
|
||||||
|
<downed>
|
||||||
|
<node id="4"/>
|
||||||
|
</downed>
|
||||||
|
@@ -184,7 +184,7 @@
|
||||||
|
<synapse id="12">
|
||||||
|
<action_set>
|
||||||
|
<crm_event id="3" operation="stonith" operation_key="stonith-virt-3-on" on_node="virt-3" on_node_uuid="3">
|
||||||
|
- <attributes CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
|
||||||
|
+ <attributes CRM_meta_digests_all="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_digests_secure="fencing:fence_scsi:f2317cad3d54cec5d7d7aa7d0bf35cf8," CRM_meta_on_node="virt-3" CRM_meta_on_node_uuid="3" CRM_meta_stonith_action="on" />
|
||||||
|
</crm_event>
|
||||||
|
</action_set>
|
||||||
|
<inputs/>
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
From ed8b2c86ab77aaa3d7fd688c049ad5e1b922a9c6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Reid Wahl <nrwahl@protonmail.com>
|
|
||||||
Date: Thu, 13 Jan 2022 02:56:55 -0800
|
|
||||||
Subject: [PATCH] Fix: liblrmd: Avoid double-free during notify operation
|
|
||||||
|
|
||||||
This commit fixes a regression introduced by 31c7fa8a, causing a
|
|
||||||
double-free in notify operations. lrmd_dispatch_internal() assigns the
|
|
||||||
exit_reason string directly from an XML node to a new lrmd_event_data_t
|
|
||||||
object (without duplicating), and this string gets freed twice.
|
|
||||||
|
|
||||||
Free #1: pcmk__create_history_xml() (reached via callback) calls
|
|
||||||
lrmd__set_result(), which frees event.exit_reason and sets it to NULL.
|
|
||||||
Free #2: lrmd_ipc_dispatch() frees the XML node, which contains a
|
|
||||||
pointer to the exit_reason string just freed, after
|
|
||||||
lrmd_dispatch_internal() returns.
|
|
||||||
|
|
||||||
Prior to 31c7fa8a, pcmk__create_history_xml reset event.rc and
|
|
||||||
event.op_status but **not** event.exit_reason.
|
|
||||||
|
|
||||||
In this commit we simply make a copy of event.exit_reason in
|
|
||||||
lrmd_dispatch_internal() before the callback. This way we don't have to
|
|
||||||
worry about whatever happens in the callback, and we can continue to
|
|
||||||
unset the exit_reason alongside the rc and op_status. The added overhead
|
|
||||||
should be minimal.
|
|
||||||
|
|
||||||
This commit also makes a copy of output. That's not strictly necessary
|
|
||||||
but adds some futureproofing and allows us to call lrmd__reset_result()
|
|
||||||
at the end of lrmd_dispatch_internal().
|
|
||||||
|
|
||||||
Resolves: RHBZ#2039675
|
|
||||||
|
|
||||||
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
|
|
||||||
---
|
|
||||||
lib/lrmd/lrmd_client.c | 8 +++++---
|
|
||||||
1 file changed, 5 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/lrmd/lrmd_client.c b/lib/lrmd/lrmd_client.c
|
|
||||||
index ee31bb5ae9..5131a648b7 100644
|
|
||||||
--- a/lib/lrmd/lrmd_client.c
|
|
||||||
+++ b/lib/lrmd/lrmd_client.c
|
|
||||||
@@ -305,9 +305,10 @@ lrmd_dispatch_internal(lrmd_t * lrmd, xmlNode * msg)
|
|
||||||
event.user_data = crm_element_value(msg, F_LRMD_RSC_USERDATA_STR);
|
|
||||||
event.type = lrmd_event_exec_complete;
|
|
||||||
|
|
||||||
- // No need to duplicate the memory, so don't use setter functions
|
|
||||||
- event.output = crm_element_value(msg, F_LRMD_RSC_OUTPUT);
|
|
||||||
- event.exit_reason = crm_element_value(msg, F_LRMD_RSC_EXIT_REASON);
|
|
||||||
+ /* output and exit_reason may be freed by a callback */
|
|
||||||
+ event.output = crm_element_value_copy(msg, F_LRMD_RSC_OUTPUT);
|
|
||||||
+ lrmd__set_result(&event, event.rc, event.op_status,
|
|
||||||
+ crm_element_value(msg, F_LRMD_RSC_EXIT_REASON));
|
|
||||||
|
|
||||||
event.params = xml2list(msg);
|
|
||||||
} else if (pcmk__str_eq(type, LRMD_OP_NEW_CLIENT, pcmk__str_none)) {
|
|
||||||
@@ -324,6 +325,7 @@ lrmd_dispatch_internal(lrmd_t * lrmd, xmlNode * msg)
|
|
||||||
if (event.params) {
|
|
||||||
g_hash_table_destroy(event.params);
|
|
||||||
}
|
|
||||||
+ lrmd__reset_result(&event);
|
|
||||||
}
|
|
||||||
|
|
||||||
// \return Always 0, to indicate that IPC mainloop source should be kept
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
From 186d5a02fba919c455fd6eeb050b4be107f82159 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Chris Lumens <clumens@redhat.com>
|
|
||||||
Date: Thu, 13 Jan 2022 17:02:47 -0500
|
|
||||||
Subject: [PATCH] Low: scheduler: Use the old RC code to log maskable probe
|
|
||||||
failures.
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/pengine/unpack.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c
|
|
||||||
index 8a2d2a6d6d..b01f86257a 100644
|
|
||||||
--- a/lib/pengine/unpack.c
|
|
||||||
+++ b/lib/pengine/unpack.c
|
|
||||||
@@ -3780,7 +3780,7 @@ unpack_rsc_op(pe_resource_t *rsc, pe_node_t *node, xmlNode *xml_op,
|
|
||||||
|
|
||||||
if (maskable_probe_failure) {
|
|
||||||
crm_notice("Treating probe result '%s' for %s on %s as 'not running'",
|
|
||||||
- services_ocf_exitcode_str(rc), rsc->id, node->details->uname);
|
|
||||||
+ services_ocf_exitcode_str(old_rc), rsc->id, node->details->uname);
|
|
||||||
update_resource_state(rsc, node, xml_op, task, target_rc, *last_failure,
|
|
||||||
on_fail, data_set);
|
|
||||||
crm_xml_add(xml_op, XML_ATTR_UNAME, node->details->uname);
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
|||||||
From 9d812b0401d4cedef53a3cc3653ec782a5c49e37 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Thu, 13 Jan 2022 10:42:02 -0600
|
|
||||||
Subject: [PATCH] Doc: fencer: improve pcmk_delay_base meta-data
|
|
||||||
|
|
||||||
Update its type, since its value can now be a node map as well as a string,
|
|
||||||
and add more detail to its description.
|
|
||||||
---
|
|
||||||
daemons/fenced/pacemaker-fenced.c | 18 +++++++++++-------
|
|
||||||
1 file changed, 11 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/fenced/pacemaker-fenced.c b/daemons/fenced/pacemaker-fenced.c
|
|
||||||
index 1b954be5a4..12f331496c 100644
|
|
||||||
--- a/daemons/fenced/pacemaker-fenced.c
|
|
||||||
+++ b/daemons/fenced/pacemaker-fenced.c
|
|
||||||
@@ -1548,13 +1548,17 @@ main(int argc, char **argv)
|
|
||||||
PCMK_STONITH_DELAY_BASE);
|
|
||||||
printf(" <shortdesc lang=\"en\">Enable a base delay for "
|
|
||||||
"fencing actions and specify base delay value.</shortdesc>\n");
|
|
||||||
- printf(" <longdesc lang=\"en\">This prevents double fencing when "
|
|
||||||
- "different delays are configured on the nodes.\nUse this to "
|
|
||||||
- "enable a static delay for fencing actions.\nThe overall delay "
|
|
||||||
- "is derived from a random delay value adding this static delay "
|
|
||||||
- "so that the sum is kept below the maximum delay.\nSet to eg. "
|
|
||||||
- "node1:1s;node2:5 to set different value per node.</longdesc>\n");
|
|
||||||
- printf(" <content type=\"time\" default=\"0s\"/>\n");
|
|
||||||
+ printf(" <longdesc lang=\"en\">This enables a static delay for "
|
|
||||||
+ "fencing actions, which can help avoid \"death matches\" where "
|
|
||||||
+ "two nodes try to fence each other at the same time. If "
|
|
||||||
+ PCMK_STONITH_DELAY_MAX " is also used, a random delay will be "
|
|
||||||
+ "added such that the total delay is kept below that value.\n"
|
|
||||||
+ "This can be set to a single time value to apply to any node "
|
|
||||||
+ "targeted by this device (useful if a separate device is "
|
|
||||||
+ "configured for each target), or to a node map (for example, "
|
|
||||||
+ "\"node1:1s;node2:5\") to set a different value per target.\n"
|
|
||||||
+ " </longdesc>\n");
|
|
||||||
+ printf(" <content type=\"string\" default=\"0s\"/>\n");
|
|
||||||
printf(" </parameter>\n");
|
|
||||||
|
|
||||||
printf(" <parameter name=\"%s\" unique=\"0\">\n",
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,56 +0,0 @@
|
|||||||
From e330568504ec379ea42460d21a2e20b1652d9445 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Reid Wahl <nrwahl@protonmail.com>
|
|
||||||
Date: Fri, 14 Jan 2022 01:35:35 -0800
|
|
||||||
Subject: [PATCH] Fix: fencing: Don't set stonith action to pending if fork
|
|
||||||
fails
|
|
||||||
|
|
||||||
Currently, we set a stonith action to pending if
|
|
||||||
services_action_async_fork_notify() returns true. However, "true" means
|
|
||||||
that the svc_action should not be freed. This might be because the
|
|
||||||
svc_action forked successfully and is pending, or it might be because
|
|
||||||
the svc_action has already been freed.
|
|
||||||
|
|
||||||
In the case of stonith actions, if we fail to fork, the stonith_action_t
|
|
||||||
object stored in svc_action->cb_data gets freed by the done callback,
|
|
||||||
and services_action_async_fork_notify() returns true. If we try to set
|
|
||||||
the action to pending, it causes a segfault.
|
|
||||||
|
|
||||||
This commit moves the "set to pending" step to the
|
|
||||||
stonith_action_async_forked() callback. We avoid the segfault and only
|
|
||||||
set it to pending if it's actually pending.
|
|
||||||
|
|
||||||
A slight difference in ordering was required to achieve this. Now, the
|
|
||||||
action gets set to pending immediately before being added to the
|
|
||||||
mainloop, instead of immediately after.
|
|
||||||
|
|
||||||
Signed-off-by: Reid Wahl <nrwahl@protonmail.com>
|
|
||||||
---
|
|
||||||
lib/fencing/st_actions.c | 5 +++--
|
|
||||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/fencing/st_actions.c b/lib/fencing/st_actions.c
|
|
||||||
index e4e43225cd..306001af69 100644
|
|
||||||
--- a/lib/fencing/st_actions.c
|
|
||||||
+++ b/lib/fencing/st_actions.c
|
|
||||||
@@ -550,6 +550,9 @@ stonith_action_async_forked(svc_action_t *svc_action)
|
|
||||||
(action->fork_cb) (svc_action->pid, action->userdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ pcmk__set_result(&(action->result), PCMK_OCF_UNKNOWN, PCMK_EXEC_PENDING,
|
|
||||||
+ NULL);
|
|
||||||
+
|
|
||||||
crm_trace("Child process %d performing action '%s' successfully forked",
|
|
||||||
action->pid, action->action);
|
|
||||||
}
|
|
||||||
@@ -619,8 +622,6 @@ internal_stonith_action_execute(stonith_action_t * action)
|
|
||||||
if (services_action_async_fork_notify(svc_action,
|
|
||||||
&stonith_action_async_done,
|
|
||||||
&stonith_action_async_forked)) {
|
|
||||||
- pcmk__set_result(&(action->result), PCMK_OCF_UNKNOWN,
|
|
||||||
- PCMK_EXEC_PENDING, NULL);
|
|
||||||
return pcmk_ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,875 +0,0 @@
|
|||||||
From 523f62eb235836a01ea039c23ada261a494f7b32 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 10 Nov 2021 15:22:47 -0600
|
|
||||||
Subject: [PATCH 01/11] Feature: libpacemaker: improve result for high-level
|
|
||||||
fencing API
|
|
||||||
|
|
||||||
Previously, pcmk__fencing_action()'s helpers for asynchronous fencing actions
|
|
||||||
initialized the result to a generic error, and then overrode that only on
|
|
||||||
success.
|
|
||||||
|
|
||||||
Now, set a detailed result for early failures, and use the full result when
|
|
||||||
available from the fencing API.
|
|
||||||
|
|
||||||
A standard return code is still returned to callers at this point.
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_fence.c | 31 ++++++++++++++++++-------------
|
|
||||||
1 file changed, 18 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c
|
|
||||||
index 7d6acd0de6..125e1b268b 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_fence.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_fence.c
|
|
||||||
@@ -32,8 +32,8 @@ static struct {
|
|
||||||
unsigned int timeout;
|
|
||||||
unsigned int tolerance;
|
|
||||||
int delay;
|
|
||||||
- int rc;
|
|
||||||
-} async_fence_data;
|
|
||||||
+ pcmk__action_result_t result;
|
|
||||||
+} async_fence_data = { NULL, };
|
|
||||||
|
|
||||||
static int
|
|
||||||
handle_level(stonith_t *st, char *target, int fence_level,
|
|
||||||
@@ -76,14 +76,13 @@ handle_level(stonith_t *st, char *target, int fence_level,
|
|
||||||
static void
|
|
||||||
notify_callback(stonith_t * st, stonith_event_t * e)
|
|
||||||
{
|
|
||||||
- if (e->result != pcmk_ok) {
|
|
||||||
- return;
|
|
||||||
- }
|
|
||||||
+ if (pcmk__str_eq(async_fence_data.target, e->target, pcmk__str_casei)
|
|
||||||
+ && pcmk__str_eq(async_fence_data.action, e->action, pcmk__str_casei)) {
|
|
||||||
|
|
||||||
- if (pcmk__str_eq(async_fence_data.target, e->target, pcmk__str_casei) &&
|
|
||||||
- pcmk__str_eq(async_fence_data.action, e->action, pcmk__str_casei)) {
|
|
||||||
-
|
|
||||||
- async_fence_data.rc = e->result;
|
|
||||||
+ pcmk__set_result(&async_fence_data.result,
|
|
||||||
+ stonith__event_exit_status(e),
|
|
||||||
+ stonith__event_execution_status(e),
|
|
||||||
+ stonith__event_exit_reason(e));
|
|
||||||
g_main_loop_quit(mainloop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -91,8 +90,9 @@ notify_callback(stonith_t * st, stonith_event_t * e)
|
|
||||||
static void
|
|
||||||
fence_callback(stonith_t * stonith, stonith_callback_data_t * data)
|
|
||||||
{
|
|
||||||
- async_fence_data.rc = data->rc;
|
|
||||||
-
|
|
||||||
+ pcmk__set_result(&async_fence_data.result, stonith__exit_status(data),
|
|
||||||
+ stonith__execution_status(data),
|
|
||||||
+ stonith__exit_reason(data));
|
|
||||||
g_main_loop_quit(mainloop);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -106,6 +106,8 @@ async_fence_helper(gpointer user_data)
|
|
||||||
if (rc != pcmk_ok) {
|
|
||||||
fprintf(stderr, "Could not connect to fencer: %s\n", pcmk_strerror(rc));
|
|
||||||
g_main_loop_quit(mainloop);
|
|
||||||
+ pcmk__set_result(&async_fence_data.result, CRM_EX_ERROR,
|
|
||||||
+ PCMK_EXEC_NOT_CONNECTED, NULL);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -121,6 +123,8 @@ async_fence_helper(gpointer user_data)
|
|
||||||
|
|
||||||
if (call_id < 0) {
|
|
||||||
g_main_loop_quit(mainloop);
|
|
||||||
+ pcmk__set_result(&async_fence_data.result, CRM_EX_ERROR,
|
|
||||||
+ PCMK_EXEC_ERROR, pcmk_strerror(call_id));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -146,7 +150,8 @@ pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
async_fence_data.timeout = timeout;
|
|
||||||
async_fence_data.tolerance = tolerance;
|
|
||||||
async_fence_data.delay = delay;
|
|
||||||
- async_fence_data.rc = pcmk_err_generic;
|
|
||||||
+ pcmk__set_result(&async_fence_data.result, CRM_EX_ERROR, PCMK_EXEC_UNKNOWN,
|
|
||||||
+ NULL);
|
|
||||||
|
|
||||||
trig = mainloop_add_trigger(G_PRIORITY_HIGH, async_fence_helper, NULL);
|
|
||||||
mainloop_set_trigger(trig);
|
|
||||||
@@ -156,7 +161,7 @@ pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
|
|
||||||
free(async_fence_data.name);
|
|
||||||
|
|
||||||
- return pcmk_legacy2rc(async_fence_data.rc);
|
|
||||||
+ return stonith__result2rc(&async_fence_data.result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BUILD_PUBLIC_LIBPACEMAKER
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 008868fae5d1b0d6d8dc61f7acfb3856801ddd52 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 10 Dec 2021 15:36:10 -0600
|
|
||||||
Subject: [PATCH 02/11] Refactor: libpacemaker: add exit reason to high-level
|
|
||||||
fencing API
|
|
||||||
|
|
||||||
Nothing uses it as of this commit
|
|
||||||
---
|
|
||||||
include/pacemaker.h | 5 ++++-
|
|
||||||
include/pcmki/pcmki_fence.h | 5 ++++-
|
|
||||||
lib/pacemaker/pcmk_fence.c | 10 +++++++---
|
|
||||||
tools/stonith_admin.c | 6 +++---
|
|
||||||
4 files changed, 18 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/pacemaker.h b/include/pacemaker.h
|
|
||||||
index a8523c969e..0daa4c5945 100644
|
|
||||||
--- a/include/pacemaker.h
|
|
||||||
+++ b/include/pacemaker.h
|
|
||||||
@@ -189,12 +189,15 @@ int pcmk_list_nodes(xmlNodePtr *xml, char *node_types);
|
|
||||||
* again.
|
|
||||||
* \param[in] delay Apply a fencing delay. Value -1 means disable also any
|
|
||||||
* static/random fencing delays from pcmk_delay_base/max.
|
|
||||||
+ * \param[out] reason If not NULL, where to put descriptive failure reason
|
|
||||||
*
|
|
||||||
* \return Standard Pacemaker return code
|
|
||||||
+ * \note If \p reason is not NULL, the caller is responsible for freeing its
|
|
||||||
+ * returned value.
|
|
||||||
*/
|
|
||||||
int pcmk_fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay);
|
|
||||||
+ int delay, char **reason);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief List the fencing operations that have occurred for a specific node.
|
|
||||||
diff --git a/include/pcmki/pcmki_fence.h b/include/pcmki/pcmki_fence.h
|
|
||||||
index d4cef68f5c..c3da0361d7 100644
|
|
||||||
--- a/include/pcmki/pcmki_fence.h
|
|
||||||
+++ b/include/pcmki/pcmki_fence.h
|
|
||||||
@@ -28,12 +28,15 @@
|
|
||||||
* again.
|
|
||||||
* \param[in] delay Apply a fencing delay. Value -1 means disable also any
|
|
||||||
* static/random fencing delays from pcmk_delay_base/max
|
|
||||||
+ * \param[out] reason If not NULL, where to put descriptive failure reason
|
|
||||||
*
|
|
||||||
* \return Standard Pacemaker return code
|
|
||||||
+ * \note If \p reason is not NULL, the caller is responsible for freeing its
|
|
||||||
+ * returned value.
|
|
||||||
*/
|
|
||||||
int pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay);
|
|
||||||
+ int delay, char **reason);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief List the fencing operations that have occurred for a specific node.
|
|
||||||
diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c
|
|
||||||
index 125e1b268b..dbf084fb6b 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_fence.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_fence.c
|
|
||||||
@@ -139,7 +139,7 @@ async_fence_helper(gpointer user_data)
|
|
||||||
int
|
|
||||||
pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay)
|
|
||||||
+ int delay, char **reason)
|
|
||||||
{
|
|
||||||
crm_trigger_t *trig;
|
|
||||||
|
|
||||||
@@ -161,6 +161,9 @@ pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
|
|
||||||
free(async_fence_data.name);
|
|
||||||
|
|
||||||
+ if ((reason != NULL) && (async_fence_data.result.exit_reason != NULL)) {
|
|
||||||
+ *reason = strdup(async_fence_data.result.exit_reason);
|
|
||||||
+ }
|
|
||||||
return stonith__result2rc(&async_fence_data.result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -168,9 +171,10 @@ pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
int
|
|
||||||
pcmk_fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay)
|
|
||||||
+ int delay, char **reason)
|
|
||||||
{
|
|
||||||
- return pcmk__fence_action(st, target, action, name, timeout, tolerance, delay);
|
|
||||||
+ return pcmk__fence_action(st, target, action, name, timeout, tolerance,
|
|
||||||
+ delay, reason);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
||||||
index 2d48326e1b..fdc7c46d49 100644
|
|
||||||
--- a/tools/stonith_admin.c
|
|
||||||
+++ b/tools/stonith_admin.c
|
|
||||||
@@ -571,17 +571,17 @@ main(int argc, char **argv)
|
|
||||||
|
|
||||||
case 'B':
|
|
||||||
rc = pcmk__fence_action(st, target, "reboot", name, options.timeout*1000,
|
|
||||||
- options.tolerance*1000, options.delay);
|
|
||||||
+ options.tolerance*1000, options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
rc = pcmk__fence_action(st, target, "off", name, options.timeout*1000,
|
|
||||||
- options.tolerance*1000, options.delay);
|
|
||||||
+ options.tolerance*1000, options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'U':
|
|
||||||
rc = pcmk__fence_action(st, target, "on", name, options.timeout*1000,
|
|
||||||
- options.tolerance*1000, options.delay);
|
|
||||||
+ options.tolerance*1000, options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 7570510f9985ba75ef73fb824f28109e135ace0a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 10 Dec 2021 15:40:48 -0600
|
|
||||||
Subject: [PATCH 03/11] Refactor: libpacemaker: rename high-level fencing API
|
|
||||||
|
|
||||||
Rename pcmk_fence_action() to pcmk_request_fencing(), and its internal
|
|
||||||
equivalent pcmk__fence_action() to pcmk__request_fencing(). The change is
|
|
||||||
backward-compatible because pcmk_fence_action() has not been exposed publicly
|
|
||||||
yet.
|
|
||||||
|
|
||||||
"Fence action" can be easily confused with libcrmservice actions, liblrmd
|
|
||||||
actions, libstonithd actions, scheduler actions, and so forth.
|
|
||||||
|
|
||||||
Also, the new name makes it clearer that the caller is requesting that the
|
|
||||||
cluster perform fencing, and not directly performing fencing.
|
|
||||||
---
|
|
||||||
include/pacemaker.h | 20 ++++++++++----------
|
|
||||||
include/pcmki/pcmki_fence.h | 16 ++++++++--------
|
|
||||||
lib/pacemaker/pcmk_fence.c | 16 ++++++++--------
|
|
||||||
tools/stonith_admin.c | 18 ++++++++++++------
|
|
||||||
4 files changed, 38 insertions(+), 32 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/pacemaker.h b/include/pacemaker.h
|
|
||||||
index 0daa4c5945..e581f975a9 100644
|
|
||||||
--- a/include/pacemaker.h
|
|
||||||
+++ b/include/pacemaker.h
|
|
||||||
@@ -177,27 +177,27 @@ int pcmk_list_nodes(xmlNodePtr *xml, char *node_types);
|
|
||||||
#ifdef BUILD_PUBLIC_LIBPACEMAKER
|
|
||||||
|
|
||||||
/*!
|
|
||||||
- * \brief Perform a STONITH action.
|
|
||||||
+ * \brief Ask the cluster to perform fencing
|
|
||||||
*
|
|
||||||
- * \param[in] st A connection to the STONITH API.
|
|
||||||
- * \param[in] target The node receiving the action.
|
|
||||||
- * \param[in] action The action to perform.
|
|
||||||
+ * \param[in] st A connection to the fencer API
|
|
||||||
+ * \param[in] target The node that should be fenced
|
|
||||||
+ * \param[in] action The fencing action (on, off, reboot) to perform
|
|
||||||
* \param[in] name Who requested the fence action?
|
|
||||||
- * \param[in] timeout How long to wait for the operation to complete (in ms).
|
|
||||||
+ * \param[in] timeout How long to wait for the operation to complete (in ms)
|
|
||||||
* \param[in] tolerance If a successful action for \p target happened within
|
|
||||||
* this many ms, return 0 without performing the action
|
|
||||||
- * again.
|
|
||||||
+ * again
|
|
||||||
* \param[in] delay Apply a fencing delay. Value -1 means disable also any
|
|
||||||
- * static/random fencing delays from pcmk_delay_base/max.
|
|
||||||
+ * static/random fencing delays from pcmk_delay_base/max
|
|
||||||
* \param[out] reason If not NULL, where to put descriptive failure reason
|
|
||||||
*
|
|
||||||
* \return Standard Pacemaker return code
|
|
||||||
* \note If \p reason is not NULL, the caller is responsible for freeing its
|
|
||||||
* returned value.
|
|
||||||
*/
|
|
||||||
-int pcmk_fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
- const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay, char **reason);
|
|
||||||
+int pcmk_request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
+ const char *name, unsigned int timeout,
|
|
||||||
+ unsigned int tolerance, int delay, char **reason);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief List the fencing operations that have occurred for a specific node.
|
|
||||||
diff --git a/include/pcmki/pcmki_fence.h b/include/pcmki/pcmki_fence.h
|
|
||||||
index c3da0361d7..e3a7e27264 100644
|
|
||||||
--- a/include/pcmki/pcmki_fence.h
|
|
||||||
+++ b/include/pcmki/pcmki_fence.h
|
|
||||||
@@ -13,14 +13,14 @@
|
|
||||||
# include <crm/common/output_internal.h>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
- * \brief Perform a STONITH action.
|
|
||||||
+ * \brief Ask the cluster to perform fencing
|
|
||||||
*
|
|
||||||
- * \note This is the internal version of pcmk_fence_action(). External users
|
|
||||||
+ * \note This is the internal version of pcmk_request_fencing(). External users
|
|
||||||
* of the pacemaker API should use that function instead.
|
|
||||||
*
|
|
||||||
- * \param[in] st A connection to the STONITH API.
|
|
||||||
- * \param[in] target The node receiving the action.
|
|
||||||
- * \param[in] action The action to perform.
|
|
||||||
+ * \param[in] st A connection to the fencer API
|
|
||||||
+ * \param[in] target The node that should be fenced
|
|
||||||
+ * \param[in] action The fencing action (on, off, reboot) to perform
|
|
||||||
* \param[in] name Who requested the fence action?
|
|
||||||
* \param[in] timeout How long to wait for the operation to complete (in ms).
|
|
||||||
* \param[in] tolerance If a successful action for \p target happened within
|
|
||||||
@@ -34,9 +34,9 @@
|
|
||||||
* \note If \p reason is not NULL, the caller is responsible for freeing its
|
|
||||||
* returned value.
|
|
||||||
*/
|
|
||||||
-int pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
- const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay, char **reason);
|
|
||||||
+int pcmk__request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
+ const char *name, unsigned int timeout,
|
|
||||||
+ unsigned int tolerance, int delay, char **reason);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief List the fencing operations that have occurred for a specific node.
|
|
||||||
diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c
|
|
||||||
index dbf084fb6b..1b7feb54b2 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_fence.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_fence.c
|
|
||||||
@@ -137,9 +137,9 @@ async_fence_helper(gpointer user_data)
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
-pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
- const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay, char **reason)
|
|
||||||
+pcmk__request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
+ const char *name, unsigned int timeout,
|
|
||||||
+ unsigned int tolerance, int delay, char **reason)
|
|
||||||
{
|
|
||||||
crm_trigger_t *trig;
|
|
||||||
|
|
||||||
@@ -169,12 +169,12 @@ pcmk__fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
|
|
||||||
#ifdef BUILD_PUBLIC_LIBPACEMAKER
|
|
||||||
int
|
|
||||||
-pcmk_fence_action(stonith_t *st, const char *target, const char *action,
|
|
||||||
- const char *name, unsigned int timeout, unsigned int tolerance,
|
|
||||||
- int delay, char **reason)
|
|
||||||
+pcmk_request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
+ const char *name, unsigned int timeout,
|
|
||||||
+ unsigned int tolerance, int delay, char **reason)
|
|
||||||
{
|
|
||||||
- return pcmk__fence_action(st, target, action, name, timeout, tolerance,
|
|
||||||
- delay, reason);
|
|
||||||
+ return pcmk__request_fencing(st, target, action, name, timeout, tolerance,
|
|
||||||
+ delay, reason);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
||||||
index fdc7c46d49..56948b3875 100644
|
|
||||||
--- a/tools/stonith_admin.c
|
|
||||||
+++ b/tools/stonith_admin.c
|
|
||||||
@@ -570,18 +570,24 @@ main(int argc, char **argv)
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'B':
|
|
||||||
- rc = pcmk__fence_action(st, target, "reboot", name, options.timeout*1000,
|
|
||||||
- options.tolerance*1000, options.delay, NULL);
|
|
||||||
+ rc = pcmk__request_fencing(st, target, "reboot", name,
|
|
||||||
+ options.timeout * 1000,
|
|
||||||
+ options.tolerance * 1000,
|
|
||||||
+ options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
- rc = pcmk__fence_action(st, target, "off", name, options.timeout*1000,
|
|
||||||
- options.tolerance*1000, options.delay, NULL);
|
|
||||||
+ rc = pcmk__request_fencing(st, target, "off", name,
|
|
||||||
+ options.timeout * 1000,
|
|
||||||
+ options.tolerance * 1000,
|
|
||||||
+ options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'U':
|
|
||||||
- rc = pcmk__fence_action(st, target, "on", name, options.timeout*1000,
|
|
||||||
- options.tolerance*1000, options.delay, NULL);
|
|
||||||
+ rc = pcmk__request_fencing(st, target, "on", name,
|
|
||||||
+ options.timeout * 1000,
|
|
||||||
+ options.tolerance * 1000,
|
|
||||||
+ options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 247eb303df934944c0b72b162bb661cee6e0ed8b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 10 Dec 2021 15:52:37 -0600
|
|
||||||
Subject: [PATCH 04/11] Refactor: tools: drop unnecessary string duplication in
|
|
||||||
stonith_admin
|
|
||||||
|
|
||||||
---
|
|
||||||
tools/stonith_admin.c | 11 ++++-------
|
|
||||||
1 file changed, 4 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
||||||
index 56948b3875..c11e302e76 100644
|
|
||||||
--- a/tools/stonith_admin.c
|
|
||||||
+++ b/tools/stonith_admin.c
|
|
||||||
@@ -360,8 +360,6 @@ main(int argc, char **argv)
|
|
||||||
|
|
||||||
pcmk__cli_init_logging("stonith_admin", args->verbosity);
|
|
||||||
|
|
||||||
- name = strdup(crm_system_name);
|
|
||||||
-
|
|
||||||
rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv);
|
|
||||||
if (rc != pcmk_rc_ok) {
|
|
||||||
exit_code = CRM_EX_ERROR;
|
|
||||||
@@ -496,7 +494,7 @@ main(int argc, char **argv)
|
|
||||||
if (st == NULL) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
} else if (!no_connect) {
|
|
||||||
- rc = st->cmds->connect(st, name, NULL);
|
|
||||||
+ rc = st->cmds->connect(st, crm_system_name, NULL);
|
|
||||||
}
|
|
||||||
if (rc < 0) {
|
|
||||||
out->err(out, "Could not connect to fencer: %s", pcmk_strerror(rc));
|
|
||||||
@@ -570,21 +568,21 @@ main(int argc, char **argv)
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'B':
|
|
||||||
- rc = pcmk__request_fencing(st, target, "reboot", name,
|
|
||||||
+ rc = pcmk__request_fencing(st, target, "reboot", crm_system_name,
|
|
||||||
options.timeout * 1000,
|
|
||||||
options.tolerance * 1000,
|
|
||||||
options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
- rc = pcmk__request_fencing(st, target, "off", name,
|
|
||||||
+ rc = pcmk__request_fencing(st, target, "off", crm_system_name,
|
|
||||||
options.timeout * 1000,
|
|
||||||
options.tolerance * 1000,
|
|
||||||
options.delay, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'U':
|
|
||||||
- rc = pcmk__request_fencing(st, target, "on", name,
|
|
||||||
+ rc = pcmk__request_fencing(st, target, "on", crm_system_name,
|
|
||||||
options.timeout * 1000,
|
|
||||||
options.tolerance * 1000,
|
|
||||||
options.delay, NULL);
|
|
||||||
@@ -619,7 +617,6 @@ main(int argc, char **argv)
|
|
||||||
out->finish(out, exit_code, true, NULL);
|
|
||||||
pcmk__output_free(out);
|
|
||||||
}
|
|
||||||
- free(name);
|
|
||||||
stonith_key_value_freeall(options.params, 1, 1);
|
|
||||||
|
|
||||||
if (st != NULL) {
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From a7888bf6868d8d9d9c77f65ae9983cf748bb0548 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 10 Dec 2021 15:56:34 -0600
|
|
||||||
Subject: [PATCH 05/11] Refactor: tools: functionize requesting fencing in
|
|
||||||
stonith_admin
|
|
||||||
|
|
||||||
... to reduce code duplication and improve readability
|
|
||||||
---
|
|
||||||
tools/stonith_admin.c | 27 +++++++++++++++------------
|
|
||||||
1 file changed, 15 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
||||||
index c11e302e76..f738a9c888 100644
|
|
||||||
--- a/tools/stonith_admin.c
|
|
||||||
+++ b/tools/stonith_admin.c
|
|
||||||
@@ -331,6 +331,18 @@ build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
+// \return Standard Pacemaker return code
|
|
||||||
+static int
|
|
||||||
+request_fencing(stonith_t *st, const char *target, const char *command)
|
|
||||||
+{
|
|
||||||
+ int rc = pcmk__request_fencing(st, target, command, crm_system_name,
|
|
||||||
+ options.timeout * 1000,
|
|
||||||
+ options.tolerance * 1000,
|
|
||||||
+ options.delay, NULL);
|
|
||||||
+
|
|
||||||
+ return rc;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
@@ -568,24 +580,15 @@ main(int argc, char **argv)
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'B':
|
|
||||||
- rc = pcmk__request_fencing(st, target, "reboot", crm_system_name,
|
|
||||||
- options.timeout * 1000,
|
|
||||||
- options.tolerance * 1000,
|
|
||||||
- options.delay, NULL);
|
|
||||||
+ rc = request_fencing(st, target, "reboot");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
- rc = pcmk__request_fencing(st, target, "off", crm_system_name,
|
|
||||||
- options.timeout * 1000,
|
|
||||||
- options.tolerance * 1000,
|
|
||||||
- options.delay, NULL);
|
|
||||||
+ rc = request_fencing(st, target, "off");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'U':
|
|
||||||
- rc = pcmk__request_fencing(st, target, "on", crm_system_name,
|
|
||||||
- options.timeout * 1000,
|
|
||||||
- options.tolerance * 1000,
|
|
||||||
- options.delay, NULL);
|
|
||||||
+ rc = request_fencing(st, target, "on");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 2da32df780983ec1197e857eed5eeb5bf1101889 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 10 Dec 2021 16:05:19 -0600
|
|
||||||
Subject: [PATCH 06/11] Feature: tools: display failure reasons for
|
|
||||||
stonith_admin fencing commands
|
|
||||||
|
|
||||||
Previously, stonith_admin's --fence/--unfence/--reboot options did not output
|
|
||||||
any error message on failure. Now, they do, including the exit reason, if
|
|
||||||
available.
|
|
||||||
---
|
|
||||||
tools/stonith_admin.c | 30 +++++++++++++++++++++++++-----
|
|
||||||
1 file changed, 25 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
||||||
index f738a9c888..5590faf11e 100644
|
|
||||||
--- a/tools/stonith_admin.c
|
|
||||||
+++ b/tools/stonith_admin.c
|
|
||||||
@@ -333,13 +333,33 @@ build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
|
|
||||||
|
|
||||||
// \return Standard Pacemaker return code
|
|
||||||
static int
|
|
||||||
-request_fencing(stonith_t *st, const char *target, const char *command)
|
|
||||||
+request_fencing(stonith_t *st, const char *target, const char *command,
|
|
||||||
+ GError **error)
|
|
||||||
{
|
|
||||||
+ char *reason = NULL;
|
|
||||||
int rc = pcmk__request_fencing(st, target, command, crm_system_name,
|
|
||||||
options.timeout * 1000,
|
|
||||||
options.tolerance * 1000,
|
|
||||||
- options.delay, NULL);
|
|
||||||
+ options.delay, &reason);
|
|
||||||
|
|
||||||
+ if (rc != pcmk_rc_ok) {
|
|
||||||
+ const char *rc_str = pcmk_rc_str(rc);
|
|
||||||
+
|
|
||||||
+ // If reason is identical to return code string, don't display it twice
|
|
||||||
+ if (pcmk__str_eq(rc_str, reason, pcmk__str_none)) {
|
|
||||||
+ free(reason);
|
|
||||||
+ reason = NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ g_set_error(error, PCMK__RC_ERROR, rc,
|
|
||||||
+ "Couldn't %sfence %s: %s%s%s%s",
|
|
||||||
+ ((strcmp(command, "on") == 0)? "un" : ""),
|
|
||||||
+ target, pcmk_rc_str(rc),
|
|
||||||
+ ((reason == NULL)? "" : " ("),
|
|
||||||
+ ((reason == NULL)? "" : reason),
|
|
||||||
+ ((reason == NULL)? "" : ")"));
|
|
||||||
+ }
|
|
||||||
+ free(reason);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -580,15 +600,15 @@ main(int argc, char **argv)
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'B':
|
|
||||||
- rc = request_fencing(st, target, "reboot");
|
|
||||||
+ rc = request_fencing(st, target, "reboot", &error);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'F':
|
|
||||||
- rc = request_fencing(st, target, "off");
|
|
||||||
+ rc = request_fencing(st, target, "off", &error);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'U':
|
|
||||||
- rc = request_fencing(st, target, "on");
|
|
||||||
+ rc = request_fencing(st, target, "on", &error);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 2d99eba4c326d3b13dbbe446971ea5febd5d05be Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 10 Dec 2021 16:08:49 -0600
|
|
||||||
Subject: [PATCH 07/11] Feature: libpacemaker: return exit reason for fencer
|
|
||||||
connection failures
|
|
||||||
|
|
||||||
... instead of outputting to stderr directly, so that the caller (i.e.
|
|
||||||
stonith_admin) can output the error in the correct output format.
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_fence.c | 3 +--
|
|
||||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c
|
|
||||||
index 1b7feb54b2..d17b07cda2 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_fence.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_fence.c
|
|
||||||
@@ -104,10 +104,9 @@ async_fence_helper(gpointer user_data)
|
|
||||||
int rc = stonith_api_connect_retry(st, async_fence_data.name, 10);
|
|
||||||
|
|
||||||
if (rc != pcmk_ok) {
|
|
||||||
- fprintf(stderr, "Could not connect to fencer: %s\n", pcmk_strerror(rc));
|
|
||||||
g_main_loop_quit(mainloop);
|
|
||||||
pcmk__set_result(&async_fence_data.result, CRM_EX_ERROR,
|
|
||||||
- PCMK_EXEC_NOT_CONNECTED, NULL);
|
|
||||||
+ PCMK_EXEC_NOT_CONNECTED, pcmk_strerror(rc));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 4480ef0602f47450bdddfbde360a6a8327710927 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 17 Jan 2022 09:39:39 -0600
|
|
||||||
Subject: [PATCH 08/11] Low: libpacemaker: compare fence action names
|
|
||||||
case-sensitively
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_fence.c | 6 +++---
|
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c
|
|
||||||
index d17b07cda2..2a8f50a555 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_fence.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_fence.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright 2009-2021 the Pacemaker project contributors
|
|
||||||
+ * Copyright 2009-2022 the Pacemaker project contributors
|
|
||||||
*
|
|
||||||
* The version control history for this file may have further details.
|
|
||||||
*
|
|
||||||
@@ -77,7 +77,7 @@ static void
|
|
||||||
notify_callback(stonith_t * st, stonith_event_t * e)
|
|
||||||
{
|
|
||||||
if (pcmk__str_eq(async_fence_data.target, e->target, pcmk__str_casei)
|
|
||||||
- && pcmk__str_eq(async_fence_data.action, e->action, pcmk__str_casei)) {
|
|
||||||
+ && pcmk__str_eq(async_fence_data.action, e->action, pcmk__str_none)) {
|
|
||||||
|
|
||||||
pcmk__set_result(&async_fence_data.result,
|
|
||||||
stonith__event_exit_status(e),
|
|
||||||
@@ -549,7 +549,7 @@ pcmk__reduce_fence_history(stonith_history_t *history)
|
|
||||||
if ((hp->state == st_done) || (hp->state == st_failed)) {
|
|
||||||
/* action not in progress */
|
|
||||||
if (pcmk__str_eq(hp->target, np->target, pcmk__str_casei) &&
|
|
||||||
- pcmk__str_eq(hp->action, np->action, pcmk__str_casei) &&
|
|
||||||
+ pcmk__str_eq(hp->action, np->action, pcmk__str_none) &&
|
|
||||||
(hp->state == np->state) &&
|
|
||||||
((hp->state == st_done) ||
|
|
||||||
pcmk__str_eq(hp->delegate, np->delegate, pcmk__str_casei))) {
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From fe4c65a3b9e715c2b535709f989f2369d3637b78 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 17 Jan 2022 09:45:24 -0600
|
|
||||||
Subject: [PATCH 09/11] Refactor: libpacemaker: avoid unnecessary string
|
|
||||||
duplication
|
|
||||||
|
|
||||||
... and don't leave any dynamic memory hanging around
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_fence.c | 11 ++++++++---
|
|
||||||
1 file changed, 8 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_fence.c b/lib/pacemaker/pcmk_fence.c
|
|
||||||
index 2a8f50a555..260fa5ab8e 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_fence.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_fence.c
|
|
||||||
@@ -141,6 +141,7 @@ pcmk__request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
unsigned int tolerance, int delay, char **reason)
|
|
||||||
{
|
|
||||||
crm_trigger_t *trig;
|
|
||||||
+ int rc = pcmk_rc_ok;
|
|
||||||
|
|
||||||
async_fence_data.st = st;
|
|
||||||
async_fence_data.name = strdup(name);
|
|
||||||
@@ -160,10 +161,14 @@ pcmk__request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
|
|
||||||
free(async_fence_data.name);
|
|
||||||
|
|
||||||
- if ((reason != NULL) && (async_fence_data.result.exit_reason != NULL)) {
|
|
||||||
- *reason = strdup(async_fence_data.result.exit_reason);
|
|
||||||
+ if (reason != NULL) {
|
|
||||||
+ // Give the caller ownership of the exit reason
|
|
||||||
+ *reason = async_fence_data.result.exit_reason;
|
|
||||||
+ async_fence_data.result.exit_reason = NULL;
|
|
||||||
}
|
|
||||||
- return stonith__result2rc(&async_fence_data.result);
|
|
||||||
+ rc = stonith__result2rc(&async_fence_data.result);
|
|
||||||
+ pcmk__reset_result(&async_fence_data.result);
|
|
||||||
+ return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BUILD_PUBLIC_LIBPACEMAKER
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 7b7af07796f05a1adabdac655582be2e17106f81 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 17 Jan 2022 10:07:10 -0600
|
|
||||||
Subject: [PATCH 10/11] Doc: libpacemaker: improve pcmk__request_fencing()
|
|
||||||
doxygen block
|
|
||||||
|
|
||||||
---
|
|
||||||
include/pacemaker.h | 6 ++++--
|
|
||||||
include/pcmki/pcmki_fence.h | 15 +++++++++------
|
|
||||||
2 files changed, 13 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/pacemaker.h b/include/pacemaker.h
|
|
||||||
index e581f975a9..266a844892 100644
|
|
||||||
--- a/include/pacemaker.h
|
|
||||||
+++ b/include/pacemaker.h
|
|
||||||
@@ -187,8 +187,10 @@ int pcmk_list_nodes(xmlNodePtr *xml, char *node_types);
|
|
||||||
* \param[in] tolerance If a successful action for \p target happened within
|
|
||||||
* this many ms, return 0 without performing the action
|
|
||||||
* again
|
|
||||||
- * \param[in] delay Apply a fencing delay. Value -1 means disable also any
|
|
||||||
- * static/random fencing delays from pcmk_delay_base/max
|
|
||||||
+ * \param[in] delay Apply this delay (in milliseconds) before initiating the
|
|
||||||
+ * fencing action (a value of -1 applies no delay and also
|
|
||||||
+ * disables any fencing delay from pcmk_delay_base and
|
|
||||||
+ * pcmk_delay_max)
|
|
||||||
* \param[out] reason If not NULL, where to put descriptive failure reason
|
|
||||||
*
|
|
||||||
* \return Standard Pacemaker return code
|
|
||||||
diff --git a/include/pcmki/pcmki_fence.h b/include/pcmki/pcmki_fence.h
|
|
||||||
index e3a7e27264..4a2fe3c481 100644
|
|
||||||
--- a/include/pcmki/pcmki_fence.h
|
|
||||||
+++ b/include/pcmki/pcmki_fence.h
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright 2019-2021 the Pacemaker project contributors
|
|
||||||
+ * Copyright 2019-2022 the Pacemaker project contributors
|
|
||||||
*
|
|
||||||
* The version control history for this file may have further details.
|
|
||||||
*
|
|
||||||
@@ -22,17 +22,20 @@
|
|
||||||
* \param[in] target The node that should be fenced
|
|
||||||
* \param[in] action The fencing action (on, off, reboot) to perform
|
|
||||||
* \param[in] name Who requested the fence action?
|
|
||||||
- * \param[in] timeout How long to wait for the operation to complete (in ms).
|
|
||||||
+ * \param[in] timeout How long to wait for the operation to complete (in ms)
|
|
||||||
* \param[in] tolerance If a successful action for \p target happened within
|
|
||||||
- * this many ms, return 0 without performing the action
|
|
||||||
- * again.
|
|
||||||
- * \param[in] delay Apply a fencing delay. Value -1 means disable also any
|
|
||||||
- * static/random fencing delays from pcmk_delay_base/max
|
|
||||||
+ * this many milliseconds, return success without
|
|
||||||
+ * performing the action again
|
|
||||||
+ * \param[in] delay Apply this delay (in milliseconds) before initiating the
|
|
||||||
+ * fencing action (a value of -1 applies no delay and also
|
|
||||||
+ * disables any fencing delay from pcmk_delay_base and
|
|
||||||
+ * pcmk_delay_max)
|
|
||||||
* \param[out] reason If not NULL, where to put descriptive failure reason
|
|
||||||
*
|
|
||||||
* \return Standard Pacemaker return code
|
|
||||||
* \note If \p reason is not NULL, the caller is responsible for freeing its
|
|
||||||
* returned value.
|
|
||||||
+ * \todo delay is eventually used with g_timeout_add() and should be guint
|
|
||||||
*/
|
|
||||||
int pcmk__request_fencing(stonith_t *st, const char *target, const char *action,
|
|
||||||
const char *name, unsigned int timeout,
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 61fb7271712e1246eb6d9472dc1afc7cd10e0a79 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 17 Jan 2022 10:18:02 -0600
|
|
||||||
Subject: [PATCH 11/11] Fix: tools: get stonith_admin -T option working again
|
|
||||||
|
|
||||||
Regression introduced in 2.0.3 by 3910b6fec
|
|
||||||
|
|
||||||
This reverts commit 247eb303df934944c0b72b162bb661cee6e0ed8b
|
|
||||||
("Refactor: tools: drop unnecessary string duplication in stonith_admin")
|
|
||||||
and fixes a regression introduced when stonith_admin was converted to use
|
|
||||||
GOption.
|
|
||||||
|
|
||||||
The -T option is intended to override the client name passed to the fencer API,
|
|
||||||
but the client name was set to the default (crm_system_name) after option
|
|
||||||
processing had already been done, so any value for -T was overwritten by the
|
|
||||||
default, and its memory was leaked.
|
|
||||||
|
|
||||||
This commit sets the default only if -T was not used.
|
|
||||||
---
|
|
||||||
tools/stonith_admin.c | 15 ++++++++++-----
|
|
||||||
1 file changed, 10 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tools/stonith_admin.c b/tools/stonith_admin.c
|
|
||||||
index 5590faf11e..54774b6fee 100644
|
|
||||||
--- a/tools/stonith_admin.c
|
|
||||||
+++ b/tools/stonith_admin.c
|
|
||||||
@@ -337,10 +337,10 @@ request_fencing(stonith_t *st, const char *target, const char *command,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
char *reason = NULL;
|
|
||||||
- int rc = pcmk__request_fencing(st, target, command, crm_system_name,
|
|
||||||
- options.timeout * 1000,
|
|
||||||
- options.tolerance * 1000,
|
|
||||||
- options.delay, &reason);
|
|
||||||
+ int rc = pcmk__request_fencing(st, target, command, name,
|
|
||||||
+ options.timeout * 1000,
|
|
||||||
+ options.tolerance * 1000,
|
|
||||||
+ options.delay, &reason);
|
|
||||||
|
|
||||||
if (rc != pcmk_rc_ok) {
|
|
||||||
const char *rc_str = pcmk_rc_str(rc);
|
|
||||||
@@ -392,6 +392,10 @@ main(int argc, char **argv)
|
|
||||||
|
|
||||||
pcmk__cli_init_logging("stonith_admin", args->verbosity);
|
|
||||||
|
|
||||||
+ if (name == NULL) {
|
|
||||||
+ name = strdup(crm_system_name);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv);
|
|
||||||
if (rc != pcmk_rc_ok) {
|
|
||||||
exit_code = CRM_EX_ERROR;
|
|
||||||
@@ -526,7 +530,7 @@ main(int argc, char **argv)
|
|
||||||
if (st == NULL) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
} else if (!no_connect) {
|
|
||||||
- rc = st->cmds->connect(st, crm_system_name, NULL);
|
|
||||||
+ rc = st->cmds->connect(st, name, NULL);
|
|
||||||
}
|
|
||||||
if (rc < 0) {
|
|
||||||
out->err(out, "Could not connect to fencer: %s", pcmk_strerror(rc));
|
|
||||||
@@ -640,6 +644,7 @@ main(int argc, char **argv)
|
|
||||||
out->finish(out, exit_code, true, NULL);
|
|
||||||
pcmk__output_free(out);
|
|
||||||
}
|
|
||||||
+ free(name);
|
|
||||||
stonith_key_value_freeall(options.params, 1, 1);
|
|
||||||
|
|
||||||
if (st != NULL) {
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,796 +0,0 @@
|
|||||||
From 08c3420f2c857e7b27cd960f355d787af534da7d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 18 Jan 2022 16:04:49 -0600
|
|
||||||
Subject: [PATCH 01/12] Log: libcrmcommon: improve description for "not
|
|
||||||
connected" status
|
|
||||||
|
|
||||||
PCMK_EXEC_NOT_CONNECTED was originally added to represent "No executor
|
|
||||||
connection", but it can also now mean no fencer connection, so change it to
|
|
||||||
"Internal communication failure" which is probably less mysterious to end users
|
|
||||||
anyway (especially since it should be accompanied by a more descriptive exit
|
|
||||||
reason).
|
|
||||||
---
|
|
||||||
include/crm/common/results.h | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/include/crm/common/results.h b/include/crm/common/results.h
|
|
||||||
index 873faf5c43..3d322a7ce6 100644
|
|
||||||
--- a/include/crm/common/results.h
|
|
||||||
+++ b/include/crm/common/results.h
|
|
||||||
@@ -349,7 +349,7 @@ pcmk_exec_status_str(enum pcmk_exec_status status)
|
|
||||||
case PCMK_EXEC_ERROR_HARD: return "Hard error";
|
|
||||||
case PCMK_EXEC_ERROR_FATAL: return "Fatal error";
|
|
||||||
case PCMK_EXEC_NOT_INSTALLED: return "Not installed";
|
|
||||||
- case PCMK_EXEC_NOT_CONNECTED: return "No executor connection";
|
|
||||||
+ case PCMK_EXEC_NOT_CONNECTED: return "Internal communication failure";
|
|
||||||
case PCMK_EXEC_INVALID: return "Cannot execute now";
|
|
||||||
case PCMK_EXEC_NO_FENCE_DEVICE: return "No fence device";
|
|
||||||
case PCMK_EXEC_NO_SECRETS: return "CIB secrets unavailable";
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 7c345cf8cf0cb054f5634206880df035bfef7311 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 20 Dec 2021 15:12:36 -0600
|
|
||||||
Subject: [PATCH 02/12] Refactor: libcrmcommon: drop unnecessary system error
|
|
||||||
redefinitions
|
|
||||||
|
|
||||||
portability.h defines some system error codes that might not be present on
|
|
||||||
non-Linux systems.
|
|
||||||
|
|
||||||
This was a bad idea, since there's no way to ensure the defined values don't
|
|
||||||
conflict with existing system codes. However, we use a number of them, so it's
|
|
||||||
probably best to keep them, at least until we can make a backward compatibility
|
|
||||||
break.
|
|
||||||
|
|
||||||
However, we don't use EUNATCH, ENOSR, or ENOSTR, so we can delete those.
|
|
||||||
---
|
|
||||||
include/portability.h | 12 ------------
|
|
||||||
lib/common/results.c | 9 ++++++---
|
|
||||||
2 files changed, 6 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/portability.h b/include/portability.h
|
|
||||||
index 9a60c583a7..ee065a376d 100644
|
|
||||||
--- a/include/portability.h
|
|
||||||
+++ b/include/portability.h
|
|
||||||
@@ -131,10 +131,6 @@ typedef union
|
|
||||||
# define EREMOTEIO 193
|
|
||||||
# endif
|
|
||||||
|
|
||||||
-# ifndef EUNATCH
|
|
||||||
-# define EUNATCH 194
|
|
||||||
-# endif
|
|
||||||
-
|
|
||||||
# ifndef ENOKEY
|
|
||||||
# define ENOKEY 195
|
|
||||||
# endif
|
|
||||||
@@ -147,14 +143,6 @@ typedef union
|
|
||||||
# define ETIME 197
|
|
||||||
# endif
|
|
||||||
|
|
||||||
-# ifndef ENOSR
|
|
||||||
-# define ENOSR 198
|
|
||||||
-# endif
|
|
||||||
-
|
|
||||||
-# ifndef ENOSTR
|
|
||||||
-# define ENOSTR 199
|
|
||||||
-# endif
|
|
||||||
-
|
|
||||||
# ifndef EKEYREJECTED
|
|
||||||
# define EKEYREJECTED 200
|
|
||||||
# endif
|
|
||||||
diff --git a/lib/common/results.c b/lib/common/results.c
|
|
||||||
index 6d120694cd..96cd4e5659 100644
|
|
||||||
--- a/lib/common/results.c
|
|
||||||
+++ b/lib/common/results.c
|
|
||||||
@@ -118,9 +118,6 @@ pcmk_strerror(int rc)
|
|
||||||
case EREMOTEIO:
|
|
||||||
return "Remote I/O error";
|
|
||||||
/* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
- case EUNATCH:
|
|
||||||
- return "Protocol driver not attached";
|
|
||||||
- /* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
case ENOKEY:
|
|
||||||
return "Required key not available";
|
|
||||||
}
|
|
||||||
@@ -342,8 +339,12 @@ pcmk_rc_name(int rc)
|
|
||||||
case ENOMSG: return "ENOMSG";
|
|
||||||
case ENOPROTOOPT: return "ENOPROTOOPT";
|
|
||||||
case ENOSPC: return "ENOSPC";
|
|
||||||
+#ifdef ENOSR
|
|
||||||
case ENOSR: return "ENOSR";
|
|
||||||
+#endif
|
|
||||||
+#ifdef ENOSTR
|
|
||||||
case ENOSTR: return "ENOSTR";
|
|
||||||
+#endif
|
|
||||||
case ENOSYS: return "ENOSYS";
|
|
||||||
case ENOTBLK: return "ENOTBLK";
|
|
||||||
case ENOTCONN: return "ENOTCONN";
|
|
||||||
@@ -376,7 +377,9 @@ pcmk_rc_name(int rc)
|
|
||||||
case ETIME: return "ETIME";
|
|
||||||
case ETIMEDOUT: return "ETIMEDOUT";
|
|
||||||
case ETXTBSY: return "ETXTBSY";
|
|
||||||
+#ifdef EUNATCH
|
|
||||||
case EUNATCH: return "EUNATCH";
|
|
||||||
+#endif
|
|
||||||
case EUSERS: return "EUSERS";
|
|
||||||
/* case EWOULDBLOCK: return "EWOULDBLOCK"; */
|
|
||||||
case EXDEV: return "EXDEV";
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From eac8d1ca51eac3f437e18584f7e013d976ecee2c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 20 Dec 2021 15:33:12 -0600
|
|
||||||
Subject: [PATCH 03/12] Log: libcrmcommon: improve handling of portability.h
|
|
||||||
error codes
|
|
||||||
|
|
||||||
portability.h defines some system error codes that might not be present on
|
|
||||||
non-Linux systems.
|
|
||||||
|
|
||||||
Define a constant for each one (for example, PCMK__ECOMM for ECOMM) when
|
|
||||||
the system doesn't have the value, so we can detect that when relevant.
|
|
||||||
|
|
||||||
Also, make sure pcmk_rc_name() and pcmk_rc_str() handle all of these values.
|
|
||||||
---
|
|
||||||
include/portability.h | 8 ++++++++
|
|
||||||
lib/common/results.c | 32 ++++++++++++++++++++++++++++++--
|
|
||||||
2 files changed, 38 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/portability.h b/include/portability.h
|
|
||||||
index ee065a376d..5d5fbf21cb 100644
|
|
||||||
--- a/include/portability.h
|
|
||||||
+++ b/include/portability.h
|
|
||||||
@@ -116,34 +116,42 @@ typedef union
|
|
||||||
# include <errno.h>
|
|
||||||
|
|
||||||
# ifndef ENOTUNIQ
|
|
||||||
+# define PCMK__ENOTUNIQ
|
|
||||||
# define ENOTUNIQ 190
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef ECOMM
|
|
||||||
+# define PCMK__ECOMM
|
|
||||||
# define ECOMM 191
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef ELIBACC
|
|
||||||
+# define PCMK__ELIBACC
|
|
||||||
# define ELIBACC 192
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef EREMOTEIO
|
|
||||||
+# define PCMK__EREMOTIO
|
|
||||||
# define EREMOTEIO 193
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef ENOKEY
|
|
||||||
+# define PCMK__ENOKEY
|
|
||||||
# define ENOKEY 195
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef ENODATA
|
|
||||||
+# define PCMK__ENODATA
|
|
||||||
# define ENODATA 196
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef ETIME
|
|
||||||
+# define PCMK__ETIME
|
|
||||||
# define ETIME 197
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef EKEYREJECTED
|
|
||||||
+# define PCMK__EKEYREJECTED
|
|
||||||
# define EKEYREJECTED 200
|
|
||||||
# endif
|
|
||||||
|
|
||||||
diff --git a/lib/common/results.c b/lib/common/results.c
|
|
||||||
index 96cd4e5659..bcf289d0d6 100644
|
|
||||||
--- a/lib/common/results.c
|
|
||||||
+++ b/lib/common/results.c
|
|
||||||
@@ -395,9 +395,9 @@ pcmk_rc_name(int rc)
|
|
||||||
#ifdef EISNAM // Not available on OS X, Illumos, Solaris
|
|
||||||
case EISNAM: return "EISNAM";
|
|
||||||
case EKEYEXPIRED: return "EKEYEXPIRED";
|
|
||||||
- case EKEYREJECTED: return "EKEYREJECTED";
|
|
||||||
case EKEYREVOKED: return "EKEYREVOKED";
|
|
||||||
#endif
|
|
||||||
+ case EKEYREJECTED: return "EKEYREJECTED";
|
|
||||||
case EL2HLT: return "EL2HLT";
|
|
||||||
case EL2NSYNC: return "EL2NSYNC";
|
|
||||||
case EL3HLT: return "EL3HLT";
|
|
||||||
@@ -443,7 +443,35 @@ pcmk_rc_str(int rc)
|
|
||||||
if (rc < 0) {
|
|
||||||
return "Unknown error";
|
|
||||||
}
|
|
||||||
- return strerror(rc);
|
|
||||||
+
|
|
||||||
+ // Handle values that could be defined by system or by portability.h
|
|
||||||
+ switch (rc) {
|
|
||||||
+#ifdef PCMK__ENOTUNIQ
|
|
||||||
+ case ENOTUNIQ: return "Name not unique on network";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__ECOMM
|
|
||||||
+ case ECOMM: return "Communication error on send";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__ELIBACC
|
|
||||||
+ case ELIBACC: return "Can not access a needed shared library";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__EREMOTEIO
|
|
||||||
+ case EREMOTEIO: return "Remote I/O error";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__ENOKEY
|
|
||||||
+ case ENOKEY: return "Required key not available";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__ENODATA
|
|
||||||
+ case ENODATA: return "No data available";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__ETIME
|
|
||||||
+ case ETIME: return "Timer expired";
|
|
||||||
+#endif
|
|
||||||
+#ifdef PCMK__EKEYREJECTED
|
|
||||||
+ case EKEYREJECTED: return "Key was rejected by service";
|
|
||||||
+#endif
|
|
||||||
+ default: return strerror(rc);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
// This returns negative values for errors
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 32a38ac6374f85c43e7f4051f5e519822cc481e6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 20 Dec 2021 15:39:19 -0600
|
|
||||||
Subject: [PATCH 04/12] Log: libcrmcommon: redefine pcmk_strerror() in terms of
|
|
||||||
pcmk_rc_str()
|
|
||||||
|
|
||||||
... to reduce code duplication. This causes minor differences in the string for
|
|
||||||
a few values.
|
|
||||||
---
|
|
||||||
lib/common/results.c | 67 +-------------------------------------------
|
|
||||||
1 file changed, 1 insertion(+), 66 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/common/results.c b/lib/common/results.c
|
|
||||||
index bcf289d0d6..b2c6e8d553 100644
|
|
||||||
--- a/lib/common/results.c
|
|
||||||
+++ b/lib/common/results.c
|
|
||||||
@@ -57,72 +57,7 @@ pcmk_errorname(int rc)
|
|
||||||
const char *
|
|
||||||
pcmk_strerror(int rc)
|
|
||||||
{
|
|
||||||
- if (rc == 0) {
|
|
||||||
- return "OK";
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- rc = abs(rc);
|
|
||||||
-
|
|
||||||
- // Of course rc > 0 ... unless someone passed INT_MIN as rc
|
|
||||||
- if ((rc > 0) && (rc < PCMK_ERROR_OFFSET)) {
|
|
||||||
- return strerror(rc);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- switch (rc) {
|
|
||||||
- case pcmk_err_generic:
|
|
||||||
- return "Generic Pacemaker error";
|
|
||||||
- case pcmk_err_no_quorum:
|
|
||||||
- return "Operation requires quorum";
|
|
||||||
- case pcmk_err_schema_validation:
|
|
||||||
- return "Update does not conform to the configured schema";
|
|
||||||
- case pcmk_err_transform_failed:
|
|
||||||
- return "Schema transform failed";
|
|
||||||
- case pcmk_err_old_data:
|
|
||||||
- return "Update was older than existing configuration";
|
|
||||||
- case pcmk_err_diff_failed:
|
|
||||||
- return "Application of an update diff failed";
|
|
||||||
- case pcmk_err_diff_resync:
|
|
||||||
- return "Application of an update diff failed, requesting a full refresh";
|
|
||||||
- case pcmk_err_cib_modified:
|
|
||||||
- return "The on-disk configuration was manually modified";
|
|
||||||
- case pcmk_err_cib_backup:
|
|
||||||
- return "Could not archive the previous configuration";
|
|
||||||
- case pcmk_err_cib_save:
|
|
||||||
- return "Could not save the new configuration to disk";
|
|
||||||
- case pcmk_err_cib_corrupt:
|
|
||||||
- return "Could not parse on-disk configuration";
|
|
||||||
- case pcmk_err_multiple:
|
|
||||||
- return "Resource active on multiple nodes";
|
|
||||||
- case pcmk_err_node_unknown:
|
|
||||||
- return "Node not found";
|
|
||||||
- case pcmk_err_already:
|
|
||||||
- return "Situation already as requested";
|
|
||||||
- case pcmk_err_bad_nvpair:
|
|
||||||
- return "Bad name/value pair given";
|
|
||||||
- case pcmk_err_schema_unchanged:
|
|
||||||
- return "Schema is already the latest available";
|
|
||||||
- case pcmk_err_unknown_format:
|
|
||||||
- return "Unknown output format";
|
|
||||||
-
|
|
||||||
- /* The following cases will only be hit on systems for which they are non-standard */
|
|
||||||
- /* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
- case ENOTUNIQ:
|
|
||||||
- return "Name not unique on network";
|
|
||||||
- /* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
- case ECOMM:
|
|
||||||
- return "Communication error on send";
|
|
||||||
- /* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
- case ELIBACC:
|
|
||||||
- return "Can not access a needed shared library";
|
|
||||||
- /* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
- case EREMOTEIO:
|
|
||||||
- return "Remote I/O error";
|
|
||||||
- /* coverity[dead_error_condition] False positive on non-Linux */
|
|
||||||
- case ENOKEY:
|
|
||||||
- return "Required key not available";
|
|
||||||
- }
|
|
||||||
- crm_err("Unknown error code: %d", rc);
|
|
||||||
- return "Unknown error";
|
|
||||||
+ return pcmk_rc_str(pcmk_legacy2rc(rc));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Standard Pacemaker API return codes
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 7c331d7e2275ffebbfd5e2f6432a6137a66ee5db Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 20 Dec 2021 15:41:24 -0600
|
|
||||||
Subject: [PATCH 05/12] Log: libcrmcommon: don't say "Unknown error"
|
|
||||||
|
|
||||||
... which is unhelpful and annoying to users
|
|
||||||
---
|
|
||||||
lib/common/results.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/common/results.c b/lib/common/results.c
|
|
||||||
index b2c6e8d553..5ffac76549 100644
|
|
||||||
--- a/lib/common/results.c
|
|
||||||
+++ b/lib/common/results.c
|
|
||||||
@@ -376,7 +376,7 @@ pcmk_rc_str(int rc)
|
|
||||||
return pcmk__rcs[pcmk_rc_error - rc].desc;
|
|
||||||
}
|
|
||||||
if (rc < 0) {
|
|
||||||
- return "Unknown error";
|
|
||||||
+ return "Error";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle values that could be defined by system or by portability.h
|
|
||||||
@@ -768,7 +768,7 @@ bz2_strerror(int rc)
|
|
||||||
case BZ_OUTBUFF_FULL:
|
|
||||||
return "output data will not fit into the buffer provided";
|
|
||||||
}
|
|
||||||
- return "Unknown error";
|
|
||||||
+ return "Data compression error";
|
|
||||||
}
|
|
||||||
|
|
||||||
crm_exit_t
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 26883b4edda7d81bfcb79bd7b33bb3210beff110 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 20 Dec 2021 16:01:39 -0600
|
|
||||||
Subject: [PATCH 06/12] Log: fencing: don't warn if cluster has no watchdog
|
|
||||||
device
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/fencing/st_client.c | 7 ++++++-
|
|
||||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
|
|
||||||
index b1de912b2a..a0f3119f3b 100644
|
|
||||||
--- a/lib/fencing/st_client.c
|
|
||||||
+++ b/lib/fencing/st_client.c
|
|
||||||
@@ -187,7 +187,12 @@ stonith__watchdog_fencing_enabled_for_node_api(stonith_t *st, const char *node)
|
|
||||||
* we drop in here - so as not to make remote nodes
|
|
||||||
* panic on that answer
|
|
||||||
*/
|
|
||||||
- crm_warn("watchdog-fencing-query failed");
|
|
||||||
+ if (rc == -ENODEV) {
|
|
||||||
+ crm_notice("Cluster does not have watchdog fencing device");
|
|
||||||
+ } else {
|
|
||||||
+ crm_warn("Could not check for watchdog fencing device: %s",
|
|
||||||
+ pcmk_strerror(rc));
|
|
||||||
+ }
|
|
||||||
} else if (list[0] == '\0') {
|
|
||||||
rv = TRUE;
|
|
||||||
} else {
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 72b3c42232deaca64ffba9582598c59331203761 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 20 Dec 2021 16:22:49 -0600
|
|
||||||
Subject: [PATCH 07/12] Test: libcrmcommon: update pcmk_rc_str() unit test for
|
|
||||||
recent change
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/common/tests/results/pcmk__results_test.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/common/tests/results/pcmk__results_test.c b/lib/common/tests/results/pcmk__results_test.c
|
|
||||||
index 57a520c501..e08d4b6261 100644
|
|
||||||
--- a/lib/common/tests/results/pcmk__results_test.c
|
|
||||||
+++ b/lib/common/tests/results/pcmk__results_test.c
|
|
||||||
@@ -30,7 +30,7 @@ static void
|
|
||||||
test_for_pcmk_rc_str(void **state) {
|
|
||||||
assert_string_equal(pcmk_rc_str(pcmk_rc_error-1), "Unknown output format");
|
|
||||||
assert_string_equal(pcmk_rc_str(pcmk_rc_ok), "OK");
|
|
||||||
- assert_string_equal(pcmk_rc_str(-1), "Unknown error");
|
|
||||||
+ assert_string_equal(pcmk_rc_str(-1), "Error");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From c1ad3d6640f695321a83183c95fae2f105adc429 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 21 Dec 2021 10:20:38 -0600
|
|
||||||
Subject: [PATCH 08/12] Test: cts-lab: update expected patterns for recent
|
|
||||||
changes
|
|
||||||
|
|
||||||
---
|
|
||||||
cts/lab/CTStests.py | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/cts/lab/CTStests.py b/cts/lab/CTStests.py
|
|
||||||
index 62c832eb45..f4be998cfb 100644
|
|
||||||
--- a/cts/lab/CTStests.py
|
|
||||||
+++ b/cts/lab/CTStests.py
|
|
||||||
@@ -3055,7 +3055,7 @@ class RemoteStonithd(RemoteDriver):
|
|
||||||
r"pacemaker-controld.*:\s+error.*: Operation remote-.*_monitor",
|
|
||||||
r"pacemaker-controld.*:\s+error.*: Result of monitor operation for remote-.*",
|
|
||||||
r"schedulerd.*:\s+Recover remote-.*\s*\(.*\)",
|
|
||||||
- r"error: Result of monitor operation for .* on remote-.*: No executor connection",
|
|
||||||
+ r"error: Result of monitor operation for .* on remote-.*: Internal communication failure",
|
|
||||||
]
|
|
||||||
|
|
||||||
ignore_pats.extend(RemoteDriver.errorstoignore(self))
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From f272e2f526633c707e894b39c7c7bce3c14de898 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 21 Dec 2021 15:40:49 -0600
|
|
||||||
Subject: [PATCH 09/12] Log: controller,libpacemaker: make history XML creation
|
|
||||||
less chatty
|
|
||||||
|
|
||||||
Other messages with the same info will already be logged at higher severity
|
|
||||||
---
|
|
||||||
daemons/controld/controld_execd.c | 3 +--
|
|
||||||
daemons/controld/controld_te_actions.c | 7 ++-----
|
|
||||||
include/pcmki/pcmki_sched_utils.h | 3 +--
|
|
||||||
lib/pacemaker/pcmk_injections.c | 3 +--
|
|
||||||
lib/pacemaker/pcmk_sched_actions.c | 12 +++++-------
|
|
||||||
5 files changed, 10 insertions(+), 18 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/controld/controld_execd.c b/daemons/controld/controld_execd.c
|
|
||||||
index 15784e7687..52157fa5d4 100644
|
|
||||||
--- a/daemons/controld/controld_execd.c
|
|
||||||
+++ b/daemons/controld/controld_execd.c
|
|
||||||
@@ -693,9 +693,8 @@ build_operation_update(xmlNode * parent, lrmd_rsc_info_t * rsc, lrmd_event_data_
|
|
||||||
caller_version = CRM_FEATURE_SET;
|
|
||||||
}
|
|
||||||
|
|
||||||
- crm_trace("Building %s operation update with originator version: %s", op->rsc_id, caller_version);
|
|
||||||
xml_op = pcmk__create_history_xml(parent, op, caller_version, target_rc,
|
|
||||||
- fsa_our_uname, src, LOG_DEBUG);
|
|
||||||
+ fsa_our_uname, src);
|
|
||||||
if (xml_op == NULL) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
diff --git a/daemons/controld/controld_te_actions.c b/daemons/controld/controld_te_actions.c
|
|
||||||
index 63b7c72359..b0bcb8b2e4 100644
|
|
||||||
--- a/daemons/controld/controld_te_actions.c
|
|
||||||
+++ b/daemons/controld/controld_te_actions.c
|
|
||||||
@@ -181,7 +181,6 @@ controld_record_action_timeout(crm_action_t *action)
|
|
||||||
lrmd_event_data_t *op = NULL;
|
|
||||||
xmlNode *state = NULL;
|
|
||||||
xmlNode *rsc = NULL;
|
|
||||||
- xmlNode *xml_op = NULL;
|
|
||||||
xmlNode *action_rsc = NULL;
|
|
||||||
|
|
||||||
int rc = pcmk_ok;
|
|
||||||
@@ -245,12 +244,10 @@ controld_record_action_timeout(crm_action_t *action)
|
|
||||||
op->user_data = pcmk__transition_key(transition_graph->id, action->id,
|
|
||||||
target_rc, te_uuid);
|
|
||||||
|
|
||||||
- xml_op = pcmk__create_history_xml(rsc, op, CRM_FEATURE_SET, target_rc,
|
|
||||||
- target, __func__, LOG_INFO);
|
|
||||||
+ pcmk__create_history_xml(rsc, op, CRM_FEATURE_SET, target_rc, target,
|
|
||||||
+ __func__);
|
|
||||||
lrmd_free_event(op);
|
|
||||||
|
|
||||||
- crm_log_xml_trace(xml_op, "Action timeout");
|
|
||||||
-
|
|
||||||
rc = fsa_cib_conn->cmds->update(fsa_cib_conn, XML_CIB_TAG_STATUS, state, call_options);
|
|
||||||
fsa_register_cib_callback(rc, FALSE, NULL, cib_action_updated);
|
|
||||||
free_xml(state);
|
|
||||||
diff --git a/include/pcmki/pcmki_sched_utils.h b/include/pcmki/pcmki_sched_utils.h
|
|
||||||
index 68d60fc7db..144424a609 100644
|
|
||||||
--- a/include/pcmki/pcmki_sched_utils.h
|
|
||||||
+++ b/include/pcmki/pcmki_sched_utils.h
|
|
||||||
@@ -52,8 +52,7 @@ extern void process_utilization(pe_resource_t * rsc, pe_node_t ** prefer, pe_wor
|
|
||||||
|
|
||||||
xmlNode *pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *event,
|
|
||||||
const char *caller_version, int target_rc,
|
|
||||||
- const char *node, const char *origin,
|
|
||||||
- int level);
|
|
||||||
+ const char *node, const char *origin);
|
|
||||||
|
|
||||||
# define LOAD_STOPPED "load_stopped"
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_transition.c b/lib/pacemaker/pcmk_sched_transition.c
|
|
||||||
index 678c3f5dd2..1aa90a5a0b 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_transition.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_transition.c
|
|
||||||
@@ -201,8 +201,7 @@ inject_op(xmlNode * cib_resource, lrmd_event_data_t * op, int target_rc)
|
|
||||||
inject_op(xmlNode * cib_resource, lrmd_event_data_t * op, int target_rc)
|
|
||||||
{
|
|
||||||
return pcmk__create_history_xml(cib_resource, op, CRM_FEATURE_SET,
|
|
||||||
- target_rc, NULL, crm_system_name,
|
|
||||||
- LOG_TRACE);
|
|
||||||
+ target_rc, NULL, crm_system_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static xmlNode *
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_actions.c b/lib/pacemaker/pcmk_sched_actions.c
|
|
||||||
index f8200b0efc..4f63d3374d 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_utils.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_utils.c
|
|
||||||
@@ -892,14 +892,13 @@ add_op_digest_to_xml(lrmd_event_data_t *op, xmlNode *update)
|
|
||||||
* \param[in] target_rc Expected result of operation
|
|
||||||
* \param[in] node Name of node on which operation was performed
|
|
||||||
* \param[in] origin Arbitrary description of update source
|
|
||||||
- * \param[in] level A log message will be logged at this level
|
|
||||||
*
|
|
||||||
* \return Newly created XML node for history update
|
|
||||||
*/
|
|
||||||
xmlNode *
|
|
||||||
pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op,
|
|
||||||
const char *caller_version, int target_rc,
|
|
||||||
- const char *node, const char *origin, int level)
|
|
||||||
+ const char *node, const char *origin)
|
|
||||||
{
|
|
||||||
char *key = NULL;
|
|
||||||
char *magic = NULL;
|
|
||||||
@@ -912,11 +911,10 @@ pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op,
|
|
||||||
const char *task = NULL;
|
|
||||||
|
|
||||||
CRM_CHECK(op != NULL, return NULL);
|
|
||||||
- do_crm_log(level, "%s: Updating resource %s after %s op %s (interval=%u)",
|
|
||||||
- origin, op->rsc_id, op->op_type,
|
|
||||||
- pcmk_exec_status_str(op->op_status), op->interval_ms);
|
|
||||||
-
|
|
||||||
- crm_trace("DC version: %s", caller_version);
|
|
||||||
+ crm_trace("Creating history XML for %s-interval %s action for %s on %s "
|
|
||||||
+ "(DC version: %s, origin: %s)",
|
|
||||||
+ pcmk__readable_interval(op->interval_ms), op->op_type, op->rsc_id,
|
|
||||||
+ ((node == NULL)? "no node" : node), caller_version, origin);
|
|
||||||
|
|
||||||
task = op->op_type;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 06b1da9e5345e0d1571042c11646fd7157961279 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 21 Dec 2021 17:09:44 -0600
|
|
||||||
Subject: [PATCH 10/12] Feature: controller: improve exit reason for internal
|
|
||||||
timeouts
|
|
||||||
|
|
||||||
Functionize the part of controld_record_action_timeout() that creates a fake
|
|
||||||
executor event, into a new function synthesize_timeout_event(), and have it set
|
|
||||||
a more detailed exit reason describing what timed out.
|
|
||||||
---
|
|
||||||
daemons/controld/controld_te_actions.c | 61 ++++++++++++++++++++------
|
|
||||||
1 file changed, 48 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/controld/controld_te_actions.c b/daemons/controld/controld_te_actions.c
|
|
||||||
index b0bcb8b2e4..de2fbb82bf 100644
|
|
||||||
--- a/daemons/controld/controld_te_actions.c
|
|
||||||
+++ b/daemons/controld/controld_te_actions.c
|
|
||||||
@@ -175,6 +175,53 @@ te_crm_command(crm_graph_t * graph, crm_action_t * action)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/*!
|
|
||||||
+ * \internal
|
|
||||||
+ * \brief Synthesize an executor event for a resource action timeout
|
|
||||||
+ *
|
|
||||||
+ * \param[in] action Resource action that timed out
|
|
||||||
+ * \param[in] target_rc Expected result of action that timed out
|
|
||||||
+ *
|
|
||||||
+ * Synthesize an executor event for a resource action timeout. (If the executor
|
|
||||||
+ * gets a timeout while waiting for a resource action to complete, that will be
|
|
||||||
+ * reported via the usual callback. This timeout means we didn't hear from the
|
|
||||||
+ * executor itself or the controller that relayed the action to the executor.)
|
|
||||||
+ *
|
|
||||||
+ * \return Newly created executor event for result of \p action
|
|
||||||
+ * \note The caller is responsible for freeing the return value using
|
|
||||||
+ * lrmd_free_event().
|
|
||||||
+ */
|
|
||||||
+static lrmd_event_data_t *
|
|
||||||
+synthesize_timeout_event(crm_action_t *action, int target_rc)
|
|
||||||
+{
|
|
||||||
+ lrmd_event_data_t *op = NULL;
|
|
||||||
+ const char *target = crm_element_value(action->xml, XML_LRM_ATTR_TARGET);
|
|
||||||
+ const char *reason = NULL;
|
|
||||||
+ char *dynamic_reason = NULL;
|
|
||||||
+
|
|
||||||
+ if (pcmk__str_eq(target, get_local_node_name(), pcmk__str_casei)) {
|
|
||||||
+ reason = "Local executor did not return result in time";
|
|
||||||
+ } else {
|
|
||||||
+ const char *router_node = NULL;
|
|
||||||
+
|
|
||||||
+ router_node = crm_element_value(action->xml, XML_LRM_ATTR_ROUTER_NODE);
|
|
||||||
+ if (router_node == NULL) {
|
|
||||||
+ router_node = target;
|
|
||||||
+ }
|
|
||||||
+ dynamic_reason = crm_strdup_printf("Controller on %s did not return "
|
|
||||||
+ "result in time", router_node);
|
|
||||||
+ reason = dynamic_reason;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ op = pcmk__event_from_graph_action(NULL, action, PCMK_EXEC_TIMEOUT,
|
|
||||||
+ PCMK_OCF_UNKNOWN_ERROR, reason);
|
|
||||||
+ op->call_id = -1;
|
|
||||||
+ op->user_data = pcmk__transition_key(transition_graph->id, action->id,
|
|
||||||
+ target_rc, te_uuid);
|
|
||||||
+ free(dynamic_reason);
|
|
||||||
+ return op;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void
|
|
||||||
controld_record_action_timeout(crm_action_t *action)
|
|
||||||
{
|
|
||||||
@@ -231,19 +278,7 @@ controld_record_action_timeout(crm_action_t *action)
|
|
||||||
crm_copy_xml_element(action_rsc, rsc, XML_AGENT_ATTR_CLASS);
|
|
||||||
crm_copy_xml_element(action_rsc, rsc, XML_AGENT_ATTR_PROVIDER);
|
|
||||||
|
|
||||||
- /* If the executor gets a timeout while waiting for the action to complete,
|
|
||||||
- * that will be reported via the usual callback. This timeout means that we
|
|
||||||
- * didn't hear from the executor or the controller that relayed the action
|
|
||||||
- * to the executor.
|
|
||||||
- */
|
|
||||||
- op = pcmk__event_from_graph_action(NULL, action, PCMK_EXEC_TIMEOUT,
|
|
||||||
- PCMK_OCF_UNKNOWN_ERROR,
|
|
||||||
- "Cluster communication timeout "
|
|
||||||
- "(no response from executor)");
|
|
||||||
- op->call_id = -1;
|
|
||||||
- op->user_data = pcmk__transition_key(transition_graph->id, action->id,
|
|
||||||
- target_rc, te_uuid);
|
|
||||||
-
|
|
||||||
+ op = synthesize_timeout_event(action, target_rc);
|
|
||||||
pcmk__create_history_xml(rsc, op, CRM_FEATURE_SET, target_rc, target,
|
|
||||||
__func__);
|
|
||||||
lrmd_free_event(op);
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From be620d206faefab967d4c8567d6554d10c9e72ba Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 22 Dec 2021 16:35:06 -0600
|
|
||||||
Subject: [PATCH 11/12] Feature: fencing: improve exit reason for fencing
|
|
||||||
timeouts
|
|
||||||
|
|
||||||
Troubleshooting timeouts is one of the more difficult aspects of cluster
|
|
||||||
maintenance. We want to give as much of a hint as possible, but for fencing in
|
|
||||||
particular it is difficult because an operation might involve multiple retries
|
|
||||||
of multiple devices.
|
|
||||||
|
|
||||||
Barring another major project to track exactly which devices, retries, etc.,
|
|
||||||
were used in a given operation, these changes in wording are probably the best
|
|
||||||
we can do.
|
|
||||||
---
|
|
||||||
daemons/fenced/fenced_remote.c | 8 +++++---
|
|
||||||
lib/fencing/st_client.c | 2 +-
|
|
||||||
2 files changed, 6 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/fenced/fenced_remote.c b/daemons/fenced/fenced_remote.c
|
|
||||||
index 1e237150c5..6eebb7381e 100644
|
|
||||||
--- a/daemons/fenced/fenced_remote.c
|
|
||||||
+++ b/daemons/fenced/fenced_remote.c
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright 2009-2021 the Pacemaker project contributors
|
|
||||||
+ * Copyright 2009-2022 the Pacemaker project contributors
|
|
||||||
*
|
|
||||||
* The version control history for this file may have further details.
|
|
||||||
*
|
|
||||||
@@ -715,8 +715,10 @@ remote_op_timeout(gpointer userdata)
|
|
||||||
CRM_XS " id=%.8s",
|
|
||||||
op->action, op->target, op->client_name, op->id);
|
|
||||||
} else {
|
|
||||||
- finalize_timed_out_op(userdata, "Fencing could not be completed "
|
|
||||||
- "within overall timeout");
|
|
||||||
+ finalize_timed_out_op(userdata, "Fencing did not complete within a "
|
|
||||||
+ "total timeout based on the "
|
|
||||||
+ "configured timeout and retries for "
|
|
||||||
+ "any devices attempted");
|
|
||||||
}
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
diff --git a/lib/fencing/st_client.c b/lib/fencing/st_client.c
|
|
||||||
index a0f3119f3b..718739b321 100644
|
|
||||||
--- a/lib/fencing/st_client.c
|
|
||||||
+++ b/lib/fencing/st_client.c
|
|
||||||
@@ -906,7 +906,7 @@ invoke_registered_callbacks(stonith_t *stonith, xmlNode *msg, int call_id)
|
|
||||||
if (msg == NULL) {
|
|
||||||
// Fencer didn't reply in time
|
|
||||||
pcmk__set_result(&result, CRM_EX_ERROR, PCMK_EXEC_TIMEOUT,
|
|
||||||
- "Timeout waiting for reply from fencer");
|
|
||||||
+ "Fencer accepted request but did not reply in time");
|
|
||||||
CRM_LOG_ASSERT(call_id > 0);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 0fe8ede2f8e838e335fe42846bdf147111ce9955 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 22 Dec 2021 17:09:09 -0600
|
|
||||||
Subject: [PATCH 12/12] Feature: libcrmservice: improve exit reason for
|
|
||||||
timeouts
|
|
||||||
|
|
||||||
The services library doesn't have enough information about an action to say
|
|
||||||
(for example) what configuration parameters might be relevant, but we can at
|
|
||||||
least distinguish what kind of agent timed out.
|
|
||||||
---
|
|
||||||
lib/services/services_linux.c | 12 +++++++++++-
|
|
||||||
lib/services/systemd.c | 2 +-
|
|
||||||
2 files changed, 12 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/services/services_linux.c b/lib/services/services_linux.c
|
|
||||||
index f15eee860e..d6aafcfe46 100644
|
|
||||||
--- a/lib/services/services_linux.c
|
|
||||||
+++ b/lib/services/services_linux.c
|
|
||||||
@@ -677,9 +677,19 @@ async_action_complete(mainloop_child_t *p, pid_t pid, int core, int signo,
|
|
||||||
parse_exit_reason_from_stderr(op);
|
|
||||||
|
|
||||||
} else if (mainloop_child_timeout(p)) {
|
|
||||||
+ const char *reason = NULL;
|
|
||||||
+
|
|
||||||
+ if (op->rsc != NULL) {
|
|
||||||
+ reason = "Resource agent did not complete in time";
|
|
||||||
+ } else if (pcmk__str_eq(op->standard, PCMK_RESOURCE_CLASS_STONITH,
|
|
||||||
+ pcmk__str_none)) {
|
|
||||||
+ reason = "Fence agent did not complete in time";
|
|
||||||
+ } else {
|
|
||||||
+ reason = "Process did not complete in time";
|
|
||||||
+ }
|
|
||||||
crm_info("%s[%d] timed out after %dms", op->id, op->pid, op->timeout);
|
|
||||||
services__set_result(op, services__generic_error(op), PCMK_EXEC_TIMEOUT,
|
|
||||||
- "Process did not exit within specified timeout");
|
|
||||||
+ reason);
|
|
||||||
|
|
||||||
} else if (op->cancel) {
|
|
||||||
/* If an in-flight recurring operation was killed because it was
|
|
||||||
diff --git a/lib/services/systemd.c b/lib/services/systemd.c
|
|
||||||
index 27a3b376db..d87b287424 100644
|
|
||||||
--- a/lib/services/systemd.c
|
|
||||||
+++ b/lib/services/systemd.c
|
|
||||||
@@ -995,7 +995,7 @@ systemd_timeout_callback(gpointer p)
|
|
||||||
crm_info("%s action for systemd unit %s named '%s' timed out",
|
|
||||||
op->action, op->agent, op->rsc);
|
|
||||||
services__set_result(op, PCMK_OCF_UNKNOWN_ERROR, PCMK_EXEC_TIMEOUT,
|
|
||||||
- "Systemd action did not complete within specified timeout");
|
|
||||||
+ "Systemd unit action did not complete in time");
|
|
||||||
services__finalize_async_op(op);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
|||||||
From e8bf0161b872267f1bb7143a9866fdc15ec218f2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jan Friesse <jfriesse@redhat.com>
|
|
||||||
Date: Tue, 18 Jan 2022 16:35:24 +0100
|
|
||||||
Subject: [PATCH] Fix: corosync: Repeat corosync_cfg_trackstart
|
|
||||||
|
|
||||||
corosync_cfg_trackstart can fail with CS_ERR_TRY_AGAIN failure so
|
|
||||||
(similarly as for corosync_cfg_local_get, ...) handle failure with
|
|
||||||
using cs_repeat macro.
|
|
||||||
---
|
|
||||||
daemons/pacemakerd/pcmkd_corosync.c | 3 ++-
|
|
||||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/pacemakerd/pcmkd_corosync.c b/daemons/pacemakerd/pcmkd_corosync.c
|
|
||||||
index 7990bc43c5..cd7a40321d 100644
|
|
||||||
--- a/daemons/pacemakerd/pcmkd_corosync.c
|
|
||||||
+++ b/daemons/pacemakerd/pcmkd_corosync.c
|
|
||||||
@@ -186,7 +186,8 @@ cluster_connect_cfg(void)
|
|
||||||
crm_debug("Corosync reports local node ID is %lu", (unsigned long) nodeid);
|
|
||||||
|
|
||||||
#ifdef HAVE_COROSYNC_CFG_TRACKSTART
|
|
||||||
- rc = corosync_cfg_trackstart(cfg_handle, 0);
|
|
||||||
+ retries = 0;
|
|
||||||
+ cs_repeat(retries, 30, rc = corosync_cfg_trackstart(cfg_handle, 0));
|
|
||||||
if (rc != CS_OK) {
|
|
||||||
crm_crit("Could not enable Corosync CFG shutdown tracker: %s " CRM_XS " rc=%d",
|
|
||||||
cs_strerror(rc), rc);
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
From e316840a7e1d2a72e3089ee194334244c959905a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 19 Jan 2022 09:53:53 -0600
|
|
||||||
Subject: [PATCH] Fix: pacemakerd: tweak systemd unit respawn settings
|
|
||||||
|
|
||||||
If pacemaker exits immediately after starting, wait 1 second before trying to
|
|
||||||
respawn, since the default of 100ms is a bit aggressive for a Pacemaker
|
|
||||||
cluster.
|
|
||||||
|
|
||||||
Also, allow 5 attempts in 25 seconds before giving up.
|
|
||||||
---
|
|
||||||
daemons/pacemakerd/pacemaker.service.in | 6 ++++++
|
|
||||||
1 file changed, 6 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/daemons/pacemakerd/pacemaker.service.in b/daemons/pacemakerd/pacemaker.service.in
|
|
||||||
index 0363a2259c..3fd53d9ffb 100644
|
|
||||||
--- a/daemons/pacemakerd/pacemaker.service.in
|
|
||||||
+++ b/daemons/pacemakerd/pacemaker.service.in
|
|
||||||
@@ -31,6 +31,9 @@ After=rsyslog.service
|
|
||||||
After=corosync.service
|
|
||||||
Requires=corosync.service
|
|
||||||
|
|
||||||
+# If Pacemaker respawns repeatedly, give up after this many tries in this time
|
|
||||||
+StartLimitBurst=5
|
|
||||||
+StartLimitIntervalSec=25s
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -57,6 +60,9 @@ TasksMax=infinity
|
|
||||||
# resource. Sending -KILL will just get the node fenced
|
|
||||||
SendSIGKILL=no
|
|
||||||
|
|
||||||
+# Systemd's default of respawning a failed service after 100ms is too aggressive
|
|
||||||
+RestartSec=1s
|
|
||||||
+
|
|
||||||
# If we ever hit the StartLimitInterval/StartLimitBurst limit, and the
|
|
||||||
# admin wants to stop the cluster while pacemakerd is not running, it
|
|
||||||
# might be a good idea to enable the ExecStopPost directive below.
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,82 +0,0 @@
|
|||||||
From 8034a203bbff0aa3b53f2946dc58e409bd7246c9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Thu, 20 Jan 2022 15:03:31 -0600
|
|
||||||
Subject: [PATCH] Fix: scheduler: avoid memory leak when displaying clones
|
|
||||||
|
|
||||||
Previously, pe__clone_default() unconditionally created a hash table for
|
|
||||||
stopped instances, but didn't free it in every code path.
|
|
||||||
|
|
||||||
Now, only create the table when we have something to put in it and might
|
|
||||||
actually use it, and ensure it always gets freed.
|
|
||||||
---
|
|
||||||
lib/pengine/clone.c | 18 +++++++++++++-----
|
|
||||||
1 file changed, 13 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pengine/clone.c b/lib/pengine/clone.c
|
|
||||||
index 742e2920b0..920a04c32c 100644
|
|
||||||
--- a/lib/pengine/clone.c
|
|
||||||
+++ b/lib/pengine/clone.c
|
|
||||||
@@ -761,7 +761,7 @@ pe__clone_default(pcmk__output_t *out, va_list args)
|
|
||||||
GList *only_node = va_arg(args, GList *);
|
|
||||||
GList *only_rsc = va_arg(args, GList *);
|
|
||||||
|
|
||||||
- GHashTable *stopped = pcmk__strkey_table(free, free);
|
|
||||||
+ GHashTable *stopped = NULL;
|
|
||||||
|
|
||||||
char *list_text = NULL;
|
|
||||||
size_t list_text_len = 0;
|
|
||||||
@@ -818,7 +818,11 @@ pe__clone_default(pcmk__output_t *out, va_list args)
|
|
||||||
} else if (partially_active == FALSE) {
|
|
||||||
// List stopped instances when requested (except orphans)
|
|
||||||
if (!pcmk_is_set(child_rsc->flags, pe_rsc_orphan)
|
|
||||||
+ && !pcmk_is_set(show_opts, pcmk_show_clone_detail)
|
|
||||||
&& pcmk_is_set(show_opts, pcmk_show_inactive_rscs)) {
|
|
||||||
+ if (stopped == NULL) {
|
|
||||||
+ stopped = pcmk__strkey_table(free, free);
|
|
||||||
+ }
|
|
||||||
g_hash_table_insert(stopped, strdup(child_rsc->id), strdup("Stopped"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -873,7 +877,6 @@ pe__clone_default(pcmk__output_t *out, va_list args)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcmk_is_set(show_opts, pcmk_show_clone_detail)) {
|
|
||||||
- g_hash_table_destroy(stopped);
|
|
||||||
PCMK__OUTPUT_LIST_FOOTER(out, rc);
|
|
||||||
return pcmk_rc_ok;
|
|
||||||
}
|
|
||||||
@@ -948,8 +951,10 @@ pe__clone_default(pcmk__output_t *out, va_list args)
|
|
||||||
GList *list = g_hash_table_get_values(rsc->allowed_nodes);
|
|
||||||
|
|
||||||
/* Custom stopped table for non-unique clones */
|
|
||||||
- g_hash_table_destroy(stopped);
|
|
||||||
- stopped = pcmk__strkey_table(free, free);
|
|
||||||
+ if (stopped != NULL) {
|
|
||||||
+ g_hash_table_destroy(stopped);
|
|
||||||
+ stopped = NULL;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (list == NULL) {
|
|
||||||
/* Clusters with symmetrical=false haven't calculated allowed_nodes yet
|
|
||||||
@@ -972,6 +977,9 @@ pe__clone_default(pcmk__output_t *out, va_list args)
|
|
||||||
state = "Stopped (disabled)";
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (stopped == NULL) {
|
|
||||||
+ stopped = pcmk__strkey_table(free, free);
|
|
||||||
+ }
|
|
||||||
if (probe_op != NULL) {
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
@@ -987,7 +995,7 @@ pe__clone_default(pcmk__output_t *out, va_list args)
|
|
||||||
g_list_free(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (g_hash_table_size(stopped) > 0) {
|
|
||||||
+ if (stopped != NULL) {
|
|
||||||
GList *list = sorted_hash_table_values(stopped);
|
|
||||||
|
|
||||||
clone_header(out, &rc, rsc, clone_data);
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
From 16928cfc69136bc56b1574bee9966e0d5de73abd Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 26 Jan 2022 09:15:43 -0600
|
|
||||||
Subject: [PATCH] Fix: controller: correctly match "node down" events
|
|
||||||
|
|
||||||
regression introduced in 2.1.2 by 03ce7376e
|
|
||||||
|
|
||||||
The symptom that led to this was that removing a remote node connection
|
|
||||||
resource would lead to the remote node getting fenced when the connection stop
|
|
||||||
was not recognized as an expected down event.
|
|
||||||
---
|
|
||||||
daemons/controld/controld_te_events.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/daemons/controld/controld_te_events.c b/daemons/controld/controld_te_events.c
|
|
||||||
index 36fd832ba0..1fd7129922 100644
|
|
||||||
--- a/daemons/controld/controld_te_events.c
|
|
||||||
+++ b/daemons/controld/controld_te_events.c
|
|
||||||
@@ -304,7 +304,7 @@ match_down_event(const char *target)
|
|
||||||
gIter2 = gIter2->next) {
|
|
||||||
|
|
||||||
match = (crm_action_t*)gIter2->data;
|
|
||||||
- if (pcmk_is_set(match->flags, pcmk__graph_action_confirmed)) {
|
|
||||||
+ if (pcmk_is_set(match->flags, pcmk__graph_action_executed)) {
|
|
||||||
xpath_ret = xpath_search(match->xml, xpath);
|
|
||||||
if (numXpathResults(xpath_ret) < 1) {
|
|
||||||
match = NULL;
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,806 +0,0 @@
|
|||||||
From 767b5552ab49850204692c2c990dfb41d37589f3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 28 Mar 2022 18:11:52 -0500
|
|
||||||
Subject: [PATCH 1/9] Refactor: libpacemaker: drop unnecessary argument from
|
|
||||||
"rsc-action" message
|
|
||||||
|
|
||||||
9875cab129 moved the setting of the "moving" variable from LogActions() to a
|
|
||||||
new "rsc-action" message, but continued to pass the variable unnecessarily
|
|
||||||
|
|
||||||
Also simplify how it's set
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_output.c | 10 ++++------
|
|
||||||
lib/pacemaker/pcmk_sched_native.c | 4 +---
|
|
||||||
2 files changed, 5 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c
|
|
||||||
index d864c8bd2..56963a93f 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_output.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_output.c
|
|
||||||
@@ -873,19 +873,18 @@ digests_xml(pcmk__output_t *out, va_list args)
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
-PCMK__OUTPUT_ARGS("rsc-action", "pe_resource_t *", "pe_node_t *", "pe_node_t *",
|
|
||||||
- "gboolean")
|
|
||||||
+PCMK__OUTPUT_ARGS("rsc-action", "pe_resource_t *", "pe_node_t *", "pe_node_t *")
|
|
||||||
static int
|
|
||||||
rsc_action_default(pcmk__output_t *out, va_list args)
|
|
||||||
{
|
|
||||||
pe_resource_t *rsc = va_arg(args, pe_resource_t *);
|
|
||||||
pe_node_t *current = va_arg(args, pe_node_t *);
|
|
||||||
pe_node_t *next = va_arg(args, pe_node_t *);
|
|
||||||
- gboolean moving = va_arg(args, gboolean);
|
|
||||||
|
|
||||||
GList *possible_matches = NULL;
|
|
||||||
char *key = NULL;
|
|
||||||
int rc = pcmk_rc_no_output;
|
|
||||||
+ bool moving = false;
|
|
||||||
|
|
||||||
pe_node_t *start_node = NULL;
|
|
||||||
pe_action_t *start = NULL;
|
|
||||||
@@ -901,9 +900,8 @@ rsc_action_default(pcmk__output_t *out, va_list args)
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (current != NULL && next != NULL && !pcmk__str_eq(current->details->id, next->details->id, pcmk__str_casei)) {
|
|
||||||
- moving = TRUE;
|
|
||||||
- }
|
|
||||||
+ moving = (current != NULL) && (next != NULL)
|
|
||||||
+ && (current->details != next->details);
|
|
||||||
|
|
||||||
possible_matches = pe__resource_actions(rsc, next, RSC_START, FALSE);
|
|
||||||
if (possible_matches) {
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_resource.c b/lib/pacemaker/pcmk_sched_resource.c
|
|
||||||
index a3d646775..41631da3d 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
@@ -2037,8 +2037,6 @@ LogActions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
pe_node_t *next = NULL;
|
|
||||||
pe_node_t *current = NULL;
|
|
||||||
|
|
||||||
- gboolean moving = FALSE;
|
|
||||||
-
|
|
||||||
if(rsc->variant == pe_container) {
|
|
||||||
pcmk__bundle_log_actions(rsc, data_set);
|
|
||||||
return;
|
|
||||||
@@ -2066,7 +2064,7 @@ LogActions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- out->message(out, "rsc-action", rsc, current, next, moving);
|
|
||||||
+ out->message(out, "rsc-action", rsc, current, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 870fb19715618c4ceab9ed4ae13a99658440b662 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 22 Mar 2022 15:22:23 -0500
|
|
||||||
Subject: [PATCH 2/9] Refactor: scheduler: functionize scheduling restart
|
|
||||||
actions
|
|
||||||
|
|
||||||
native_create_actions() is already overlarge, and more needs to be added to it
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_sched_native.c | 85 ++++++++++++++++++++-----------
|
|
||||||
1 file changed, 54 insertions(+), 31 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
index 808e97540..b8a1c1e1a 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
@@ -1185,6 +1185,58 @@ handle_migration_actions(pe_resource_t * rsc, pe_node_t *current, pe_node_t *cho
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+/*!
|
|
||||||
+ * \internal
|
|
||||||
+ * \brief Schedule actions to bring resource down and back to current role
|
|
||||||
+ *
|
|
||||||
+ * \param[in] rsc Resource to restart
|
|
||||||
+ * \param[in] current Node that resource should be brought down on
|
|
||||||
+ * \param[in] chosen Node that resource should be brought up on
|
|
||||||
+ * \param[in] need_stop Whether the resource must be stopped
|
|
||||||
+ * \param[in] need_promote Whether the resource must be promoted
|
|
||||||
+ *
|
|
||||||
+ * \return Role that resource would have after scheduled actions are taken
|
|
||||||
+ */
|
|
||||||
+static void
|
|
||||||
+schedule_restart_actions(pe_resource_t *rsc, pe_node_t *current,
|
|
||||||
+ pe_node_t *chosen, bool need_stop, bool need_promote)
|
|
||||||
+{
|
|
||||||
+ enum rsc_role_e role = rsc->role;
|
|
||||||
+ enum rsc_role_e next_role;
|
|
||||||
+
|
|
||||||
+ // Bring resource down to a stop on its current node
|
|
||||||
+ while (role != RSC_ROLE_STOPPED) {
|
|
||||||
+ next_role = rsc_state_matrix[role][RSC_ROLE_STOPPED];
|
|
||||||
+ pe_rsc_trace(rsc, "Creating %s action to take %s down from %s to %s",
|
|
||||||
+ (need_stop? "required" : "optional"), rsc->id,
|
|
||||||
+ role2text(role), role2text(next_role));
|
|
||||||
+ if (!rsc_action_matrix[role][next_role](rsc, current, !need_stop,
|
|
||||||
+ rsc->cluster)) {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ role = next_role;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // Bring resource up to its next role on its next node
|
|
||||||
+ while ((rsc->role <= rsc->next_role) && (role != rsc->role)
|
|
||||||
+ && !pcmk_is_set(rsc->flags, pe_rsc_block)) {
|
|
||||||
+ bool required = need_stop;
|
|
||||||
+
|
|
||||||
+ next_role = rsc_state_matrix[role][rsc->role];
|
|
||||||
+ if ((next_role == RSC_ROLE_PROMOTED) && need_promote) {
|
|
||||||
+ required = true;
|
|
||||||
+ }
|
|
||||||
+ pe_rsc_trace(rsc, "Creating %s action to take %s up from %s to %s",
|
|
||||||
+ (required? "required" : "optional"), rsc->id,
|
|
||||||
+ role2text(role), role2text(next_role));
|
|
||||||
+ if (!rsc_action_matrix[role][next_role](rsc, chosen, !required,
|
|
||||||
+ rsc->cluster)) {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ role = next_role;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void
|
|
||||||
native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
{
|
|
||||||
@@ -1332,39 +1384,10 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
/* Create any additional actions required when bringing resource down and
|
|
||||||
* back up to same level.
|
|
||||||
*/
|
|
||||||
- role = rsc->role;
|
|
||||||
- while (role != RSC_ROLE_STOPPED) {
|
|
||||||
- next_role = rsc_state_matrix[role][RSC_ROLE_STOPPED];
|
|
||||||
- pe_rsc_trace(rsc, "Creating %s action to take %s down from %s to %s",
|
|
||||||
- (need_stop? "required" : "optional"), rsc->id,
|
|
||||||
- role2text(role), role2text(next_role));
|
|
||||||
- if (rsc_action_matrix[role][next_role] (rsc, current, !need_stop, data_set) == FALSE) {
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- role = next_role;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
-
|
|
||||||
- while ((rsc->role <= rsc->next_role) && (role != rsc->role)
|
|
||||||
- && !pcmk_is_set(rsc->flags, pe_rsc_block)) {
|
|
||||||
- bool required = need_stop;
|
|
||||||
-
|
|
||||||
- next_role = rsc_state_matrix[role][rsc->role];
|
|
||||||
- if ((next_role == RSC_ROLE_PROMOTED) && need_promote) {
|
|
||||||
- required = true;
|
|
||||||
- }
|
|
||||||
- pe_rsc_trace(rsc, "Creating %s action to take %s up from %s to %s",
|
|
||||||
- (required? "required" : "optional"), rsc->id,
|
|
||||||
- role2text(role), role2text(next_role));
|
|
||||||
- if (rsc_action_matrix[role][next_role](rsc, chosen, !required,
|
|
||||||
- data_set) == FALSE) {
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
- role = next_role;
|
|
||||||
- }
|
|
||||||
- role = rsc->role;
|
|
||||||
+ schedule_restart_actions(rsc, current, chosen, need_stop, need_promote);
|
|
||||||
|
|
||||||
/* Required steps from this role to the next */
|
|
||||||
+ role = rsc->role;
|
|
||||||
while (role != rsc->next_role) {
|
|
||||||
next_role = rsc_state_matrix[role][rsc->next_role];
|
|
||||||
pe_rsc_trace(rsc, "Creating action to take %s from %s to %s (ending at %s)",
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 736d4d8f5e432acf12e577d137e9165904c71b3b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Mon, 28 Mar 2022 17:42:26 -0500
|
|
||||||
Subject: [PATCH 3/9] Log: scheduler: improve trace messages when creating
|
|
||||||
actions
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_sched_native.c | 22 ++++++++++++++++------
|
|
||||||
1 file changed, 16 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
index b8a1c1e1a..8b651ebd2 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
@@ -1997,7 +1997,6 @@ StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set
|
|
||||||
GList *gIter = NULL;
|
|
||||||
|
|
||||||
CRM_ASSERT(rsc);
|
|
||||||
- pe_rsc_trace(rsc, "%s", rsc->id);
|
|
||||||
|
|
||||||
for (gIter = rsc->running_on; gIter != NULL; gIter = gIter->next) {
|
|
||||||
pe_node_t *current = (pe_node_t *) gIter->data;
|
|
||||||
@@ -2005,16 +2004,23 @@ StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set
|
|
||||||
|
|
||||||
if (rsc->partial_migration_target) {
|
|
||||||
if (rsc->partial_migration_target->details == current->details) {
|
|
||||||
- pe_rsc_trace(rsc, "Filtered %s -> %s %s", current->details->uname,
|
|
||||||
- next->details->uname, rsc->id);
|
|
||||||
+ pe_rsc_trace(rsc,
|
|
||||||
+ "Skipping stop of %s on %s "
|
|
||||||
+ "because migration to %s in progress",
|
|
||||||
+ rsc->id, current->details->uname,
|
|
||||||
+ next->details->uname);
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
- pe_rsc_trace(rsc, "Forced on %s %s", current->details->uname, rsc->id);
|
|
||||||
+ pe_rsc_trace(rsc,
|
|
||||||
+ "Forcing stop of %s on %s "
|
|
||||||
+ "because migration target changed",
|
|
||||||
+ rsc->id, current->details->uname);
|
|
||||||
optional = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- pe_rsc_trace(rsc, "%s on %s", rsc->id, current->details->uname);
|
|
||||||
+ pe_rsc_trace(rsc, "Scheduling stop of %s on %s",
|
|
||||||
+ rsc->id, current->details->uname);
|
|
||||||
stop = stop_action(rsc, current, optional);
|
|
||||||
|
|
||||||
if(rsc->allocated_to == NULL) {
|
|
||||||
@@ -2048,7 +2054,11 @@ StartRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_se
|
|
||||||
pe_action_t *start = NULL;
|
|
||||||
|
|
||||||
CRM_ASSERT(rsc);
|
|
||||||
- pe_rsc_trace(rsc, "%s on %s %d %d", rsc->id, next ? next->details->uname : "N/A", optional, next ? next->weight : 0);
|
|
||||||
+
|
|
||||||
+ pe_rsc_trace(rsc, "Scheduling %s start of %s on %s (weight=%d)",
|
|
||||||
+ (optional? "optional" : "required"), rsc->id,
|
|
||||||
+ ((next == NULL)? "N/A" : next->details->uname),
|
|
||||||
+ ((next == NULL)? 0 : next->weight));
|
|
||||||
start = start_action(rsc, next, TRUE);
|
|
||||||
|
|
||||||
pcmk__order_vs_unfence(rsc, next, start, pe_order_implies_then, data_set);
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 6f987234d5246ed50f4fe2db90e5edb6a23e877d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 1 Mar 2022 16:42:06 -0600
|
|
||||||
Subject: [PATCH 4/9] Log: scheduler: log a warning if invalid value is given
|
|
||||||
for multiple-active
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/pengine/complex.c | 7 ++++++-
|
|
||||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c
|
|
||||||
index e82af2aae..f2caef831 100644
|
|
||||||
--- a/lib/pengine/complex.c
|
|
||||||
+++ b/lib/pengine/complex.c
|
|
||||||
@@ -694,7 +694,12 @@ common_unpack(xmlNode * xml_obj, pe_resource_t ** rsc,
|
|
||||||
(*rsc)->recovery_type = recovery_block;
|
|
||||||
pe_rsc_trace((*rsc), "\tMultiple running resource recovery: block");
|
|
||||||
|
|
||||||
- } else {
|
|
||||||
+ } else { // "stop_start"
|
|
||||||
+ if (!pcmk__str_eq(value, "stop_start",
|
|
||||||
+ pcmk__str_casei|pcmk__str_null_matches)) {
|
|
||||||
+ pe_warn("%s is not a valid value for " XML_RSC_ATTR_MULTIPLE
|
|
||||||
+ ", using default of \"stop_start\"", value);
|
|
||||||
+ }
|
|
||||||
(*rsc)->recovery_type = recovery_stop_start;
|
|
||||||
pe_rsc_trace((*rsc), "\tMultiple running resource recovery: stop/start");
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 50456c3e229a6021ca0ba7346af41cd234abcc16 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 1 Mar 2022 16:49:31 -0600
|
|
||||||
Subject: [PATCH 5/9] API: libpe_status: add recovery_stop_unexpected to enum
|
|
||||||
rsc_recovery_type
|
|
||||||
|
|
||||||
The behavior is not implemented as of this commit
|
|
||||||
---
|
|
||||||
include/crm/pengine/common.h | 14 ++++++++++++--
|
|
||||||
lib/pengine/complex.c | 5 +++++
|
|
||||||
lib/pengine/native.c | 7 +++++--
|
|
||||||
3 files changed, 22 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/crm/pengine/common.h b/include/crm/pengine/common.h
|
|
||||||
index efe89a171..9b9f38f3b 100644
|
|
||||||
--- a/include/crm/pengine/common.h
|
|
||||||
+++ b/include/crm/pengine/common.h
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright 2004-2021 the Pacemaker project contributors
|
|
||||||
+ * Copyright 2004-2022 the Pacemaker project contributors
|
|
||||||
*
|
|
||||||
* The version control history for this file may have further details.
|
|
||||||
*
|
|
||||||
@@ -78,7 +78,8 @@ enum action_tasks {
|
|
||||||
enum rsc_recovery_type {
|
|
||||||
recovery_stop_start,
|
|
||||||
recovery_stop_only,
|
|
||||||
- recovery_block
|
|
||||||
+ recovery_block,
|
|
||||||
+ recovery_stop_unexpected,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum rsc_start_requirement {
|
|
||||||
@@ -143,6 +144,13 @@ const char *fail2text(enum action_fail_response fail);
|
|
||||||
const char *pe_pref(GHashTable * options, const char *name);
|
|
||||||
void calculate_active_ops(GList * sorted_op_list, int *start_index, int *stop_index);
|
|
||||||
|
|
||||||
+/*!
|
|
||||||
+ * \brief Get readable description of a recovery type
|
|
||||||
+ *
|
|
||||||
+ * \param[in] type Recovery type
|
|
||||||
+ *
|
|
||||||
+ * \return Static string describing \p type
|
|
||||||
+ */
|
|
||||||
static inline const char *
|
|
||||||
recovery2text(enum rsc_recovery_type type)
|
|
||||||
{
|
|
||||||
@@ -153,6 +161,8 @@ recovery2text(enum rsc_recovery_type type)
|
|
||||||
return "attempting recovery";
|
|
||||||
case recovery_block:
|
|
||||||
return "waiting for an administrator";
|
|
||||||
+ case recovery_stop_unexpected:
|
|
||||||
+ return "stopping unexpected instances";
|
|
||||||
}
|
|
||||||
return "Unknown";
|
|
||||||
}
|
|
||||||
diff --git a/lib/pengine/complex.c b/lib/pengine/complex.c
|
|
||||||
index f2caef831..fc9028e81 100644
|
|
||||||
--- a/lib/pengine/complex.c
|
|
||||||
+++ b/lib/pengine/complex.c
|
|
||||||
@@ -694,6 +694,11 @@ common_unpack(xmlNode * xml_obj, pe_resource_t ** rsc,
|
|
||||||
(*rsc)->recovery_type = recovery_block;
|
|
||||||
pe_rsc_trace((*rsc), "\tMultiple running resource recovery: block");
|
|
||||||
|
|
||||||
+ } else if (pcmk__str_eq(value, "stop_unexpected", pcmk__str_casei)) {
|
|
||||||
+ (*rsc)->recovery_type = recovery_stop_unexpected;
|
|
||||||
+ pe_rsc_trace((*rsc), "\tMultiple running resource recovery: "
|
|
||||||
+ "stop unexpected instances");
|
|
||||||
+
|
|
||||||
} else { // "stop_start"
|
|
||||||
if (!pcmk__str_eq(value, "stop_start",
|
|
||||||
pcmk__str_casei|pcmk__str_null_matches)) {
|
|
||||||
diff --git a/lib/pengine/native.c b/lib/pengine/native.c
|
|
||||||
index e16e54bae..fa7dc8960 100644
|
|
||||||
--- a/lib/pengine/native.c
|
|
||||||
+++ b/lib/pengine/native.c
|
|
||||||
@@ -149,8 +149,6 @@ native_add_running(pe_resource_t * rsc, pe_node_t * node, pe_working_set_t * dat
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
- case recovery_stop_start:
|
|
||||||
- break;
|
|
||||||
case recovery_block:
|
|
||||||
pe__clear_resource_flags(rsc, pe_rsc_managed);
|
|
||||||
pe__set_resource_flags(rsc, pe_rsc_block);
|
|
||||||
@@ -171,6 +169,11 @@ native_add_running(pe_resource_t * rsc, pe_node_t * node, pe_working_set_t * dat
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
+ default: // recovery_stop_start, recovery_stop_unexpected
|
|
||||||
+ /* The scheduler will do the right thing because the relevant
|
|
||||||
+ * variables and flags are set when unpacking the history.
|
|
||||||
+ */
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
crm_debug("%s is active on multiple nodes including %s: %s",
|
|
||||||
rsc->id, node->details->uname,
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 5e994f0633b27e7a53701e0954466739c8f1acf7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 30 Mar 2022 16:26:19 -0500
|
|
||||||
Subject: [PATCH 6/9] API: libpe_status: add pe_rsc_stop_unexpected flag
|
|
||||||
|
|
||||||
---
|
|
||||||
include/crm/pengine/pe_types.h | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/include/crm/pengine/pe_types.h b/include/crm/pengine/pe_types.h
|
|
||||||
index e3ecaa823..7d5394bff 100644
|
|
||||||
--- a/include/crm/pengine/pe_types.h
|
|
||||||
+++ b/include/crm/pengine/pe_types.h
|
|
||||||
@@ -277,6 +277,7 @@ struct pe_node_s {
|
|
||||||
|
|
||||||
# define pe_rsc_starting 0x00100000ULL
|
|
||||||
# define pe_rsc_stopping 0x00200000ULL
|
|
||||||
+# define pe_rsc_stop_unexpected 0x00400000ULL
|
|
||||||
# define pe_rsc_allow_migrate 0x00800000ULL
|
|
||||||
|
|
||||||
# define pe_rsc_failure_ignored 0x01000000ULL
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From c1acf05be853d99c17761759b8c961f2ec4a55c2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Thu, 31 Mar 2022 09:56:34 -0500
|
|
||||||
Subject: [PATCH 7/9] API: libpe_status: add pe_rsc_restarting flag
|
|
||||||
|
|
||||||
This is used to indicate that any actions currently being scheduled are part of
|
|
||||||
the resource's restart actions (i.e. we are in schedule_restart_actions()).
|
|
||||||
---
|
|
||||||
include/crm/pengine/pe_types.h | 1 +
|
|
||||||
lib/pacemaker/pcmk_sched_native.c | 4 ++++
|
|
||||||
2 files changed, 5 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/include/crm/pengine/pe_types.h b/include/crm/pengine/pe_types.h
|
|
||||||
index 7d5394bff..77d28e900 100644
|
|
||||||
--- a/include/crm/pengine/pe_types.h
|
|
||||||
+++ b/include/crm/pengine/pe_types.h
|
|
||||||
@@ -265,6 +265,7 @@ struct pe_node_s {
|
|
||||||
# define pe_rsc_provisional 0x00000100ULL
|
|
||||||
# define pe_rsc_allocating 0x00000200ULL
|
|
||||||
# define pe_rsc_merging 0x00000400ULL
|
|
||||||
+# define pe_rsc_restarting 0x00000800ULL
|
|
||||||
|
|
||||||
# define pe_rsc_stop 0x00001000ULL
|
|
||||||
# define pe_rsc_reload 0x00002000ULL
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
index 8b651ebd2..8002938b5 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
@@ -1204,6 +1204,8 @@ schedule_restart_actions(pe_resource_t *rsc, pe_node_t *current,
|
|
||||||
enum rsc_role_e role = rsc->role;
|
|
||||||
enum rsc_role_e next_role;
|
|
||||||
|
|
||||||
+ pe__set_resource_flags(rsc, pe_rsc_restarting);
|
|
||||||
+
|
|
||||||
// Bring resource down to a stop on its current node
|
|
||||||
while (role != RSC_ROLE_STOPPED) {
|
|
||||||
next_role = rsc_state_matrix[role][RSC_ROLE_STOPPED];
|
|
||||||
@@ -1235,6 +1237,8 @@ schedule_restart_actions(pe_resource_t *rsc, pe_node_t *current,
|
|
||||||
}
|
|
||||||
role = next_role;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ pe__clear_resource_flags(rsc, pe_rsc_restarting);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 871e2201d92520039df45062afc9120fd1fb0f30 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Tue, 1 Mar 2022 17:46:39 -0600
|
|
||||||
Subject: [PATCH 8/9] Refactor: scheduler: add expected node to primitive
|
|
||||||
variant data
|
|
||||||
|
|
||||||
Nothing uses it yet
|
|
||||||
---
|
|
||||||
include/crm/pengine/internal.h | 4 ++++
|
|
||||||
lib/pengine/native.c | 38 ++++++++++++++++++++++++++++++++++
|
|
||||||
lib/pengine/variant.h | 8 +++++--
|
|
||||||
3 files changed, 48 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h
|
|
||||||
index f949684b4..f69e6bcce 100644
|
|
||||||
--- a/include/crm/pengine/internal.h
|
|
||||||
+++ b/include/crm/pengine/internal.h
|
|
||||||
@@ -579,4 +579,8 @@ xmlNode *pe__failed_probe_for_rsc(pe_resource_t *rsc, const char *name);
|
|
||||||
|
|
||||||
const char *pe__clone_child_id(pe_resource_t *rsc);
|
|
||||||
|
|
||||||
+void pe__update_expected_node(pe_resource_t *rsc, pe_node_t *node,
|
|
||||||
+ int execution_status, int exit_status,
|
|
||||||
+ int expected_exit_status);
|
|
||||||
+
|
|
||||||
#endif
|
|
||||||
diff --git a/lib/pengine/native.c b/lib/pengine/native.c
|
|
||||||
index fa7dc8960..591d1c6f5 100644
|
|
||||||
--- a/lib/pengine/native.c
|
|
||||||
+++ b/lib/pengine/native.c
|
|
||||||
@@ -1376,3 +1376,41 @@ pe__native_is_filtered(pe_resource_t *rsc, GList *only_rsc, gboolean check_paren
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+/*!
|
|
||||||
+ * \internal
|
|
||||||
+ * \brief Set a resource's expected node if appropriate for a history result
|
|
||||||
+ *
|
|
||||||
+ * \param[in] rsc Resource to set expected node for
|
|
||||||
+ * \param[in] node Node to set as expected node
|
|
||||||
+ * \param[in] execution_status History entry's execution status
|
|
||||||
+ * \param[in] exit_status History entry's actual exit status
|
|
||||||
+ * \param[in] expected_status History entry's expected exit status
|
|
||||||
+ */
|
|
||||||
+void
|
|
||||||
+pe__update_expected_node(pe_resource_t *rsc, pe_node_t *node,
|
|
||||||
+ int execution_status, int exit_status,
|
|
||||||
+ int expected_exit_status)
|
|
||||||
+{
|
|
||||||
+ native_variant_data_t *native_data = NULL;
|
|
||||||
+
|
|
||||||
+ get_native_variant_data(native_data, rsc);
|
|
||||||
+
|
|
||||||
+ if ((rsc->recovery_type == recovery_stop_unexpected)
|
|
||||||
+ && (rsc->role > RSC_ROLE_STOPPED)
|
|
||||||
+ && (execution_status == PCMK_EXEC_DONE)
|
|
||||||
+ && (exit_status == expected_exit_status)) {
|
|
||||||
+ // Resource is active and was expected on this node
|
|
||||||
+ pe_rsc_trace(rsc, "Found expected node %s for %s",
|
|
||||||
+ node->details->uname, rsc->id);
|
|
||||||
+ native_data->expected_node = node;
|
|
||||||
+ pe__set_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
+
|
|
||||||
+ } else if ((native_data->expected_node != NULL)
|
|
||||||
+ && (native_data->expected_node->details == node->details)) {
|
|
||||||
+ // Resource is not cleanly active here
|
|
||||||
+ pe_rsc_trace(rsc, "Clearing expected node for %s", rsc->id);
|
|
||||||
+ native_data->expected_node = NULL;
|
|
||||||
+ pe__clear_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
diff --git a/lib/pengine/variant.h b/lib/pengine/variant.h
|
|
||||||
index cabfbe81f..d8fefa9d6 100644
|
|
||||||
--- a/lib/pengine/variant.h
|
|
||||||
+++ b/lib/pengine/variant.h
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright 2004-2021 the Pacemaker project contributors
|
|
||||||
+ * Copyright 2004-2022 the Pacemaker project contributors
|
|
||||||
*
|
|
||||||
* The version control history for this file may have further details.
|
|
||||||
*
|
|
||||||
@@ -139,7 +139,11 @@ typedef struct group_variant_data_s {
|
|
||||||
# elif VARIANT_NATIVE
|
|
||||||
|
|
||||||
typedef struct native_variant_data_s {
|
|
||||||
- int dummy;
|
|
||||||
+ /* If the resource is multiply active, and has multiple-active set to
|
|
||||||
+ * stop_unexpected, this will be set to the node where the resource was
|
|
||||||
+ * found active by an operation with a expected result.
|
|
||||||
+ */
|
|
||||||
+ pe_node_t *expected_node;
|
|
||||||
} native_variant_data_t;
|
|
||||||
|
|
||||||
# define get_native_variant_data(data, rsc) \
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 0e4e17e972f1c3663389f18d8f8c527bd819b3c5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Thu, 7 Apr 2022 10:20:00 -0500
|
|
||||||
Subject: [PATCH 9/9] Feature: scheduler: implement
|
|
||||||
multiple-active=stop_unexpected
|
|
||||||
|
|
||||||
The default multiple-active policy of restarting the resource on all nodes
|
|
||||||
requires no special handling, because at least one of the locations will have
|
|
||||||
an unexpected rc, causing the resource to be marked as failed and restarted,
|
|
||||||
and StopRsc() creates stops on all nodes running the resource.
|
|
||||||
|
|
||||||
The new stop_unexpected behavior relies on most of the same handling, but
|
|
||||||
the action creation functions need to skip the node where the resource had the
|
|
||||||
expected result. For that, we set the new rsc->expected_node when unpacking a
|
|
||||||
successful result, to be checked by those functions.
|
|
||||||
|
|
||||||
Note that this still schedules a start for the resource, which is a pseudo-op
|
|
||||||
for the resource itself, but (properly) causes any dependent resources to be
|
|
||||||
restarted.
|
|
||||||
|
|
||||||
Fixes T23
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_output.c | 10 ++++
|
|
||||||
lib/pacemaker/pcmk_sched_native.c | 94 ++++++++++++++++++++++++++++++-
|
|
||||||
lib/pengine/unpack.c | 1 +
|
|
||||||
3 files changed, 103 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_output.c b/lib/pacemaker/pcmk_output.c
|
|
||||||
index 56963a93f..9a522a3e5 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_output.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_output.c
|
|
||||||
@@ -918,6 +918,16 @@ rsc_action_default(pcmk__output_t *out, va_list args)
|
|
||||||
if (possible_matches) {
|
|
||||||
stop = possible_matches->data;
|
|
||||||
g_list_free(possible_matches);
|
|
||||||
+ } else if (pcmk_is_set(rsc->flags, pe_rsc_stop_unexpected)) {
|
|
||||||
+ /* The resource is multiply active with multiple-active set to
|
|
||||||
+ * stop_unexpected, and not stopping on its current node, but it should
|
|
||||||
+ * be stopping elsewhere.
|
|
||||||
+ */
|
|
||||||
+ possible_matches = pe__resource_actions(rsc, NULL, RSC_STOP, FALSE);
|
|
||||||
+ if (possible_matches != NULL) {
|
|
||||||
+ stop = possible_matches->data;
|
|
||||||
+ g_list_free(possible_matches);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
possible_matches = pe__resource_actions(rsc, next, RSC_PROMOTE, FALSE);
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
index 8002938b5..c0224849f 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
@@ -1259,7 +1259,10 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
enum rsc_role_e role = RSC_ROLE_UNKNOWN;
|
|
||||||
enum rsc_role_e next_role = RSC_ROLE_UNKNOWN;
|
|
||||||
|
|
||||||
- CRM_ASSERT(rsc);
|
|
||||||
+ native_variant_data_t *native_data = NULL;
|
|
||||||
+
|
|
||||||
+ get_native_variant_data(native_data, rsc);
|
|
||||||
+
|
|
||||||
chosen = rsc->allocated_to;
|
|
||||||
next_role = rsc->next_role;
|
|
||||||
if (next_role == RSC_ROLE_UNKNOWN) {
|
|
||||||
@@ -1323,6 +1326,7 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
"(will stop on both nodes)",
|
|
||||||
rsc->id, rsc->partial_migration_source->details->uname,
|
|
||||||
rsc->partial_migration_target->details->uname);
|
|
||||||
+ multiply_active = false;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS);
|
|
||||||
@@ -1345,6 +1349,11 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
allow_migrate = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (!multiply_active) {
|
|
||||||
+ native_data->expected_node = NULL;
|
|
||||||
+ pe__clear_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (pcmk_is_set(rsc->flags, pe_rsc_start_pending)) {
|
|
||||||
pe_rsc_trace(rsc, "Creating start action for %s to represent already pending start",
|
|
||||||
rsc->id);
|
|
||||||
@@ -1995,6 +2004,32 @@ native_expand(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
out->message(out, "rsc-action", rsc, current, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
+/*!
|
|
||||||
+ * \internal
|
|
||||||
+ * \brief Check whether a node is a multiply active resource's expected node
|
|
||||||
+ *
|
|
||||||
+ * \param[in] rsc Resource to check
|
|
||||||
+ * \param[in] node Node to check
|
|
||||||
+ *
|
|
||||||
+ * \return true if \p rsc is multiply active with multiple-active set to
|
|
||||||
+ * stop_unexpected, and \p node is the node where it will remain active
|
|
||||||
+ * \note This assumes that the resource's next role cannot be changed to stopped
|
|
||||||
+ * after this is called, which should be reasonable if status has already
|
|
||||||
+ * been unpacked and resources have been assigned to nodes.
|
|
||||||
+ */
|
|
||||||
+static bool
|
|
||||||
+is_expected_node(const pe_resource_t *rsc, const pe_node_t *node)
|
|
||||||
+{
|
|
||||||
+ native_variant_data_t *native_data = NULL;
|
|
||||||
+
|
|
||||||
+ get_native_variant_data(native_data, rsc);
|
|
||||||
+ return pcmk_all_flags_set(rsc->flags,
|
|
||||||
+ pe_rsc_stop_unexpected|pe_rsc_restarting)
|
|
||||||
+ && (rsc->next_role > RSC_ROLE_STOPPED)
|
|
||||||
+ && (native_data->expected_node != NULL) && (node != NULL)
|
|
||||||
+ && (native_data->expected_node->details == node->details);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
gboolean
|
|
||||||
StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set)
|
|
||||||
{
|
|
||||||
@@ -2006,6 +2041,18 @@ StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set
|
|
||||||
pe_node_t *current = (pe_node_t *) gIter->data;
|
|
||||||
pe_action_t *stop;
|
|
||||||
|
|
||||||
+ if (is_expected_node(rsc, current)) {
|
|
||||||
+ /* We are scheduling restart actions for a multiply active resource
|
|
||||||
+ * with multiple-active=stop_unexpected, and this is where it should
|
|
||||||
+ * not be stopped.
|
|
||||||
+ */
|
|
||||||
+ pe_rsc_trace(rsc,
|
|
||||||
+ "Skipping stop of multiply active resource %s "
|
|
||||||
+ "on expected node %s",
|
|
||||||
+ rsc->id, current->details->uname);
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
if (rsc->partial_migration_target) {
|
|
||||||
if (rsc->partial_migration_target->details == current->details) {
|
|
||||||
pe_rsc_trace(rsc,
|
|
||||||
@@ -2029,6 +2076,17 @@ StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set
|
|
||||||
|
|
||||||
if(rsc->allocated_to == NULL) {
|
|
||||||
pe_action_set_reason(stop, "node availability", TRUE);
|
|
||||||
+ } else if (pcmk_is_set(rsc->flags, pe_rsc_restarting)) {
|
|
||||||
+ native_variant_data_t *native_data = NULL;
|
|
||||||
+
|
|
||||||
+ get_native_variant_data(native_data, rsc);
|
|
||||||
+ if (native_data->expected_node != NULL) {
|
|
||||||
+ /* We are stopping a multiply active resource on a node that is
|
|
||||||
+ * not its expected node, and we are still scheduling restart
|
|
||||||
+ * actions, so the stop is for being multiply active.
|
|
||||||
+ */
|
|
||||||
+ pe_action_set_reason(stop, "being multiply active", TRUE);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pcmk_is_set(rsc->flags, pe_rsc_managed)) {
|
|
||||||
@@ -2071,6 +2129,16 @@ StartRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_se
|
|
||||||
pe__clear_action_flags(start, pe_action_optional);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (is_expected_node(rsc, next)) {
|
|
||||||
+ /* This could be a problem if the start becomes necessary for other
|
|
||||||
+ * reasons later.
|
|
||||||
+ */
|
|
||||||
+ pe_rsc_trace(rsc,
|
|
||||||
+ "Start of multiply active resouce %s "
|
|
||||||
+ "on expected node %s will be a pseudo-action",
|
|
||||||
+ rsc->id, next->details->uname);
|
|
||||||
+ pe__set_action_flags(start, pe_action_pseudo);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
@@ -2084,6 +2152,7 @@ PromoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_
|
|
||||||
|
|
||||||
CRM_ASSERT(rsc);
|
|
||||||
CRM_CHECK(next != NULL, return FALSE);
|
|
||||||
+
|
|
||||||
pe_rsc_trace(rsc, "%s on %s", rsc->id, next->details->uname);
|
|
||||||
|
|
||||||
action_list = pe__resource_actions(rsc, next, RSC_START, TRUE);
|
|
||||||
@@ -2098,7 +2167,19 @@ PromoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_
|
|
||||||
g_list_free(action_list);
|
|
||||||
|
|
||||||
if (runnable) {
|
|
||||||
- promote_action(rsc, next, optional);
|
|
||||||
+ pe_action_t *promote = promote_action(rsc, next, optional);
|
|
||||||
+
|
|
||||||
+ if (is_expected_node(rsc, next)) {
|
|
||||||
+ /* This could be a problem if the promote becomes necessary for
|
|
||||||
+ * other reasons later.
|
|
||||||
+ */
|
|
||||||
+ pe_rsc_trace(rsc,
|
|
||||||
+ "Promotion of multiply active resouce %s "
|
|
||||||
+ "on expected node %s will be a pseudo-action",
|
|
||||||
+ rsc->id, next->details->uname);
|
|
||||||
+ pe__set_action_flags(promote, pe_action_pseudo);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2122,6 +2203,15 @@ DemoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_s
|
|
||||||
GList *gIter = NULL;
|
|
||||||
|
|
||||||
CRM_ASSERT(rsc);
|
|
||||||
+
|
|
||||||
+ if (is_expected_node(rsc, next)) {
|
|
||||||
+ pe_rsc_trace(rsc,
|
|
||||||
+ "Skipping demote of multiply active resource %s "
|
|
||||||
+ "on expected node %s",
|
|
||||||
+ rsc->id, next->details->uname);
|
|
||||||
+ return TRUE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
pe_rsc_trace(rsc, "%s", rsc->id);
|
|
||||||
|
|
||||||
/* CRM_CHECK(rsc->next_role == RSC_ROLE_UNPROMOTED, return FALSE); */
|
|
||||||
diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c
|
|
||||||
index d218f523f..edaa9de48 100644
|
|
||||||
--- a/lib/pengine/unpack.c
|
|
||||||
+++ b/lib/pengine/unpack.c
|
|
||||||
@@ -3974,6 +3974,7 @@ unpack_rsc_op(pe_resource_t *rsc, pe_node_t *node, xmlNode *xml_op,
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
+ pe__update_expected_node(rsc, node, status, rc, target_rc);
|
|
||||||
pe_rsc_trace(rsc, "Resource %s after %s: role=%s, next=%s",
|
|
||||||
rsc->id, task, role2text(rsc->role),
|
|
||||||
role2text(rsc->next_role));
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,495 +0,0 @@
|
|||||||
From 8a0a16c8ed72c74d656664694ebe36b76ff22498 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Wed, 30 Mar 2022 17:14:33 -0500
|
|
||||||
Subject: [PATCH] Test: cts-scheduler: add test for
|
|
||||||
multiple-active=stop_unexpected
|
|
||||||
|
|
||||||
---
|
|
||||||
cts/cts-scheduler.in | 1 +
|
|
||||||
cts/scheduler/dot/stop-unexpected.dot | 40 ++++
|
|
||||||
cts/scheduler/exp/stop-unexpected.exp | 201 ++++++++++++++++++
|
|
||||||
cts/scheduler/scores/stop-unexpected.scores | 17 ++
|
|
||||||
cts/scheduler/summary/stop-unexpected.summary | 41 ++++
|
|
||||||
cts/scheduler/xml/stop-unexpected.xml | 131 ++++++++++++
|
|
||||||
6 files changed, 431 insertions(+)
|
|
||||||
create mode 100644 cts/scheduler/dot/stop-unexpected.dot
|
|
||||||
create mode 100644 cts/scheduler/exp/stop-unexpected.exp
|
|
||||||
create mode 100644 cts/scheduler/scores/stop-unexpected.scores
|
|
||||||
create mode 100644 cts/scheduler/summary/stop-unexpected.summary
|
|
||||||
create mode 100644 cts/scheduler/xml/stop-unexpected.xml
|
|
||||||
|
|
||||||
diff --git a/cts/cts-scheduler.in b/cts/cts-scheduler.in
|
|
||||||
index 3a8aeaca5..8c04687da 100644
|
|
||||||
--- a/cts/cts-scheduler.in
|
|
||||||
+++ b/cts/cts-scheduler.in
|
|
||||||
@@ -273,6 +273,7 @@ TESTS = [
|
|
||||||
[ "rec-rsc-6", "Resource Recover - multiple - restart" ],
|
|
||||||
[ "rec-rsc-7", "Resource Recover - multiple - stop" ],
|
|
||||||
[ "rec-rsc-8", "Resource Recover - multiple - block" ],
|
|
||||||
+ [ "stop-unexpected", "Resource Recover - multiple - stop unexpected" ],
|
|
||||||
[ "rec-rsc-9", "Resource Recover - group/group" ],
|
|
||||||
[ "monitor-recovery", "on-fail=block + resource recovery detected by recurring monitor" ],
|
|
||||||
[ "stop-failure-no-quorum", "Stop failure without quorum" ],
|
|
||||||
diff --git a/cts/scheduler/dot/stop-unexpected.dot b/cts/scheduler/dot/stop-unexpected.dot
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..0f67eec54
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/dot/stop-unexpected.dot
|
|
||||||
@@ -0,0 +1,40 @@
|
|
||||||
+ digraph "g" {
|
|
||||||
+"dgroup_running_0" [ style=bold color="green" fontcolor="orange"]
|
|
||||||
+"dgroup_start_0" -> "dgroup_running_0" [ style = bold]
|
|
||||||
+"dgroup_start_0" -> "dummy2_start_0 node2" [ style = bold]
|
|
||||||
+"dgroup_start_0" -> "dummy3_start_0 node2" [ style = bold]
|
|
||||||
+"dgroup_start_0" -> "dummy_start_0 node2" [ style = bold]
|
|
||||||
+"dgroup_start_0" [ style=bold color="green" fontcolor="orange"]
|
|
||||||
+"dgroup_stop_0" -> "dgroup_stopped_0" [ style = bold]
|
|
||||||
+"dgroup_stop_0" -> "dummy2_stop_0 node2" [ style = bold]
|
|
||||||
+"dgroup_stop_0" -> "dummy3_stop_0 node2" [ style = bold]
|
|
||||||
+"dgroup_stop_0" -> "dummy_stop_0 node3" [ style = bold]
|
|
||||||
+"dgroup_stop_0" [ style=bold color="green" fontcolor="orange"]
|
|
||||||
+"dgroup_stopped_0" -> "dgroup_start_0" [ style = bold]
|
|
||||||
+"dgroup_stopped_0" [ style=bold color="green" fontcolor="orange"]
|
|
||||||
+"dummy2_monitor_10000 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy2_start_0 node2" -> "dgroup_running_0" [ style = bold]
|
|
||||||
+"dummy2_start_0 node2" -> "dummy2_monitor_10000 node2" [ style = bold]
|
|
||||||
+"dummy2_start_0 node2" -> "dummy3_start_0 node2" [ style = bold]
|
|
||||||
+"dummy2_start_0 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy2_stop_0 node2" -> "dgroup_stopped_0" [ style = bold]
|
|
||||||
+"dummy2_stop_0 node2" -> "dummy2_start_0 node2" [ style = bold]
|
|
||||||
+"dummy2_stop_0 node2" -> "dummy_stop_0 node3" [ style = bold]
|
|
||||||
+"dummy2_stop_0 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy3_monitor_10000 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy3_start_0 node2" -> "dgroup_running_0" [ style = bold]
|
|
||||||
+"dummy3_start_0 node2" -> "dummy3_monitor_10000 node2" [ style = bold]
|
|
||||||
+"dummy3_start_0 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy3_stop_0 node2" -> "dgroup_stopped_0" [ style = bold]
|
|
||||||
+"dummy3_stop_0 node2" -> "dummy2_stop_0 node2" [ style = bold]
|
|
||||||
+"dummy3_stop_0 node2" -> "dummy3_start_0 node2" [ style = bold]
|
|
||||||
+"dummy3_stop_0 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy_monitor_10000 node2" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"dummy_start_0 node2" -> "dgroup_running_0" [ style = bold]
|
|
||||||
+"dummy_start_0 node2" -> "dummy2_start_0 node2" [ style = bold]
|
|
||||||
+"dummy_start_0 node2" -> "dummy_monitor_10000 node2" [ style = bold]
|
|
||||||
+"dummy_start_0 node2" [ style=bold color="green" fontcolor="orange"]
|
|
||||||
+"dummy_stop_0 node3" -> "dgroup_stopped_0" [ style = bold]
|
|
||||||
+"dummy_stop_0 node3" -> "dummy_start_0 node2" [ style = bold]
|
|
||||||
+"dummy_stop_0 node3" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+}
|
|
||||||
diff --git a/cts/scheduler/exp/stop-unexpected.exp b/cts/scheduler/exp/stop-unexpected.exp
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..1f94532f7
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/exp/stop-unexpected.exp
|
|
||||||
@@ -0,0 +1,201 @@
|
|
||||||
+<transition_graph cluster-delay="60s" stonith-timeout="90" failed-stop-offset="INFINITY" failed-start-offset="INFINITY" transition_id="0">
|
|
||||||
+ <synapse id="0">
|
|
||||||
+ <action_set>
|
|
||||||
+ <pseudo_event id="15" operation="stopped" operation_key="dgroup_stopped_0">
|
|
||||||
+ <attributes CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </pseudo_event>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="4" operation="stop" operation_key="dummy_stop_0" on_node="node3" on_node_uuid="node3"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="8" operation="stop" operation_key="dummy2_stop_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="10" operation="stop" operation_key="dummy3_stop_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="14" operation="stop" operation_key="dgroup_stop_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="1">
|
|
||||||
+ <action_set>
|
|
||||||
+ <pseudo_event id="14" operation="stop" operation_key="dgroup_stop_0">
|
|
||||||
+ <attributes CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </pseudo_event>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs/>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="2">
|
|
||||||
+ <action_set>
|
|
||||||
+ <pseudo_event id="13" operation="running" operation_key="dgroup_running_0">
|
|
||||||
+ <attributes CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </pseudo_event>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="7" operation="start" operation_key="dummy_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="9" operation="start" operation_key="dummy2_start_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="11" operation="start" operation_key="dummy3_start_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="12" operation="start" operation_key="dgroup_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="3">
|
|
||||||
+ <action_set>
|
|
||||||
+ <pseudo_event id="12" operation="start" operation_key="dgroup_start_0">
|
|
||||||
+ <attributes CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </pseudo_event>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="15" operation="stopped" operation_key="dgroup_stopped_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="4">
|
|
||||||
+ <action_set>
|
|
||||||
+ <pseudo_event id="7" operation="start" operation_key="dummy_start_0">
|
|
||||||
+ <attributes CRM_meta_name="start" CRM_meta_record_pending="false" CRM_meta_timeout="300000" />
|
|
||||||
+ </pseudo_event>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="4" operation="stop" operation_key="dummy_stop_0" on_node="node3" on_node_uuid="node3"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="12" operation="start" operation_key="dgroup_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="5">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="4" operation="stop" operation_key="dummy_stop_0" on_node="node3" on_node_uuid="node3">
|
|
||||||
+ <primitive id="dummy" class="ocf" provider="heartbeat" type="DummyTimeout"/>
|
|
||||||
+ <attributes CRM_meta_name="stop" CRM_meta_on_node="node3" CRM_meta_on_node_uuid="node3" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="8" operation="stop" operation_key="dummy2_stop_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="14" operation="stop" operation_key="dgroup_stop_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="6">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="2" operation="monitor" operation_key="dummy_monitor_10000" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy" class="ocf" provider="heartbeat" type="DummyTimeout"/>
|
|
||||||
+ <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="7" operation="start" operation_key="dummy_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="7">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="9" operation="start" operation_key="dummy2_start_0" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy2" class="ocf" provider="heartbeat" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_name="start" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="7" operation="start" operation_key="dummy_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="8" operation="stop" operation_key="dummy2_stop_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="12" operation="start" operation_key="dgroup_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="8">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="8" operation="stop" operation_key="dummy2_stop_0" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy2" class="ocf" provider="heartbeat" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_name="stop" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="10" operation="stop" operation_key="dummy3_stop_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="14" operation="stop" operation_key="dgroup_stop_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="9">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="3" operation="monitor" operation_key="dummy2_monitor_10000" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy2" class="ocf" provider="heartbeat" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="9" operation="start" operation_key="dummy2_start_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="10">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="11" operation="start" operation_key="dummy3_start_0" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy3" class="ocf" provider="heartbeat" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_name="start" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="9" operation="start" operation_key="dummy2_start_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="10" operation="stop" operation_key="dummy3_stop_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="12" operation="start" operation_key="dgroup_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="11">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="10" operation="stop" operation_key="dummy3_stop_0" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy3" class="ocf" provider="heartbeat" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_name="stop" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="14" operation="stop" operation_key="dgroup_stop_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="12">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="1" operation="monitor" operation_key="dummy3_monitor_10000" on_node="node2" on_node_uuid="node2">
|
|
||||||
+ <primitive id="dummy3" class="ocf" provider="heartbeat" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_on_node="node2" CRM_meta_on_node_uuid="node2" CRM_meta_record_pending="false" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="11" operation="start" operation_key="dummy3_start_0" on_node="node2" on_node_uuid="node2"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+</transition_graph>
|
|
||||||
diff --git a/cts/scheduler/scores/stop-unexpected.scores b/cts/scheduler/scores/stop-unexpected.scores
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..68f98e837
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/scores/stop-unexpected.scores
|
|
||||||
@@ -0,0 +1,17 @@
|
|
||||||
+
|
|
||||||
+pcmk__group_allocate: dgroup allocation score on node2: 0
|
|
||||||
+pcmk__group_allocate: dgroup allocation score on node3: 0
|
|
||||||
+pcmk__group_allocate: dummy allocation score on node2: 0
|
|
||||||
+pcmk__group_allocate: dummy allocation score on node3: 0
|
|
||||||
+pcmk__group_allocate: dummy2 allocation score on node2: 100
|
|
||||||
+pcmk__group_allocate: dummy2 allocation score on node3: 0
|
|
||||||
+pcmk__group_allocate: dummy3 allocation score on node2: 100
|
|
||||||
+pcmk__group_allocate: dummy3 allocation score on node3: 0
|
|
||||||
+pcmk__native_allocate: dummy allocation score on node2: 200
|
|
||||||
+pcmk__native_allocate: dummy allocation score on node3: 0
|
|
||||||
+pcmk__native_allocate: dummy2 allocation score on node2: 200
|
|
||||||
+pcmk__native_allocate: dummy2 allocation score on node3: -INFINITY
|
|
||||||
+pcmk__native_allocate: dummy3 allocation score on node2: 100
|
|
||||||
+pcmk__native_allocate: dummy3 allocation score on node3: -INFINITY
|
|
||||||
+pcmk__native_allocate: st-sbd allocation score on node2: 100
|
|
||||||
+pcmk__native_allocate: st-sbd allocation score on node3: 0
|
|
||||||
diff --git a/cts/scheduler/summary/stop-unexpected.summary b/cts/scheduler/summary/stop-unexpected.summary
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..7c7fc68b6
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/summary/stop-unexpected.summary
|
|
||||||
@@ -0,0 +1,41 @@
|
|
||||||
+Current cluster status:
|
|
||||||
+ * Node List:
|
|
||||||
+ * Online: [ node2 node3 ]
|
|
||||||
+
|
|
||||||
+ * Full List of Resources:
|
|
||||||
+ * st-sbd (stonith:external/sbd): Started node2
|
|
||||||
+ * Resource Group: dgroup:
|
|
||||||
+ * dummy (ocf:heartbeat:DummyTimeout): FAILED [ node2 node3 ]
|
|
||||||
+ * dummy2 (ocf:heartbeat:Dummy): Started node2
|
|
||||||
+ * dummy3 (ocf:heartbeat:Dummy): Started node2
|
|
||||||
+
|
|
||||||
+Transition Summary:
|
|
||||||
+ * Recover dummy ( node2 ) due to being multiply active
|
|
||||||
+ * Restart dummy2 ( node2 ) due to required dummy start
|
|
||||||
+ * Restart dummy3 ( node2 ) due to required dummy2 start
|
|
||||||
+
|
|
||||||
+Executing Cluster Transition:
|
|
||||||
+ * Pseudo action: dgroup_stop_0
|
|
||||||
+ * Resource action: dummy3 stop on node2
|
|
||||||
+ * Resource action: dummy2 stop on node2
|
|
||||||
+ * Resource action: dummy stop on node3
|
|
||||||
+ * Pseudo action: dgroup_stopped_0
|
|
||||||
+ * Pseudo action: dgroup_start_0
|
|
||||||
+ * Pseudo action: dummy_start_0
|
|
||||||
+ * Resource action: dummy monitor=10000 on node2
|
|
||||||
+ * Resource action: dummy2 start on node2
|
|
||||||
+ * Resource action: dummy2 monitor=10000 on node2
|
|
||||||
+ * Resource action: dummy3 start on node2
|
|
||||||
+ * Resource action: dummy3 monitor=10000 on node2
|
|
||||||
+ * Pseudo action: dgroup_running_0
|
|
||||||
+
|
|
||||||
+Revised Cluster Status:
|
|
||||||
+ * Node List:
|
|
||||||
+ * Online: [ node2 node3 ]
|
|
||||||
+
|
|
||||||
+ * Full List of Resources:
|
|
||||||
+ * st-sbd (stonith:external/sbd): Started node2
|
|
||||||
+ * Resource Group: dgroup:
|
|
||||||
+ * dummy (ocf:heartbeat:DummyTimeout): Started node2
|
|
||||||
+ * dummy2 (ocf:heartbeat:Dummy): Started node2
|
|
||||||
+ * dummy3 (ocf:heartbeat:Dummy): Started node2
|
|
||||||
diff --git a/cts/scheduler/xml/stop-unexpected.xml b/cts/scheduler/xml/stop-unexpected.xml
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..6e61aeba3
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/xml/stop-unexpected.xml
|
|
||||||
@@ -0,0 +1,131 @@
|
|
||||||
+<cib epoch="631" num_updates="25" admin_epoch="0" validate-with="pacemaker-3.0" crm_feature_set="3.0.8" have-quorum="1" cib-last-written="Thu Aug 20 11:44:27 2015" update-origin="node2" update-client="cibadmin" update-user="root" dc-uuid="node2">
|
|
||||||
+ <configuration>
|
|
||||||
+ <crm_config>
|
|
||||||
+ <cluster_property_set id="cib-bootstrap-options">
|
|
||||||
+ <nvpair name="dc-version" value="1.1.11-3ca8c3b" id="cib-bootstrap-options-dc-version"/>
|
|
||||||
+ <nvpair name="cluster-infrastructure" value="corosync" id="cib-bootstrap-options-cluster-infrastructure"/>
|
|
||||||
+ <nvpair name="node-action-limit" value="2" id="cib-bootstrap-options-node-action-limit"/>
|
|
||||||
+ <nvpair name="no-quorum-policy" value="ignore" id="cib-bootstrap-options-no-quorum-policy"/>
|
|
||||||
+ <nvpair name="stonith-enabled" value="false" id="cib-bootstrap-options-stonith-enabled"/>
|
|
||||||
+ <nvpair name="stonith-timeout" value="90" id="cib-bootstrap-options-stonith-timeout"/>
|
|
||||||
+ <nvpair name="last-lrm-refresh" value="1439556204" id="cib-bootstrap-options-last-lrm-refresh"/>
|
|
||||||
+ </cluster_property_set>
|
|
||||||
+ </crm_config>
|
|
||||||
+ <nodes>
|
|
||||||
+ <node uname="node2" id="node2">
|
|
||||||
+ <instance_attributes id="nodes-node2">
|
|
||||||
+ <nvpair id="nodes-node2-standby" name="standby" value="off"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ </node>
|
|
||||||
+ <node id="node3" uname="node3">
|
|
||||||
+ <instance_attributes id="nodes-node3">
|
|
||||||
+ <nvpair id="nodes-node3-standby" name="standby" value="off"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ </node>
|
|
||||||
+ </nodes>
|
|
||||||
+ <resources>
|
|
||||||
+ <primitive id="st-sbd" class="stonith" type="external/sbd"/>
|
|
||||||
+ <group id="dgroup">
|
|
||||||
+ <meta_attributes id="dgroup-meta_attributes">
|
|
||||||
+ <nvpair name="multiple-active" value="stop_unexpected" id="dgroup-meta_attributes-multiple-active"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ <primitive id="dummy" class="ocf" provider="heartbeat" type="DummyTimeout">
|
|
||||||
+ <operations>
|
|
||||||
+ <op name="monitor" interval="10s" timeout="20" id="dummy-monitor-10s"/>
|
|
||||||
+ <op name="start" timeout="300s" interval="0" id="dummy-start-0"/>
|
|
||||||
+ <op name="stop" timeout="20s" interval="0" id="dummy-stop-0"/>
|
|
||||||
+ </operations>
|
|
||||||
+ <meta_attributes id="dummy-meta_attributes">
|
|
||||||
+ <nvpair name="target-role" value="Started" id="dummy-meta_attributes-target-role"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ </primitive>
|
|
||||||
+ <primitive id="dummy2" class="ocf" provider="heartbeat" type="Dummy">
|
|
||||||
+ <operations>
|
|
||||||
+ <op name="monitor" interval="10s" timeout="20" id="dummy2-monitor-10s"/>
|
|
||||||
+ <op name="start" timeout="20s" interval="0" id="dummy2-start-0"/>
|
|
||||||
+ <op name="stop" timeout="20s" interval="0" id="dummy2-stop-0"/>
|
|
||||||
+ </operations>
|
|
||||||
+ <meta_attributes id="dummy2-meta_attributes">
|
|
||||||
+ <nvpair name="target-role" value="Started" id="dummy2-meta_attributes-target-role"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ </primitive>
|
|
||||||
+ <primitive id="dummy3" class="ocf" provider="heartbeat" type="Dummy">
|
|
||||||
+ <operations>
|
|
||||||
+ <op name="monitor" interval="10s" timeout="20" id="dummy3-monitor-10s"/>
|
|
||||||
+ <op name="start" timeout="20s" interval="0" id="dummy3-start-0"/>
|
|
||||||
+ <op name="stop" timeout="20s" interval="0" id="dummy3-stop-0"/>
|
|
||||||
+ </operations>
|
|
||||||
+ <meta_attributes id="dummy3-meta_attributes">
|
|
||||||
+ <nvpair name="target-role" value="Started" id="dummy3-meta_attributes-target-role"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ </primitive>
|
|
||||||
+ </group>
|
|
||||||
+ </resources>
|
|
||||||
+ <constraints/>
|
|
||||||
+ <op_defaults>
|
|
||||||
+ <meta_attributes id="op_defaults-options">
|
|
||||||
+ <nvpair id="op_defaults-options-record-pending" name="record-pending" value="false"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ </op_defaults>
|
|
||||||
+ <rsc_defaults>
|
|
||||||
+ <meta_attributes id="rsc_defaults-options">
|
|
||||||
+ <nvpair name="resource-stickiness" value="100" id="rsc_defaults-options-resource-stickiness"/>
|
|
||||||
+ <nvpair name="migration-threshold" value="100" id="rsc_defaults-options-migration-threshold"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ </rsc_defaults>
|
|
||||||
+ </configuration>
|
|
||||||
+ <status>
|
|
||||||
+ <node_state id="node2" uname="node2" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="node2">
|
|
||||||
+ <instance_attributes id="status-node2">
|
|
||||||
+ <nvpair id="status-node2-shutdown" name="shutdown" value="0"/>
|
|
||||||
+ <nvpair id="status-node2-probe_complete" name="probe_complete" value="true"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="node2">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="dummy3" type="Dummy" class="ocf" provider="heartbeat">
|
|
||||||
+ <lrm_rsc_op id="dummy3_last_0" operation_key="dummy3_start_0" operation="start" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="13:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;13:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="24" rc-code="0" op-status="0" interval="0" last-run="1440063239" last-rc-change="1440063239" exec-time="6" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ <lrm_rsc_op id="dummy3_monitor_10000" operation_key="dummy3_monitor_10000" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="14:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;14:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="25" rc-code="0" op-status="0" interval="10000" last-rc-change="1440063239" exec-time="5" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="st-sbd" type="external/sbd" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="st-sbd_last_0" operation_key="st-sbd_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.8" transition-key="10:6:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;10:6:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="27" rc-code="0" op-status="0" interval="0" last-run="1440064019" last-rc-change="1440064019" exec-time="1213" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="dummy" type="DummyTimeout" class="ocf" provider="heartbeat">
|
|
||||||
+ <lrm_rsc_op id="dummy_last_0" operation_key="dummy_start_0" operation="start" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="9:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;9:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="20" rc-code="0" op-status="0" interval="0" last-run="1440063237" last-rc-change="1440063237" exec-time="1009" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ <lrm_rsc_op id="dummy_monitor_10000" operation_key="dummy_monitor_10000" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="10:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;10:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="21" rc-code="0" op-status="0" interval="10000" last-rc-change="1440063238" exec-time="1010" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="dummy2" type="Dummy" class="ocf" provider="heartbeat">
|
|
||||||
+ <lrm_rsc_op id="dummy2_last_0" operation_key="dummy2_start_0" operation="start" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="11:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;11:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="22" rc-code="0" op-status="0" interval="0" last-run="1440063239" last-rc-change="1440063239" exec-time="5" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ <lrm_rsc_op id="dummy2_monitor_10000" operation_key="dummy2_monitor_10000" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="12:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;12:1:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="23" rc-code="0" op-status="0" interval="10000" last-rc-change="1440063239" exec-time="5" queue-time="0" op-digest="4811cef7f7f94e3a35a70be7916cb2fd"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ <node_state id="node3" uname="node3" crmd="online" crm-debug-origin="do_update_resource" in_ccm="true" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="node3">
|
|
||||||
+ <instance_attributes id="status-node3">
|
|
||||||
+ <nvpair id="status-node3-shutdown" name="shutdown" value="0"/>
|
|
||||||
+ <nvpair id="status-node3-probe_complete" name="probe_complete" value="true"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="node3">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="dummy3" type="Dummy" class="ocf" provider="heartbeat">
|
|
||||||
+ <lrm_rsc_op id="dummy3_last_0" operation_key="dummy3_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="11:2:7:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:7;11:2:7:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="18" rc-code="7" op-status="0" interval="0" last-run="1440063820" last-rc-change="1440063820" exec-time="7" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="st-sbd" type="external/sbd" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="st-sbd_last_0" operation_key="st-sbd_stop_0" operation="stop" crm-debug-origin="do_update_resource" crm_feature_set="3.0.8" transition-key="9:6:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:0;9:6:0:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="21" rc-code="0" op-status="0" interval="0" last-run="1440064019" last-rc-change="1440064019" exec-time="1" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="dummy" type="DummyTimeout" class="ocf" provider="heartbeat">
|
|
||||||
+ <lrm_rsc_op id="dummy_last_0" operation_key="dummy_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.8" transition-key="5:0:0:a5e85e43-f35a-4f75-8e15-f0ddc8d81812" transition-magic="0:7;5:0:0:a5e85e43-f35a-4f75-8e15-f0ddc8d81812" call-id="20" rc-code="7" op-status="0" interval="0" last-run="1440063984" last-rc-change="1440063984" exec-time="179014" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ <lrm_rsc_op id="dummy_last_failure_0" operation_key="dummy_start_0" operation="start" crm-debug-origin="do_update_resource" crm_feature_set="3.0.8" transition-key="5:0:0:a5e85e43-f35a-4f75-8e15-f0ddc8d81812" transition-magic="0:7;5:0:0:a5e85e43-f35a-4f75-8e15-f0ddc8d81812" call-id="20" rc-code="7" op-status="0" interval="0" last-run="1440063984" last-rc-change="1440063984" exec-time="179014" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="dummy2" type="Dummy" class="ocf" provider="heartbeat">
|
|
||||||
+ <lrm_rsc_op id="dummy2_last_0" operation_key="dummy2_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.0.8" transition-key="10:2:7:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" transition-magic="0:7;10:2:7:b78eae54-472e-4e90-a3c5-ec4b25a6d8cf" call-id="14" rc-code="7" op-status="0" interval="0" last-run="1440063820" last-rc-change="1440063820" exec-time="11" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ </status>
|
|
||||||
+</cib>
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -1,589 +0,0 @@
|
|||||||
From 4a5dcc5210160f7d167bc68142635c1b5a6d4af2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 22 Apr 2022 10:47:29 -0500
|
|
||||||
Subject: [PATCH 1/3] Fix: scheduler: make multiple-active="stop_unexpected"
|
|
||||||
actually work
|
|
||||||
|
|
||||||
The previous implementation covered the scenario in the regression test and not
|
|
||||||
much else. It unnecessarily added an expected_node member to the native variant
|
|
||||||
data, when the resource's allocated_to is sufficient to know the expected node.
|
|
||||||
---
|
|
||||||
lib/pacemaker/pcmk_sched_native.c | 45 +++++++++++++++----------------
|
|
||||||
lib/pengine/unpack.c | 1 -
|
|
||||||
2 files changed, 22 insertions(+), 24 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
index c0224849f..a1a51721e 100644
|
|
||||||
--- a/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
+++ b/lib/pacemaker/pcmk_sched_native.c
|
|
||||||
@@ -1250,7 +1250,7 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
gboolean need_stop = FALSE;
|
|
||||||
bool need_promote = FALSE;
|
|
||||||
gboolean is_moving = FALSE;
|
|
||||||
- gboolean allow_migrate = pcmk_is_set(rsc->flags, pe_rsc_allow_migrate)? TRUE : FALSE;
|
|
||||||
+ gboolean allow_migrate = FALSE;
|
|
||||||
|
|
||||||
GList *gIter = NULL;
|
|
||||||
unsigned int num_all_active = 0;
|
|
||||||
@@ -1259,9 +1259,8 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
enum rsc_role_e role = RSC_ROLE_UNKNOWN;
|
|
||||||
enum rsc_role_e next_role = RSC_ROLE_UNKNOWN;
|
|
||||||
|
|
||||||
- native_variant_data_t *native_data = NULL;
|
|
||||||
-
|
|
||||||
- get_native_variant_data(native_data, rsc);
|
|
||||||
+ CRM_ASSERT(rsc != NULL);
|
|
||||||
+ allow_migrate = pcmk_is_set(rsc->flags, pe_rsc_allow_migrate)? TRUE : FALSE;
|
|
||||||
|
|
||||||
chosen = rsc->allocated_to;
|
|
||||||
next_role = rsc->next_role;
|
|
||||||
@@ -1338,8 +1337,16 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
crm_notice("See https://wiki.clusterlabs.org/wiki/FAQ#Resource_is_Too_Active for more information");
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (rsc->recovery_type == recovery_stop_start) {
|
|
||||||
- need_stop = TRUE;
|
|
||||||
+ switch (rsc->recovery_type) {
|
|
||||||
+ case recovery_stop_start:
|
|
||||||
+ need_stop = TRUE;
|
|
||||||
+ break;
|
|
||||||
+ case recovery_stop_unexpected:
|
|
||||||
+ need_stop = TRUE; // StopRsc() will skip expected node
|
|
||||||
+ pe__set_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If by chance a partial migration is in process, but the migration
|
|
||||||
@@ -1350,7 +1357,6 @@ native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!multiply_active) {
|
|
||||||
- native_data->expected_node = NULL;
|
|
||||||
pe__clear_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -2020,14 +2026,11 @@ native_expand(pe_resource_t * rsc, pe_working_set_t * data_set)
|
|
||||||
static bool
|
|
||||||
is_expected_node(const pe_resource_t *rsc, const pe_node_t *node)
|
|
||||||
{
|
|
||||||
- native_variant_data_t *native_data = NULL;
|
|
||||||
-
|
|
||||||
- get_native_variant_data(native_data, rsc);
|
|
||||||
return pcmk_all_flags_set(rsc->flags,
|
|
||||||
pe_rsc_stop_unexpected|pe_rsc_restarting)
|
|
||||||
&& (rsc->next_role > RSC_ROLE_STOPPED)
|
|
||||||
- && (native_data->expected_node != NULL) && (node != NULL)
|
|
||||||
- && (native_data->expected_node->details == node->details);
|
|
||||||
+ && (rsc->allocated_to != NULL) && (node != NULL)
|
|
||||||
+ && (rsc->allocated_to->details == node->details);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
@@ -2076,17 +2079,13 @@ StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set
|
|
||||||
|
|
||||||
if(rsc->allocated_to == NULL) {
|
|
||||||
pe_action_set_reason(stop, "node availability", TRUE);
|
|
||||||
- } else if (pcmk_is_set(rsc->flags, pe_rsc_restarting)) {
|
|
||||||
- native_variant_data_t *native_data = NULL;
|
|
||||||
-
|
|
||||||
- get_native_variant_data(native_data, rsc);
|
|
||||||
- if (native_data->expected_node != NULL) {
|
|
||||||
- /* We are stopping a multiply active resource on a node that is
|
|
||||||
- * not its expected node, and we are still scheduling restart
|
|
||||||
- * actions, so the stop is for being multiply active.
|
|
||||||
- */
|
|
||||||
- pe_action_set_reason(stop, "being multiply active", TRUE);
|
|
||||||
- }
|
|
||||||
+ } else if (pcmk_all_flags_set(rsc->flags, pe_rsc_restarting
|
|
||||||
+ |pe_rsc_stop_unexpected)) {
|
|
||||||
+ /* We are stopping a multiply active resource on a node that is
|
|
||||||
+ * not its expected node, and we are still scheduling restart
|
|
||||||
+ * actions, so the stop is for being multiply active.
|
|
||||||
+ */
|
|
||||||
+ pe_action_set_reason(stop, "being multiply active", TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pcmk_is_set(rsc->flags, pe_rsc_managed)) {
|
|
||||||
diff --git a/lib/pengine/unpack.c b/lib/pengine/unpack.c
|
|
||||||
index 17dea0d7a..426022013 100644
|
|
||||||
--- a/lib/pengine/unpack.c
|
|
||||||
+++ b/lib/pengine/unpack.c
|
|
||||||
@@ -3945,7 +3945,6 @@ unpack_rsc_op(pe_resource_t *rsc, pe_node_t *node, xmlNode *xml_op,
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
- pe__update_expected_node(rsc, node, status, rc, target_rc);
|
|
||||||
pe_rsc_trace(rsc, "Resource %s after %s: role=%s, next=%s",
|
|
||||||
rsc->id, task, role2text(rsc->role),
|
|
||||||
role2text(rsc->next_role));
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 703d3a09bce389afb4e095e1ac7af29eb5edd189 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 22 Apr 2022 14:02:34 -0500
|
|
||||||
Subject: [PATCH 2/3] Test: scheduler: add a second regression test for
|
|
||||||
multiple-active=stop_unexpected
|
|
||||||
|
|
||||||
---
|
|
||||||
cts/cts-scheduler.in | 3 +-
|
|
||||||
cts/scheduler/dot/stop-unexpected-2.dot | 7 +
|
|
||||||
cts/scheduler/exp/stop-unexpected-2.exp | 36 ++++
|
|
||||||
cts/scheduler/scores/stop-unexpected-2.scores | 21 ++
|
|
||||||
.../summary/stop-unexpected-2.summary | 29 +++
|
|
||||||
cts/scheduler/xml/stop-unexpected-2.xml | 204 ++++++++++++++++++
|
|
||||||
6 files changed, 299 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100644 cts/scheduler/dot/stop-unexpected-2.dot
|
|
||||||
create mode 100644 cts/scheduler/exp/stop-unexpected-2.exp
|
|
||||||
create mode 100644 cts/scheduler/scores/stop-unexpected-2.scores
|
|
||||||
create mode 100644 cts/scheduler/summary/stop-unexpected-2.summary
|
|
||||||
create mode 100644 cts/scheduler/xml/stop-unexpected-2.xml
|
|
||||||
|
|
||||||
diff --git a/cts/cts-scheduler.in b/cts/cts-scheduler.in
|
|
||||||
index 8c04687da..7fc76cce4 100644
|
|
||||||
--- a/cts/cts-scheduler.in
|
|
||||||
+++ b/cts/cts-scheduler.in
|
|
||||||
@@ -273,8 +273,9 @@ TESTS = [
|
|
||||||
[ "rec-rsc-6", "Resource Recover - multiple - restart" ],
|
|
||||||
[ "rec-rsc-7", "Resource Recover - multiple - stop" ],
|
|
||||||
[ "rec-rsc-8", "Resource Recover - multiple - block" ],
|
|
||||||
- [ "stop-unexpected", "Resource Recover - multiple - stop unexpected" ],
|
|
||||||
[ "rec-rsc-9", "Resource Recover - group/group" ],
|
|
||||||
+ [ "stop-unexpected", "Recover multiply active group with stop_unexpected" ],
|
|
||||||
+ [ "stop-unexpected-2", "Resource multiply active primitve with stop_unexpected" ],
|
|
||||||
[ "monitor-recovery", "on-fail=block + resource recovery detected by recurring monitor" ],
|
|
||||||
[ "stop-failure-no-quorum", "Stop failure without quorum" ],
|
|
||||||
[ "stop-failure-no-fencing", "Stop failure without fencing available" ],
|
|
||||||
diff --git a/cts/scheduler/dot/stop-unexpected-2.dot b/cts/scheduler/dot/stop-unexpected-2.dot
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..cdaebf551
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/dot/stop-unexpected-2.dot
|
|
||||||
@@ -0,0 +1,7 @@
|
|
||||||
+ digraph "g" {
|
|
||||||
+"test_monitor_10000 rhel8-4" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+"test_start_0 rhel8-4" -> "test_monitor_10000 rhel8-4" [ style = bold]
|
|
||||||
+"test_start_0 rhel8-4" [ style=bold color="green" fontcolor="orange"]
|
|
||||||
+"test_stop_0 rhel8-3" -> "test_start_0 rhel8-4" [ style = bold]
|
|
||||||
+"test_stop_0 rhel8-3" [ style=bold color="green" fontcolor="black"]
|
|
||||||
+}
|
|
||||||
diff --git a/cts/scheduler/exp/stop-unexpected-2.exp b/cts/scheduler/exp/stop-unexpected-2.exp
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..258053c08
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/exp/stop-unexpected-2.exp
|
|
||||||
@@ -0,0 +1,36 @@
|
|
||||||
+<transition_graph cluster-delay="60s" stonith-timeout="60s" failed-stop-offset="INFINITY" failed-start-offset="1" transition_id="0">
|
|
||||||
+ <synapse id="0">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="10" operation="monitor" operation_key="test_monitor_10000" on_node="rhel8-4" on_node_uuid="4">
|
|
||||||
+ <primitive id="test" class="ocf" provider="pacemaker" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_interval="10000" CRM_meta_name="monitor" CRM_meta_on_node="rhel8-4" CRM_meta_on_node_uuid="4" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <pseudo_event id="9" operation="start" operation_key="test_start_0"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="1">
|
|
||||||
+ <action_set>
|
|
||||||
+ <pseudo_event id="9" operation="start" operation_key="test_start_0">
|
|
||||||
+ <attributes CRM_meta_name="start" CRM_meta_timeout="20000" />
|
|
||||||
+ </pseudo_event>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs>
|
|
||||||
+ <trigger>
|
|
||||||
+ <rsc_op id="8" operation="stop" operation_key="test_stop_0" on_node="rhel8-3" on_node_uuid="3"/>
|
|
||||||
+ </trigger>
|
|
||||||
+ </inputs>
|
|
||||||
+ </synapse>
|
|
||||||
+ <synapse id="2">
|
|
||||||
+ <action_set>
|
|
||||||
+ <rsc_op id="8" operation="stop" operation_key="test_stop_0" on_node="rhel8-3" on_node_uuid="3">
|
|
||||||
+ <primitive id="test" class="ocf" provider="pacemaker" type="Dummy"/>
|
|
||||||
+ <attributes CRM_meta_name="stop" CRM_meta_on_node="rhel8-3" CRM_meta_on_node_uuid="3" CRM_meta_timeout="20000" />
|
|
||||||
+ </rsc_op>
|
|
||||||
+ </action_set>
|
|
||||||
+ <inputs/>
|
|
||||||
+ </synapse>
|
|
||||||
+</transition_graph>
|
|
||||||
diff --git a/cts/scheduler/scores/stop-unexpected-2.scores b/cts/scheduler/scores/stop-unexpected-2.scores
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..0eb549f5e
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/scores/stop-unexpected-2.scores
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+
|
|
||||||
+pcmk__native_allocate: Fencing allocation score on rhel8-1: 0
|
|
||||||
+pcmk__native_allocate: Fencing allocation score on rhel8-2: 0
|
|
||||||
+pcmk__native_allocate: Fencing allocation score on rhel8-3: 0
|
|
||||||
+pcmk__native_allocate: Fencing allocation score on rhel8-4: 0
|
|
||||||
+pcmk__native_allocate: Fencing allocation score on rhel8-5: 0
|
|
||||||
+pcmk__native_allocate: FencingFail allocation score on rhel8-1: 0
|
|
||||||
+pcmk__native_allocate: FencingFail allocation score on rhel8-2: 0
|
|
||||||
+pcmk__native_allocate: FencingFail allocation score on rhel8-3: 0
|
|
||||||
+pcmk__native_allocate: FencingFail allocation score on rhel8-4: 0
|
|
||||||
+pcmk__native_allocate: FencingFail allocation score on rhel8-5: 0
|
|
||||||
+pcmk__native_allocate: FencingPass allocation score on rhel8-1: 0
|
|
||||||
+pcmk__native_allocate: FencingPass allocation score on rhel8-2: 0
|
|
||||||
+pcmk__native_allocate: FencingPass allocation score on rhel8-3: 0
|
|
||||||
+pcmk__native_allocate: FencingPass allocation score on rhel8-4: 0
|
|
||||||
+pcmk__native_allocate: FencingPass allocation score on rhel8-5: 0
|
|
||||||
+pcmk__native_allocate: test allocation score on rhel8-1: 0
|
|
||||||
+pcmk__native_allocate: test allocation score on rhel8-2: 0
|
|
||||||
+pcmk__native_allocate: test allocation score on rhel8-3: 0
|
|
||||||
+pcmk__native_allocate: test allocation score on rhel8-4: 0
|
|
||||||
+pcmk__native_allocate: test allocation score on rhel8-5: 0
|
|
||||||
diff --git a/cts/scheduler/summary/stop-unexpected-2.summary b/cts/scheduler/summary/stop-unexpected-2.summary
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..d6b0c15dc
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/summary/stop-unexpected-2.summary
|
|
||||||
@@ -0,0 +1,29 @@
|
|
||||||
+Using the original execution date of: 2022-04-22 14:15:37Z
|
|
||||||
+Current cluster status:
|
|
||||||
+ * Node List:
|
|
||||||
+ * Online: [ rhel8-1 rhel8-2 rhel8-3 rhel8-4 rhel8-5 ]
|
|
||||||
+
|
|
||||||
+ * Full List of Resources:
|
|
||||||
+ * Fencing (stonith:fence_xvm): Started rhel8-1
|
|
||||||
+ * FencingPass (stonith:fence_dummy): Started rhel8-2
|
|
||||||
+ * FencingFail (stonith:fence_dummy): Started rhel8-3
|
|
||||||
+ * test (ocf:pacemaker:Dummy): Started [ rhel8-4 rhel8-3 ]
|
|
||||||
+
|
|
||||||
+Transition Summary:
|
|
||||||
+ * Restart test ( rhel8-4 )
|
|
||||||
+
|
|
||||||
+Executing Cluster Transition:
|
|
||||||
+ * Resource action: test stop on rhel8-3
|
|
||||||
+ * Pseudo action: test_start_0
|
|
||||||
+ * Resource action: test monitor=10000 on rhel8-4
|
|
||||||
+Using the original execution date of: 2022-04-22 14:15:37Z
|
|
||||||
+
|
|
||||||
+Revised Cluster Status:
|
|
||||||
+ * Node List:
|
|
||||||
+ * Online: [ rhel8-1 rhel8-2 rhel8-3 rhel8-4 rhel8-5 ]
|
|
||||||
+
|
|
||||||
+ * Full List of Resources:
|
|
||||||
+ * Fencing (stonith:fence_xvm): Started rhel8-1
|
|
||||||
+ * FencingPass (stonith:fence_dummy): Started rhel8-2
|
|
||||||
+ * FencingFail (stonith:fence_dummy): Started rhel8-3
|
|
||||||
+ * test (ocf:pacemaker:Dummy): Started rhel8-4
|
|
||||||
diff --git a/cts/scheduler/xml/stop-unexpected-2.xml b/cts/scheduler/xml/stop-unexpected-2.xml
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..e103629e9
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/cts/scheduler/xml/stop-unexpected-2.xml
|
|
||||||
@@ -0,0 +1,204 @@
|
|
||||||
+<cib crm_feature_set="3.13.0" validate-with="pacemaker-3.7" epoch="59" num_updates="14" admin_epoch="0" cib-last-written="Fri Apr 22 09:15:36 2022" update-origin="rhel8-1" update-client="crmd" update-user="hacluster" have-quorum="1" dc-uuid="2" execution-date="1650636937">
|
|
||||||
+ <configuration>
|
|
||||||
+ <crm_config>
|
|
||||||
+ <cluster_property_set id="cib-bootstrap-options">
|
|
||||||
+ <nvpair id="cts-stonith-enabled" name="stonith-enabled" value="1"/>
|
|
||||||
+ <nvpair id="cts-start-failure-is-fatal" name="start-failure-is-fatal" value="false"/>
|
|
||||||
+ <nvpair id="cts-pe-input-series-max" name="pe-input-series-max" value="5000"/>
|
|
||||||
+ <nvpair id="cts-shutdown-escalation" name="shutdown-escalation" value="5min"/>
|
|
||||||
+ <nvpair id="cts-batch-limit" name="batch-limit" value="10"/>
|
|
||||||
+ <nvpair id="cts-dc-deadtime" name="dc-deadtime" value="5s"/>
|
|
||||||
+ <nvpair id="cts-no-quorum-policy" name="no-quorum-policy" value="stop"/>
|
|
||||||
+ <nvpair id="cib-bootstrap-options-have-watchdog" name="have-watchdog" value="false"/>
|
|
||||||
+ <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="2.1.2-4.el8_6.1-ada5c3b36e2"/>
|
|
||||||
+ <nvpair id="cib-bootstrap-options-cluster-infrastructure" name="cluster-infrastructure" value="corosync"/>
|
|
||||||
+ <nvpair id="cib-bootstrap-options-cluster-name" name="cluster-name" value="rhel8-lab"/>
|
|
||||||
+ <nvpair id="cib-bootstrap-options-last-lrm-refresh" name="last-lrm-refresh" value="1650636936"/>
|
|
||||||
+ </cluster_property_set>
|
|
||||||
+ </crm_config>
|
|
||||||
+ <nodes>
|
|
||||||
+ <node id="1" uname="rhel8-1"/>
|
|
||||||
+ <node id="3" uname="rhel8-3"/>
|
|
||||||
+ <node id="4" uname="rhel8-4"/>
|
|
||||||
+ <node id="5" uname="rhel8-5"/>
|
|
||||||
+ <node id="2" uname="rhel8-2"/>
|
|
||||||
+ </nodes>
|
|
||||||
+ <resources>
|
|
||||||
+ <primitive class="stonith" id="Fencing" type="fence_xvm">
|
|
||||||
+ <meta_attributes id="Fencing-meta">
|
|
||||||
+ <nvpair id="Fencing-migration-threshold" name="migration-threshold" value="5"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ <instance_attributes id="Fencing-params">
|
|
||||||
+ <nvpair id="Fencing-pcmk_host_map" name="pcmk_host_map" value="remote-rhel8-1:rhel8-1;remote-rhel8-2:rhel8-2;remote-rhel8-3:rhel8-3;remote-rhel8-4:rhel8-4;remote-rhel8-5:rhel8-5;"/>
|
|
||||||
+ <nvpair id="Fencing-key_file" name="key_file" value="/etc/pacemaker/fence_xvm.key"/>
|
|
||||||
+ <nvpair id="Fencing-multicast_address" name="multicast_address" value="239.255.100.100"/>
|
|
||||||
+ <nvpair id="Fencing-pcmk_host_list" name="pcmk_host_list" value="rhel8-1 remote-rhel8-1 rhel8-2 remote-rhel8-2 rhel8-3 remote-rhel8-3 rhel8-4 remote-rhel8-4 rhel8-5 remote-rhel8-5"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ <operations>
|
|
||||||
+ <op id="Fencing-monitor-120s" interval="120s" name="monitor" timeout="120s"/>
|
|
||||||
+ <op id="Fencing-stop-0" interval="0" name="stop" timeout="60s"/>
|
|
||||||
+ <op id="Fencing-start-0" interval="0" name="start" timeout="60s"/>
|
|
||||||
+ </operations>
|
|
||||||
+ </primitive>
|
|
||||||
+ <primitive class="stonith" id="FencingPass" type="fence_dummy">
|
|
||||||
+ <instance_attributes id="FencingPass-params">
|
|
||||||
+ <nvpair id="FencingPass-pcmk_host_list" name="pcmk_host_list" value="rhel8-4 remote-rhel8-4 rhel8-5 remote-rhel8-5"/>
|
|
||||||
+ <nvpair id="FencingPass-random_sleep_range" name="random_sleep_range" value="30"/>
|
|
||||||
+ <nvpair id="FencingPass-mode" name="mode" value="pass"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ </primitive>
|
|
||||||
+ <primitive class="stonith" id="FencingFail" type="fence_dummy">
|
|
||||||
+ <instance_attributes id="FencingFail-params">
|
|
||||||
+ <nvpair id="FencingFail-pcmk_host_list" name="pcmk_host_list" value="rhel8-2 remote-rhel8-2"/>
|
|
||||||
+ <nvpair id="FencingFail-random_sleep_range" name="random_sleep_range" value="30"/>
|
|
||||||
+ <nvpair id="FencingFail-mode" name="mode" value="fail"/>
|
|
||||||
+ </instance_attributes>
|
|
||||||
+ </primitive>
|
|
||||||
+ <primitive class="ocf" id="test" provider="pacemaker" type="Dummy">
|
|
||||||
+ <meta_attributes id="test-meta_attributes">
|
|
||||||
+ <nvpair id="test-meta_attributes-multiple-active" name="multiple-active" value="stop_unexpected"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ <operations>
|
|
||||||
+ <op id="test-migrate_from-interval-0s" interval="0s" name="migrate_from" timeout="20s"/>
|
|
||||||
+ <op id="test-migrate_to-interval-0s" interval="0s" name="migrate_to" timeout="20s"/>
|
|
||||||
+ <op id="test-monitor-interval-10s" interval="10s" name="monitor" timeout="20s"/>
|
|
||||||
+ <op id="test-reload-interval-0s" interval="0s" name="reload" timeout="20s"/>
|
|
||||||
+ <op id="test-reload-agent-interval-0s" interval="0s" name="reload-agent" timeout="20s"/>
|
|
||||||
+ <op id="test-start-interval-0s" interval="0s" name="start" timeout="20s"/>
|
|
||||||
+ <op id="test-stop-interval-0s" interval="0s" name="stop" timeout="20s"/>
|
|
||||||
+ </operations>
|
|
||||||
+ </primitive>
|
|
||||||
+ </resources>
|
|
||||||
+ <constraints/>
|
|
||||||
+ <fencing-topology>
|
|
||||||
+ <fencing-level devices="FencingFail" id="cts-rhel8-2.1" index="1" target="rhel8-2"/>
|
|
||||||
+ <fencing-level devices="Fencing" id="cts-rhel8-2.2" index="2" target="rhel8-2"/>
|
|
||||||
+ <fencing-level devices="FencingFail" id="cts-remote-rhel8-2.1" index="1" target="remote-rhel8-2"/>
|
|
||||||
+ <fencing-level devices="Fencing" id="cts-remote-rhel8-2.2" index="2" target="remote-rhel8-2"/>
|
|
||||||
+ <fencing-level devices="FencingPass,Fencing" id="cts-rhel8-4.1" index="1" target="rhel8-4"/>
|
|
||||||
+ <fencing-level devices="FencingPass,Fencing" id="cts-remote-rhel8-4.1" index="1" target="remote-rhel8-4"/>
|
|
||||||
+ <fencing-level devices="FencingPass,Fencing" id="cts-rhel8-5.1" index="1" target="rhel8-5"/>
|
|
||||||
+ <fencing-level devices="FencingPass,Fencing" id="cts-remote-rhel8-5.1" index="1" target="remote-rhel8-5"/>
|
|
||||||
+ </fencing-topology>
|
|
||||||
+ <op_defaults>
|
|
||||||
+ <meta_attributes id="cts-op_defaults-meta">
|
|
||||||
+ <nvpair id="cts-op_defaults-timeout" name="timeout" value="90s"/>
|
|
||||||
+ </meta_attributes>
|
|
||||||
+ </op_defaults>
|
|
||||||
+ <alerts>
|
|
||||||
+ <alert id="alert-1" path="/var/lib/pacemaker/notify.sh">
|
|
||||||
+ <recipient id="alert-1-recipient-1" value="/run/crm/alert.log"/>
|
|
||||||
+ </alert>
|
|
||||||
+ </alerts>
|
|
||||||
+ </configuration>
|
|
||||||
+ <status>
|
|
||||||
+ <node_state id="4" uname="rhel8-4" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="4">
|
|
||||||
+ <instance_attributes id="status-4"/>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="4">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="FencingPass" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingPass_last_0" operation_key="FencingPass_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="47:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;47:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-4" call-id="13" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="bdca24cab6ded2b426c6b31df675bf0b"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="Fencing" type="fence_xvm" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="Fencing_last_0" operation_key="Fencing_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="46:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;46:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-4" call-id="9" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="9" queue-time="0" op-digest="bf974d77f2d4d33e434be1f89e362a52"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="FencingFail" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingFail_last_0" operation_key="FencingFail_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="48:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;48:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-4" call-id="17" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="fe7e3f8acdd3228efda2766a0eea7ba5"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="test" type="Dummy" class="ocf" provider="pacemaker">
|
|
||||||
+ <lrm_rsc_op id="test_last_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="5:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;5:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-4" call-id="130" rc-code="0" op-status="0" interval="0" last-rc-change="1650636936" exec-time="25" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-secure-params=" passwd " op-secure-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ <lrm_rsc_op id="test_last_failure_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="5:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;5:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-4" call-id="130" rc-code="0" op-status="0" interval="0" last-rc-change="1650636936" exec-time="25" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ <node_state id="5" uname="rhel8-5" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="5">
|
|
||||||
+ <instance_attributes id="status-5"/>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="5">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="FencingPass" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingPass_last_0" operation_key="FencingPass_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="62:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;62:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-5" call-id="13" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="bdca24cab6ded2b426c6b31df675bf0b"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="Fencing" type="fence_xvm" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="Fencing_last_0" operation_key="Fencing_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="61:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;61:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-5" call-id="9" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="6" queue-time="0" op-digest="bf974d77f2d4d33e434be1f89e362a52"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="FencingFail" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingFail_last_0" operation_key="FencingFail_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="63:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;63:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-5" call-id="17" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="fe7e3f8acdd3228efda2766a0eea7ba5"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="test" type="Dummy" class="ocf" provider="pacemaker">
|
|
||||||
+ <lrm_rsc_op id="test_last_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="6:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;6:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-5" call-id="113" rc-code="7" op-status="0" interval="0" last-rc-change="1650636936" exec-time="25" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-secure-params=" passwd " op-secure-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ <node_state id="1" uname="rhel8-1" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="1">
|
|
||||||
+ <instance_attributes id="status-1"/>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="1">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="FencingPass" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingPass_last_0" operation_key="FencingPass_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="2:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;2:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-1" call-id="13" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="bdca24cab6ded2b426c6b31df675bf0b"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="Fencing" type="fence_xvm" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="Fencing_last_0" operation_key="Fencing_start_0" operation="start" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="76:0:0:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;76:0:0:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-1" call-id="14" rc-code="0" op-status="0" interval="0" last-rc-change="1650636745" exec-time="36" queue-time="0" op-digest="bf974d77f2d4d33e434be1f89e362a52"/>
|
|
||||||
+ <lrm_rsc_op id="Fencing_monitor_120000" operation_key="Fencing_monitor_120000" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="77:0:0:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;77:0:0:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-1" call-id="16" rc-code="0" op-status="0" interval="120000" last-rc-change="1650636745" exec-time="36" queue-time="0" op-digest="24c9c9364f847dcb857d6fb4e1b4d3c8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="FencingFail" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingFail_last_0" operation_key="FencingFail_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="3:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;3:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-1" call-id="21" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="fe7e3f8acdd3228efda2766a0eea7ba5"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="test" type="Dummy" class="ocf" provider="pacemaker">
|
|
||||||
+ <lrm_rsc_op id="test_last_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="2:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;2:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-1" call-id="121" rc-code="7" op-status="0" interval="0" last-rc-change="1650636936" exec-time="62" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-secure-params=" passwd " op-secure-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ <node_state id="2" uname="rhel8-2" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="2">
|
|
||||||
+ <instance_attributes id="status-2"/>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="2">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="FencingPass" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingPass_last_0" operation_key="FencingPass_start_0" operation="start" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="78:0:0:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;78:0:0:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-2" call-id="18" rc-code="0" op-status="0" interval="0" last-rc-change="1650636745" exec-time="21041" queue-time="0" op-digest="bdca24cab6ded2b426c6b31df675bf0b"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="Fencing" type="fence_xvm" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="Fencing_last_0" operation_key="Fencing_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="16:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;16:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-2" call-id="9" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="2" queue-time="0" op-digest="bf974d77f2d4d33e434be1f89e362a52"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="FencingFail" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingFail_last_0" operation_key="FencingFail_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="18:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;18:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-2" call-id="17" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="fe7e3f8acdd3228efda2766a0eea7ba5"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="test" type="Dummy" class="ocf" provider="pacemaker">
|
|
||||||
+ <lrm_rsc_op id="test_last_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="3:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;3:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-2" call-id="109" rc-code="7" op-status="0" interval="0" last-rc-change="1650636936" exec-time="37" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-secure-params=" passwd " op-secure-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ <node_state id="3" uname="rhel8-3" in_ccm="true" crmd="online" crm-debug-origin="do_update_resource" join="member" expected="member">
|
|
||||||
+ <transient_attributes id="3">
|
|
||||||
+ <instance_attributes id="status-3"/>
|
|
||||||
+ </transient_attributes>
|
|
||||||
+ <lrm id="3">
|
|
||||||
+ <lrm_resources>
|
|
||||||
+ <lrm_resource id="FencingPass" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingPass_last_0" operation_key="FencingPass_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="32:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;32:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-3" call-id="13" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="0" queue-time="0" op-digest="bdca24cab6ded2b426c6b31df675bf0b"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="Fencing" type="fence_xvm" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="Fencing_last_0" operation_key="Fencing_monitor_0" operation="monitor" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="31:0:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:7;31:0:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-3" call-id="9" rc-code="7" op-status="0" interval="0" last-rc-change="1650636745" exec-time="2" queue-time="0" op-digest="bf974d77f2d4d33e434be1f89e362a52"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="FencingFail" type="fence_dummy" class="stonith">
|
|
||||||
+ <lrm_rsc_op id="FencingFail_last_0" operation_key="FencingFail_start_0" operation="start" crm-debug-origin="build_active_RAs" crm_feature_set="3.13.0" transition-key="79:0:0:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;79:0:0:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-3" call-id="26" rc-code="0" op-status="0" interval="0" last-rc-change="1650636745" exec-time="1044" queue-time="0" op-digest="fe7e3f8acdd3228efda2766a0eea7ba5"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ <lrm_resource id="test" type="Dummy" class="ocf" provider="pacemaker">
|
|
||||||
+ <lrm_rsc_op id="test_last_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="4:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;4:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-3" call-id="114" rc-code="0" op-status="0" interval="0" last-rc-change="1650636936" exec-time="24" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-force-restart=" state " op-restart-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8" op-secure-params=" passwd " op-secure-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ <lrm_rsc_op id="test_last_failure_0" operation_key="test_monitor_0" operation="monitor" crm-debug-origin="do_update_resource" crm_feature_set="3.13.0" transition-key="4:46:7:181f4609-25b9-4673-b760-5de7a7f55635" transition-magic="0:0;4:46:7:181f4609-25b9-4673-b760-5de7a7f55635" exit-reason="" on_node="rhel8-3" call-id="114" rc-code="0" op-status="0" interval="0" last-rc-change="1650636936" exec-time="24" queue-time="0" op-digest="f2317cad3d54cec5d7d7aa7d0bf35cf8"/>
|
|
||||||
+ </lrm_resource>
|
|
||||||
+ </lrm_resources>
|
|
||||||
+ </lrm>
|
|
||||||
+ </node_state>
|
|
||||||
+ </status>
|
|
||||||
+</cib>
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
||||||
|
|
||||||
From 60d8bb01ba73dfd1cb25c6764ee2b923dcfc4e8c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ken Gaillot <kgaillot@redhat.com>
|
|
||||||
Date: Fri, 22 Apr 2022 14:09:43 -0500
|
|
||||||
Subject: [PATCH 3/3] Revert "Refactor: scheduler: add expected node to
|
|
||||||
primitive variant data"
|
|
||||||
|
|
||||||
This reverts commit 871e2201d92520039df45062afc9120fd1fb0f30.
|
|
||||||
---
|
|
||||||
include/crm/pengine/internal.h | 4 ----
|
|
||||||
lib/pengine/native.c | 38 ----------------------------------
|
|
||||||
lib/pengine/variant.h | 8 ++-----
|
|
||||||
3 files changed, 2 insertions(+), 48 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/crm/pengine/internal.h b/include/crm/pengine/internal.h
|
|
||||||
index a2e4b5bf7..fe9a23b7e 100644
|
|
||||||
--- a/include/crm/pengine/internal.h
|
|
||||||
+++ b/include/crm/pengine/internal.h
|
|
||||||
@@ -580,8 +580,4 @@ xmlNode *pe__failed_probe_for_rsc(pe_resource_t *rsc, const char *name);
|
|
||||||
|
|
||||||
const char *pe__clone_child_id(pe_resource_t *rsc);
|
|
||||||
|
|
||||||
-void pe__update_expected_node(pe_resource_t *rsc, pe_node_t *node,
|
|
||||||
- int execution_status, int exit_status,
|
|
||||||
- int expected_exit_status);
|
|
||||||
-
|
|
||||||
#endif
|
|
||||||
diff --git a/lib/pengine/native.c b/lib/pengine/native.c
|
|
||||||
index 591d1c6f5..fa7dc8960 100644
|
|
||||||
--- a/lib/pengine/native.c
|
|
||||||
+++ b/lib/pengine/native.c
|
|
||||||
@@ -1376,41 +1376,3 @@ pe__native_is_filtered(pe_resource_t *rsc, GList *only_rsc, gboolean check_paren
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
-/*!
|
|
||||||
- * \internal
|
|
||||||
- * \brief Set a resource's expected node if appropriate for a history result
|
|
||||||
- *
|
|
||||||
- * \param[in] rsc Resource to set expected node for
|
|
||||||
- * \param[in] node Node to set as expected node
|
|
||||||
- * \param[in] execution_status History entry's execution status
|
|
||||||
- * \param[in] exit_status History entry's actual exit status
|
|
||||||
- * \param[in] expected_status History entry's expected exit status
|
|
||||||
- */
|
|
||||||
-void
|
|
||||||
-pe__update_expected_node(pe_resource_t *rsc, pe_node_t *node,
|
|
||||||
- int execution_status, int exit_status,
|
|
||||||
- int expected_exit_status)
|
|
||||||
-{
|
|
||||||
- native_variant_data_t *native_data = NULL;
|
|
||||||
-
|
|
||||||
- get_native_variant_data(native_data, rsc);
|
|
||||||
-
|
|
||||||
- if ((rsc->recovery_type == recovery_stop_unexpected)
|
|
||||||
- && (rsc->role > RSC_ROLE_STOPPED)
|
|
||||||
- && (execution_status == PCMK_EXEC_DONE)
|
|
||||||
- && (exit_status == expected_exit_status)) {
|
|
||||||
- // Resource is active and was expected on this node
|
|
||||||
- pe_rsc_trace(rsc, "Found expected node %s for %s",
|
|
||||||
- node->details->uname, rsc->id);
|
|
||||||
- native_data->expected_node = node;
|
|
||||||
- pe__set_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
-
|
|
||||||
- } else if ((native_data->expected_node != NULL)
|
|
||||||
- && (native_data->expected_node->details == node->details)) {
|
|
||||||
- // Resource is not cleanly active here
|
|
||||||
- pe_rsc_trace(rsc, "Clearing expected node for %s", rsc->id);
|
|
||||||
- native_data->expected_node = NULL;
|
|
||||||
- pe__clear_resource_flags(rsc, pe_rsc_stop_unexpected);
|
|
||||||
- }
|
|
||||||
-}
|
|
||||||
diff --git a/lib/pengine/variant.h b/lib/pengine/variant.h
|
|
||||||
index d8fefa9d6..cabfbe81f 100644
|
|
||||||
--- a/lib/pengine/variant.h
|
|
||||||
+++ b/lib/pengine/variant.h
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright 2004-2022 the Pacemaker project contributors
|
|
||||||
+ * Copyright 2004-2021 the Pacemaker project contributors
|
|
||||||
*
|
|
||||||
* The version control history for this file may have further details.
|
|
||||||
*
|
|
||||||
@@ -139,11 +139,7 @@ typedef struct group_variant_data_s {
|
|
||||||
# elif VARIANT_NATIVE
|
|
||||||
|
|
||||||
typedef struct native_variant_data_s {
|
|
||||||
- /* If the resource is multiply active, and has multiple-active set to
|
|
||||||
- * stop_unexpected, this will be set to the node where the resource was
|
|
||||||
- * found active by an operation with a expected result.
|
|
||||||
- */
|
|
||||||
- pe_node_t *expected_node;
|
|
||||||
+ int dummy;
|
|
||||||
} native_variant_data_t;
|
|
||||||
|
|
||||||
# define get_native_variant_data(data, rsc) \
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
@ -35,11 +35,11 @@
|
|||||||
## Upstream pacemaker version, and its package version (specversion
|
## Upstream pacemaker version, and its package version (specversion
|
||||||
## can be incremented to build packages reliably considered "newer"
|
## can be incremented to build packages reliably considered "newer"
|
||||||
## than previously built packages with the same pcmkversion)
|
## than previously built packages with the same pcmkversion)
|
||||||
%global pcmkversion 2.1.2
|
%global pcmkversion 2.1.4
|
||||||
%global specversion 4
|
%global specversion 5
|
||||||
|
|
||||||
## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build
|
## Upstream commit (full commit ID, abbreviated commit ID, or tag) to build
|
||||||
%global commit ada5c3b36e2adf1703d54d39f40a4b8628eca175
|
%global commit dc6eb4362e67c1497a413434eba097063bf1ef83
|
||||||
|
|
||||||
## Since git v2.11, the extent of abbreviation is autoscaled by default
|
## Since git v2.11, the extent of abbreviation is autoscaled by default
|
||||||
## (used to be constant of 7), so we need to convey it for non-tags, too.
|
## (used to be constant of 7), so we need to convey it for non-tags, too.
|
||||||
@ -63,14 +63,13 @@
|
|||||||
## Add option for whether to support storing sensitive information outside CIB
|
## Add option for whether to support storing sensitive information outside CIB
|
||||||
%bcond_without cibsecrets
|
%bcond_without cibsecrets
|
||||||
|
|
||||||
|
## Add option to enable Native Language Support (experimental)
|
||||||
|
%bcond_with nls
|
||||||
|
|
||||||
## Add option to create binaries suitable for use with profiling tools
|
## Add option to create binaries suitable for use with profiling tools
|
||||||
%bcond_with profiling
|
%bcond_with profiling
|
||||||
|
|
||||||
## Add option to create binaries with coverage analysis
|
## Allow deprecated option to skip (or enable, on RHEL) documentation
|
||||||
%bcond_with coverage
|
|
||||||
|
|
||||||
## Add option to skip (or enable, on RHEL) generating documentation
|
|
||||||
## (the build tools aren't available everywhere)
|
|
||||||
%if 0%{?rhel}
|
%if 0%{?rhel}
|
||||||
%bcond_with doc
|
%bcond_with doc
|
||||||
%else
|
%else
|
||||||
@ -159,6 +158,7 @@
|
|||||||
%if 0%{?suse_version} > 0
|
%if 0%{?suse_version} > 0
|
||||||
%global pkgname_bzip2_devel libbz2-devel
|
%global pkgname_bzip2_devel libbz2-devel
|
||||||
%global pkgname_docbook_xsl docbook-xsl-stylesheets
|
%global pkgname_docbook_xsl docbook-xsl-stylesheets
|
||||||
|
%global pkgname_gettext gettext-tools
|
||||||
%global pkgname_gnutls_devel libgnutls-devel
|
%global pkgname_gnutls_devel libgnutls-devel
|
||||||
%global pkgname_shadow_utils shadow
|
%global pkgname_shadow_utils shadow
|
||||||
%global pkgname_procps procps
|
%global pkgname_procps procps
|
||||||
@ -170,6 +170,7 @@
|
|||||||
%global pkgname_libtool_devel_arch libtool-ltdl-devel%{?_isa}
|
%global pkgname_libtool_devel_arch libtool-ltdl-devel%{?_isa}
|
||||||
%global pkgname_bzip2_devel bzip2-devel
|
%global pkgname_bzip2_devel bzip2-devel
|
||||||
%global pkgname_docbook_xsl docbook-style-xsl
|
%global pkgname_docbook_xsl docbook-style-xsl
|
||||||
|
%global pkgname_gettext gettext-devel
|
||||||
%global pkgname_gnutls_devel gnutls-devel
|
%global pkgname_gnutls_devel gnutls-devel
|
||||||
%global pkgname_shadow_utils shadow-utils
|
%global pkgname_shadow_utils shadow-utils
|
||||||
%global pkgname_procps procps-ng
|
%global pkgname_procps procps-ng
|
||||||
@ -242,7 +243,7 @@
|
|||||||
Name: pacemaker
|
Name: pacemaker
|
||||||
Summary: Scalable High-Availability cluster resource manager
|
Summary: Scalable High-Availability cluster resource manager
|
||||||
Version: %{pcmkversion}
|
Version: %{pcmkversion}
|
||||||
Release: %{pcmk_release}%{?dist}.3
|
Release: %{pcmk_release}%{?dist}
|
||||||
%if %{defined _unitdir}
|
%if %{defined _unitdir}
|
||||||
License: GPLv2+ and LGPLv2+
|
License: GPLv2+ and LGPLv2+
|
||||||
%else
|
%else
|
||||||
@ -263,33 +264,18 @@ Source0: https://codeload.github.com/%{github_owner}/%{name}/tar.gz/%{arch
|
|||||||
Source1: nagios-agents-metadata-%{nagios_hash}.tar.gz
|
Source1: nagios-agents-metadata-%{nagios_hash}.tar.gz
|
||||||
|
|
||||||
# upstream commits
|
# upstream commits
|
||||||
Patch1: 001-acl-group-schema.patch
|
Patch001: 001-stonith-enabled.patch
|
||||||
Patch2: 002-fencing-reasons.patch
|
Patch002: 002-acl_group.patch
|
||||||
Patch3: 003-fencing-reasons.patch
|
Patch003: 003-regression.patch
|
||||||
Patch4: 004-systemd-metadata.patch
|
Patch004: 004-schema.patch
|
||||||
Patch5: 005-fencing-reasons.patch
|
Patch005: 005-schema.patch
|
||||||
Patch6: 006-stateful-metadata.patch
|
Patch006: 006-crm_resource.patch
|
||||||
Patch7: 007-memory-leak.patch
|
Patch007: 007-stonith_admin.patch
|
||||||
Patch8: 008-fencing-history.patch
|
Patch008: 008-metadata.patch
|
||||||
Patch9: 009-fencing-reasons.patch
|
Patch009: 009-validate.patch
|
||||||
Patch10: 010-probe-failures.patch
|
Patch010: 010-regression.patch
|
||||||
Patch11: 011-fencing-reasons.patch
|
Patch011: 011-unfencing.patch
|
||||||
Patch12: 012-notify-crash.patch
|
Patch012: 012-crm_resource.patch
|
||||||
Patch13: 013-probe-failures.patch
|
|
||||||
Patch14: 014-pcmk_delay_base.patch
|
|
||||||
Patch15: 015-fencing-reasons.patch
|
|
||||||
Patch16: 016-fencing-crash.patch
|
|
||||||
Patch17: 017-fencing-reasons.patch
|
|
||||||
Patch18: 018-failure-messages.patch
|
|
||||||
Patch19: 019-corosync-tracking.patch
|
|
||||||
Patch20: 020-systemd-unit.patch
|
|
||||||
Patch21: 021-failure-messages.patch
|
|
||||||
Patch22: 022-memory-leak.patch
|
|
||||||
Patch23: 023-regression.patch
|
|
||||||
Patch24: 024-stop_unexpected.patch
|
|
||||||
Patch25: 025-stop_unexpected-test.patch
|
|
||||||
Patch26: 026-stop_unexpected-fix.patch
|
|
||||||
Patch27: 027-crm_resource.patch
|
|
||||||
|
|
||||||
# downstream-only commits
|
# downstream-only commits
|
||||||
#Patch1xx: 1xx-xxxx.patch
|
#Patch1xx: 1xx-xxxx.patch
|
||||||
@ -348,6 +334,7 @@ BuildRequires: %{pkgname_gnutls_devel}
|
|||||||
BuildRequires: help2man
|
BuildRequires: help2man
|
||||||
BuildRequires: ncurses-devel
|
BuildRequires: ncurses-devel
|
||||||
BuildRequires: pam-devel
|
BuildRequires: pam-devel
|
||||||
|
BuildRequires: %{pkgname_gettext} >= 0.18
|
||||||
|
|
||||||
# Required for "make check"
|
# Required for "make check"
|
||||||
BuildRequires: libcmocka-devel
|
BuildRequires: libcmocka-devel
|
||||||
@ -396,7 +383,7 @@ when related resources fail and can be configured to periodically check
|
|||||||
resource health.
|
resource health.
|
||||||
|
|
||||||
Available rpmbuild rebuild options:
|
Available rpmbuild rebuild options:
|
||||||
--with(out) : cibsecrets coverage doc hardening pre_release profiling stonithd
|
--with(out) : cibsecrets doc hardening nls pre_release profiling stonithd
|
||||||
|
|
||||||
%package cli
|
%package cli
|
||||||
License: GPLv2+ and LGPLv2+
|
License: GPLv2+ and LGPLv2+
|
||||||
@ -585,8 +572,8 @@ export LDFLAGS_HARDENED_LIB="%{?_hardening_ldflags}"
|
|||||||
%{!?with_hardening: --disable-hardening} \
|
%{!?with_hardening: --disable-hardening} \
|
||||||
%{?with_legacy_links: --enable-legacy-links} \
|
%{?with_legacy_links: --enable-legacy-links} \
|
||||||
%{?with_profiling: --with-profiling} \
|
%{?with_profiling: --with-profiling} \
|
||||||
%{?with_coverage: --with-coverage} \
|
|
||||||
%{?with_cibsecrets: --with-cibsecrets} \
|
%{?with_cibsecrets: --with-cibsecrets} \
|
||||||
|
%{?with_nls: --enable-nls} \
|
||||||
%{?with_sbd_sync: --with-sbd-sync-default="true"} \
|
%{?with_sbd_sync: --with-sbd-sync-default="true"} \
|
||||||
%{?gnutls_priorities: --with-gnutls-priorities="%{gnutls_priorities}"} \
|
%{?gnutls_priorities: --with-gnutls-priorities="%{gnutls_priorities}"} \
|
||||||
%{?bug_url: --with-bug-url=%{bug_url}} \
|
%{?bug_url: --with-bug-url=%{bug_url}} \
|
||||||
@ -645,10 +632,14 @@ done
|
|||||||
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/lib/rpm-state/%{name}
|
mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/lib/rpm-state/%{name}
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if %{with nls}
|
||||||
|
%find_lang %{name}
|
||||||
|
%endif
|
||||||
|
|
||||||
# Don't package libtool archives
|
# Don't package libtool archives
|
||||||
find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f
|
find %{buildroot} -name '*.la' -type f -print0 | xargs -0 rm -f
|
||||||
|
|
||||||
# Do not package these either
|
# Do not package these either on RHEL
|
||||||
rm -f %{buildroot}/%{_sbindir}/fence_legacy
|
rm -f %{buildroot}/%{_sbindir}/fence_legacy
|
||||||
rm -f %{buildroot}/%{_mandir}/man8/fence_legacy.*
|
rm -f %{buildroot}/%{_mandir}/man8/fence_legacy.*
|
||||||
find %{buildroot} -name '*o2cb*' -type f -print0 | xargs -0 rm -f
|
find %{buildroot} -name '*o2cb*' -type f -print0 | xargs -0 rm -f
|
||||||
@ -667,16 +658,6 @@ rm -f %{buildroot}/%{_sbindir}/ipmiservicelogd
|
|||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if %{with coverage}
|
|
||||||
GCOV_BASE=%{buildroot}/%{_var}/lib/pacemaker/gcov
|
|
||||||
mkdir -p $GCOV_BASE
|
|
||||||
find . -name '*.gcno' -type f | while read F ; do
|
|
||||||
D=`dirname $F`
|
|
||||||
mkdir -p ${GCOV_BASE}/$D
|
|
||||||
cp $F ${GCOV_BASE}/$D
|
|
||||||
done
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%post
|
%post
|
||||||
%if %{defined _unitdir}
|
%if %{defined _unitdir}
|
||||||
%systemd_post pacemaker.service
|
%systemd_post pacemaker.service
|
||||||
@ -809,7 +790,6 @@ exit 0
|
|||||||
%exclude %{_datadir}/pacemaker/nagios
|
%exclude %{_datadir}/pacemaker/nagios
|
||||||
%{_libexecdir}/pacemaker/*
|
%{_libexecdir}/pacemaker/*
|
||||||
|
|
||||||
%{_sbindir}/crm_attribute
|
|
||||||
%{_sbindir}/crm_master
|
%{_sbindir}/crm_master
|
||||||
%{_sbindir}/fence_watchdog
|
%{_sbindir}/fence_watchdog
|
||||||
|
|
||||||
@ -818,7 +798,6 @@ exit 0
|
|||||||
%doc %{_mandir}/man7/pacemaker-fenced.*
|
%doc %{_mandir}/man7/pacemaker-fenced.*
|
||||||
%doc %{_mandir}/man7/ocf_pacemaker_controld.*
|
%doc %{_mandir}/man7/ocf_pacemaker_controld.*
|
||||||
%doc %{_mandir}/man7/ocf_pacemaker_remote.*
|
%doc %{_mandir}/man7/ocf_pacemaker_remote.*
|
||||||
%doc %{_mandir}/man8/crm_attribute.*
|
|
||||||
%doc %{_mandir}/man8/crm_master.*
|
%doc %{_mandir}/man8/crm_master.*
|
||||||
%doc %{_mandir}/man8/fence_watchdog.*
|
%doc %{_mandir}/man8/fence_watchdog.*
|
||||||
%doc %{_mandir}/man8/pacemakerd.*
|
%doc %{_mandir}/man8/pacemakerd.*
|
||||||
@ -857,6 +836,7 @@ exit 0
|
|||||||
%if %{with cibsecrets}
|
%if %{with cibsecrets}
|
||||||
%{_sbindir}/cibsecret
|
%{_sbindir}/cibsecret
|
||||||
%endif
|
%endif
|
||||||
|
%{_sbindir}/crm_attribute
|
||||||
%{_sbindir}/crm_diff
|
%{_sbindir}/crm_diff
|
||||||
%{_sbindir}/crm_error
|
%{_sbindir}/crm_error
|
||||||
%{_sbindir}/crm_failcount
|
%{_sbindir}/crm_failcount
|
||||||
@ -893,7 +873,6 @@ exit 0
|
|||||||
%exclude %{_mandir}/man7/ocf_pacemaker_controld.*
|
%exclude %{_mandir}/man7/ocf_pacemaker_controld.*
|
||||||
%exclude %{_mandir}/man7/ocf_pacemaker_remote.*
|
%exclude %{_mandir}/man7/ocf_pacemaker_remote.*
|
||||||
%doc %{_mandir}/man8/*
|
%doc %{_mandir}/man8/*
|
||||||
%exclude %{_mandir}/man8/crm_attribute.*
|
|
||||||
%exclude %{_mandir}/man8/crm_master.*
|
%exclude %{_mandir}/man8/crm_master.*
|
||||||
%exclude %{_mandir}/man8/fence_watchdog.*
|
%exclude %{_mandir}/man8/fence_watchdog.*
|
||||||
%exclude %{_mandir}/man8/pacemakerd.*
|
%exclude %{_mandir}/man8/pacemakerd.*
|
||||||
@ -909,7 +888,7 @@ exit 0
|
|||||||
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker
|
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker
|
||||||
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker/bundles
|
%dir %attr (770, %{uname}, %{gname}) %{_var}/log/pacemaker/bundles
|
||||||
|
|
||||||
%files -n %{pkgname_pcmk_libs}
|
%files -n %{pkgname_pcmk_libs} %{?with_nls:-f %{name}.lang}
|
||||||
%{_libdir}/libcib.so.*
|
%{_libdir}/libcib.so.*
|
||||||
%{_libdir}/liblrmd.so.*
|
%{_libdir}/liblrmd.so.*
|
||||||
%{_libdir}/libcrmservice.so.*
|
%{_libdir}/libcrmservice.so.*
|
||||||
@ -965,9 +944,6 @@ exit 0
|
|||||||
%files -n %{pkgname_pcmk_libs}-devel
|
%files -n %{pkgname_pcmk_libs}-devel
|
||||||
%{_includedir}/pacemaker
|
%{_includedir}/pacemaker
|
||||||
%{_libdir}/*.so
|
%{_libdir}/*.so
|
||||||
%if %{with coverage}
|
|
||||||
%{_var}/lib/pacemaker/gcov
|
|
||||||
%endif
|
|
||||||
%{_libdir}/pkgconfig/*.pc
|
%{_libdir}/pkgconfig/*.pc
|
||||||
%license licenses/LGPLv2.1
|
%license licenses/LGPLv2.1
|
||||||
%doc COPYING
|
%doc COPYING
|
||||||
@ -979,6 +955,7 @@ exit 0
|
|||||||
%{_datadir}/pacemaker/*.rng
|
%{_datadir}/pacemaker/*.rng
|
||||||
%{_datadir}/pacemaker/*.xsl
|
%{_datadir}/pacemaker/*.xsl
|
||||||
%{_datadir}/pacemaker/api
|
%{_datadir}/pacemaker/api
|
||||||
|
%{_datadir}/pacemaker/base
|
||||||
%{_datadir}/pkgconfig/pacemaker-schemas.pc
|
%{_datadir}/pkgconfig/pacemaker-schemas.pc
|
||||||
|
|
||||||
%files nagios-plugins-metadata
|
%files nagios-plugins-metadata
|
||||||
@ -987,17 +964,55 @@ exit 0
|
|||||||
%license %{nagios_name}-%{nagios_hash}/COPYING
|
%license %{nagios_name}-%{nagios_hash}/COPYING
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Tue Aug 16 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.2-4.3
|
* Wed Aug 10 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-5
|
||||||
- Fix regression in crm_resource -O
|
- Fix regression in crm_resource -O
|
||||||
- Resolves: rhbz2118745
|
- Resolves: rhbz2118337
|
||||||
|
|
||||||
* Fri Apr 22 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.2-4.2
|
* Wed Jul 20 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-4
|
||||||
- Fix issue with "stop_unexpected" value for "multiple-active" meta-attribute
|
- Ensure all nodes are re-unfenced after device configuration change
|
||||||
- Resolves: rhbz2062848
|
- crm_resource --why now checks node health status
|
||||||
|
- Resolves: rhbz1872483
|
||||||
|
- Resolves: rhbz2065818
|
||||||
|
|
||||||
* Fri Apr 8 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.2-4.1
|
* Wed Jun 29 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-3
|
||||||
- Support "stop_unexpected" value for "multiple-active" meta-attribute
|
- Add support for ACL groups
|
||||||
- Resolves: rhbz2062848
|
- Resolves: rhbz1724310
|
||||||
|
|
||||||
|
* Tue Jun 28 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-2
|
||||||
|
- Restore crm_attribute query behavior when attribute does not exist
|
||||||
|
- Resolves: rhbz2072107
|
||||||
|
|
||||||
|
* Wed Jun 15 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.4-1
|
||||||
|
- Fencer should not ignore CIB updates when stonith is disabled
|
||||||
|
- Rebase pacemaker on upstream 2.1.4 final release
|
||||||
|
- Fix typo in ocf:pacemaker:HealthSMART meta-data
|
||||||
|
- Resolves: rhbz2055935
|
||||||
|
- Resolves: rhbz2072107
|
||||||
|
- Resolves: rhbz2094855
|
||||||
|
|
||||||
|
* Wed Jun 1 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.3-2
|
||||||
|
- crm_attribute works on remote node command line when hostname differs
|
||||||
|
- Rebase pacemaker on upstream 2.1.3 final release
|
||||||
|
- Resolves: rhbz1384172
|
||||||
|
- Resolves: rhbz2072107
|
||||||
|
|
||||||
|
* Wed May 18 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.3-1
|
||||||
|
- crm_resource --restart fails to restart clone instances except instance 0
|
||||||
|
- Add new multiple-active option for "stop unexpected instances"
|
||||||
|
- Unable to show metadata for "service" agents with "@" and "." in the name
|
||||||
|
- Resource ocf:pacemaker:attribute does not comply with the OCF 1.1 standard
|
||||||
|
- Allow resource meta-attribute to exempt resource from node health restrictions
|
||||||
|
- Show node health states in crm_mon
|
||||||
|
- Rebase pacemaker on upstream 2.1.3-rc2 release
|
||||||
|
- crm_mon API result does not validate against schema if fence event has exit-reason
|
||||||
|
- Resolves: rhbz1930578
|
||||||
|
- Resolves: rhbz2036815
|
||||||
|
- Resolves: rhbz2045096
|
||||||
|
- Resolves: rhbz2049722
|
||||||
|
- Resolves: rhbz2059638
|
||||||
|
- Resolves: rhbz2065812
|
||||||
|
- Resolves: rhbz2072107
|
||||||
|
- Resolves: rhbz2086230
|
||||||
|
|
||||||
* Wed Jan 26 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.2-4
|
* Wed Jan 26 2022 Ken Gaillot <kgaillot@redhat.com> - 2.1.2-4
|
||||||
- Fix regression in down event detection that affects remote nodes
|
- Fix regression in down event detection that affects remote nodes
|
||||||
@ -1061,7 +1076,7 @@ exit 0
|
|||||||
- Show better error messages in crm_resource with invalid resource types
|
- Show better error messages in crm_resource with invalid resource types
|
||||||
- Avoid selecting wrong device when dynamic-list fencing is used with host map
|
- Avoid selecting wrong device when dynamic-list fencing is used with host map
|
||||||
- Do not schedule probes of unmanaged resources on pending nodes
|
- Do not schedule probes of unmanaged resources on pending nodes
|
||||||
- Fix regressions in crm_attribute and crm_master argument handling
|
- Fix argument handling regressions in crm_attribute and wrappers
|
||||||
- Resolves: rhbz1447918
|
- Resolves: rhbz1447918
|
||||||
- Resolves: rhbz1978010
|
- Resolves: rhbz1978010
|
||||||
- Resolves: rhbz1982453
|
- Resolves: rhbz1982453
|
||||||
@ -1330,7 +1345,7 @@ exit 0
|
|||||||
- Resolves: rhbz#1622969
|
- Resolves: rhbz#1622969
|
||||||
|
|
||||||
* Mon Aug 13 2018 Ken Gaillot <kgaillot@redhat.com> - 2.0.0-7
|
* Mon Aug 13 2018 Ken Gaillot <kgaillot@redhat.com> - 2.0.0-7
|
||||||
- Include upstream master branch commits through 975347d4
|
- Include upstream main branch commits through 975347d4
|
||||||
- Resolves: rhbz#1543494
|
- Resolves: rhbz#1543494
|
||||||
- Resolves: rhbz#1602650
|
- Resolves: rhbz#1602650
|
||||||
- Resolves: rhbz#1608369
|
- Resolves: rhbz#1608369
|
||||||
@ -1501,7 +1516,7 @@ exit 0
|
|||||||
|
|
||||||
* Thu Aug 20 2015 Andrew Beekhof <abeekhof@redhat.com> - 1.1.13-2
|
* Thu Aug 20 2015 Andrew Beekhof <abeekhof@redhat.com> - 1.1.13-2
|
||||||
- Update for new upstream tarball: Pacemaker-1.1.13
|
- Update for new upstream tarball: Pacemaker-1.1.13
|
||||||
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/master/ChangeLog for full details
|
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/main/ChangeLog for full details
|
||||||
|
|
||||||
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.1.12-2.1
|
* Thu Jun 18 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.1.12-2.1
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
|
||||||
@ -1511,7 +1526,7 @@ exit 0
|
|||||||
|
|
||||||
* Tue Oct 28 2014 Andrew Beekhof <abeekhof@redhat.com> - 1.1.12-1
|
* Tue Oct 28 2014 Andrew Beekhof <abeekhof@redhat.com> - 1.1.12-1
|
||||||
- Update for new upstream tarball: Pacemaker-1.1.12+ (a9c8177)
|
- Update for new upstream tarball: Pacemaker-1.1.12+ (a9c8177)
|
||||||
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/master/ChangeLog for full details
|
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/main/ChangeLog for full details
|
||||||
|
|
||||||
* Sun Aug 17 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.1.11-1.2
|
* Sun Aug 17 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.1.11-1.2
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
|
||||||
@ -1521,11 +1536,11 @@ exit 0
|
|||||||
|
|
||||||
* Tue Feb 18 2014 Andrew Beekhof <abeekhof@redhat.com> - 1.1.11-1
|
* Tue Feb 18 2014 Andrew Beekhof <abeekhof@redhat.com> - 1.1.11-1
|
||||||
- Update for new upstream tarball: Pacemaker-1.1.11 (9d39a6b)
|
- Update for new upstream tarball: Pacemaker-1.1.11 (9d39a6b)
|
||||||
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/master/ChangeLog for full details
|
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/main/ChangeLog for full details
|
||||||
|
|
||||||
* Thu Jun 20 2013 Andrew Beekhof <abeekhof@redhat.com> - 1.1.9-3
|
* Thu Jun 20 2013 Andrew Beekhof <abeekhof@redhat.com> - 1.1.9-3
|
||||||
- Update to upstream 7d8acec
|
- Update to upstream 7d8acec
|
||||||
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/master/ChangeLog for full details
|
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/main/ChangeLog for full details
|
||||||
|
|
||||||
+ Feature: Turn off auto-respawning of systemd services when the cluster starts them
|
+ Feature: Turn off auto-respawning of systemd services when the cluster starts them
|
||||||
+ Fix: crmd: Ensure operations for cleaned up resources don't block recovery
|
+ Fix: crmd: Ensure operations for cleaned up resources don't block recovery
|
||||||
@ -1533,11 +1548,11 @@ exit 0
|
|||||||
|
|
||||||
* Mon Jun 17 2013 Andrew Beekhof <abeekhof@redhat.com> - 1.1.9-2
|
* Mon Jun 17 2013 Andrew Beekhof <abeekhof@redhat.com> - 1.1.9-2
|
||||||
- Update for new upstream tarball: 781a388
|
- Update for new upstream tarball: 781a388
|
||||||
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/master/ChangeLog for full details
|
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/main/ChangeLog for full details
|
||||||
|
|
||||||
* Wed May 12 2010 Andrew Beekhof <andrew@beekhof.net> - 1.1.2-1
|
* Wed May 12 2010 Andrew Beekhof <andrew@beekhof.net> - 1.1.2-1
|
||||||
- Update the tarball from the upstream 1.1.2 release
|
- Update the tarball from the upstream 1.1.2 release
|
||||||
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/master/ChangeLog for full details
|
- See included ChangeLog file or https://raw.github.com/ClusterLabs/pacemaker/main/ChangeLog for full details
|
||||||
|
|
||||||
* Tue Jul 14 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.4-1
|
* Tue Jul 14 2009 Andrew Beekhof <andrew@beekhof.net> - 1.0.4-1
|
||||||
- Initial checkin
|
- Initial checkin
|
||||||
|
Loading…
Reference in New Issue
Block a user