File crm-fence-peer-pacemaker2-use-xml.patch of Package drbd-utils.18415
From 1bc99fd2929cc8d2da142c309e0c73524fe4fb76 Mon Sep 17 00:00:00 2001
From: Lars Ellenberg <lars.ellenberg@linbit.com>
Date: Tue, 8 Sep 2020 15:50:57 +0200
Subject: [PATCH] crm-fence-peer.9.sh: fix Pacemaker compat
Trying to parse the crm_mon output intended for "human consumption" was
a bad idea, unsurprisingly.
Parsing the `crm_mon --as-xml` variant should turn out more stable.
This fixes additional regressions in more scenarios that should be
covered by this "crm-fence-peer" handler, where it needs to check if the
node that executes the handler is already rejected by an existing
constraint with the expected constraint id.
Now works again with DRBD 9 and "all" (relevant) versions of
pacemaker, where "relevant" is 1.1.x >= 1.1.15,
and the current 2.0 series.
---
scripts/crm-fence-peer.9.sh | 40 +++++++++++++++++++++++++++++++---------
1 file changed, 31 insertions(+), 9 deletions(-)
diff --git a/scripts/crm-fence-peer.9.sh b/scripts/crm-fence-peer.9.sh
index a4f3e9f0..36590bd8 100755
--- a/scripts/crm-fence-peer.9.sh
+++ b/scripts/crm-fence-peer.9.sh
@@ -80,6 +80,31 @@ restrict_existing_constraint_further()
done
}
+# set CIB_file= in environment, unless you want to grab the "live" one.
+#
+# I'd like to use the optional prefix filter on the constraint id,
+# but pacemaker upstream broke that functionality (and later accidentally fixed it again)
+# :-( so I "grep"
+# Since "human readable" output is not stable enough for parsing, use
+# the "--as-xml" switch (in more recent pacemaker, that would be the
+# "--output-as=xml", but the --as-xml is still supported for the time being).
+crm_mon_xml_sed_for_quorum_and_ban()
+{
+ # Yes, modern bash has lowercase substitution,
+ # and gnu sed has case insensitive match,
+ # but people use DRBD in weird deployments sometimes,
+ # while insiting on having "camel case" hostnames...
+ local node_name=$( echo $1 | tr '[[:upper:]]' '[[:lower:]]' )
+ crm_mon --as-xml |
+ sed -n \
+ -e 's/^.*<current_dc .*with_quorum="true".*$/have_quorum/p' \
+ -e '/<ban /!d' \
+ -e '/ id="'$id_prefix-'\(rule-\)\?\<'$master_id'"/!d' \
+ -e '/ resource="'$master_id'"/!d' \
+ -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' \
+ -e '/ node="'$node_name'"/ { s/.*/already_rejected/p }'
+}
+
create_or_modify_constraint()
{
local DIR
@@ -109,12 +134,9 @@ create_or_modify_constraint()
cibadmin -Q | tee cib.xml.orig > cib.xml
export CIB_file=cib.xml
- set -- $( crm_mon -1nL "$id_prefix-$master_id" | sed -n \
- -e '/Current DC:.*partition with quorum/ { s/.*/quorum=1/p };' \
- -e '1,/^Negative Location Constraints:/ d' \
- -e '/^ *\([^[:space:]]*\)[[:space:]]prevents '"$master_id"' from running.*on '"$HOSTNAME"'$/ { s/.*/already_rejected/p }' )
-
- if [[ $# != 1 || $1 != "quorum=1" ]] ; then
+ set -- $( crm_mon_xml_sed_for_quorum_and_ban $HOSTNAME )
+ if [[ $# != 1 || $1 != "have_quorum" ]] ; then
+ : "$*"
: "sorry, want a quorate partition, and not be rejected by constraint already"
unset CIB_file
break
@@ -403,7 +425,7 @@ try_place_constraint()
if $fail_if_no_quorum ; then
if [[ $have_quorum = 1 ]] ; then
# double check
- have_quorum=$(crm_node --quorum -VVVVV)
+ have_quorum=$(crm_node --quorum -VVV)
[[ $have_quorum = 0 ]] && echo WARNING "Cib still had quorum, but no quorum according to crm_node --quorum"
fi
if [[ $have_quorum != 1 ]] ; then
@@ -634,8 +656,8 @@ _node_already_rejected()
#
# Maybe we better just ask crm_mon instead:
- ( set +x; echo "$cib_xml" | CIB_file=/proc/self/fd/0 crm_mon -1nL "$id_prefix-$master_id" |
- grep -q "prevents $master_id from running .*\<on $node_name$" )
+ set -- $( set +x; echo "$cib_xml" | CIB_file=/proc/self/fd/0 crm_mon_xml_sed_for_quorum_and_ban $node_name )
+ [[ $* = *already_rejected ]]
}
# you should call have_expected_contraint() first.
--
2.16.4