diff --git a/0001-crm-fence-peer-fix-timeout-with-Pacemaker-2.1-milli-.patch b/0001-crm-fence-peer-fix-timeout-with-Pacemaker-2.1-milli-.patch new file mode 100644 index 0000000..2bf7d89 --- /dev/null +++ b/0001-crm-fence-peer-fix-timeout-with-Pacemaker-2.1-milli-.patch @@ -0,0 +1,138 @@ +From 8a28be74bc6efa93931c957e54c01abb18b984fe Mon Sep 17 00:00:00 2001 +From: Lars Ellenberg +Date: Wed, 12 Jan 2022 13:50:35 +0100 +Subject: [PATCH] crm-fence-peer: fix timeout with Pacemaker 2.1: milli seconds + vs seconds +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +crmadmin timeout was in milli seconds for <= 2.0.x, +but became a TIMESPEC with default seconds in >= 2.1. + +Up to 2.0.4, atoi() was used, which effectively ignores "trailing garbage", +so we could get away with always appending "ms". +But with 2.0.5, it became g_option_context_parse G_OPTION_ARG_INT, which +"Cannot parse integer value “200ms” for --timeout" :-| + +So grep the help message for "timeout.*milliseconds", +and if not present, append an explicit "ms" unit. + +Also tolerate both ": ok" (2.1) and " (ok)" (older) +when matching the output string of crmadmin -S. +--- + scripts/crm-fence-peer.9.sh | 24 +++++++++++++++++++++--- + scripts/crm-fence-peer.sh | 24 +++++++++++++++++++++--- + 2 files changed, 42 insertions(+), 6 deletions(-) + +diff --git a/scripts/crm-fence-peer.9.sh b/scripts/crm-fence-peer.9.sh +index 36590bd8..c943bf9f 100755 +--- a/scripts/crm-fence-peer.9.sh ++++ b/scripts/crm-fence-peer.9.sh +@@ -392,6 +392,20 @@ check_cluster_properties() + crm_is_not_false ${stonith_enabled:-} && stonith_enabled=true || stonith_enabled=false + } + ++setup_crm_timeout_unit_ms() ++{ ++ # crmadmin timeout was in ms for <= 2.0.x, ++ # but became a TIMESPEC in >= 2.1. ++ # Up to 2.0.4, atoi() was used, which effectively ignores "trailing ++ # garbage", so we could get away with always appending "ms", but with ++ # 2.0.5, it became g_option_context_parse G_OPTION_ARG_INT, which ++ # "Cannot parse integer value “200ms” for --timeout" :-| ++ if crmadmin --help 2>&1 | grep -q -e "--timeout=.*in milliseconds"; then ++ crm_timeout_unit_ms="" ++ else ++ crm_timeout_unit_ms="ms" ++ fi ++} + + # + # In case this is a two-node cluster (still common with +@@ -737,6 +751,7 @@ drbd_peer_fencing() + + local startup_fencing stonith_enabled + check_cluster_properties ++ setup_crm_timeout_unit_ms + + if ! $had_constraint_on_entry ; then + +@@ -1075,14 +1090,17 @@ _check_peer_node_reachable() + # it is obviously reachable. + # + # Do this only after we have been able to reach a DC above. +- # Note: crmadmin timeout is in milli-seconds, and defaults to 30000 (30 seconds). ++ # Note: crmadmin timeout defaults to 30 seconds. ++ # + # Our variable $cibtimeout should be in deci-seconds (see above) + # (unless you use a very old version of pacemaker, so don't do that). + # Convert deci-seconds to milli-seconds, and double it. ++ # See also setup_crm_timeout_unit_ms() above. ++ # + if [[ $crmd = "online" ]] ; then + local out +- if out=$( crmadmin -t $(( cibtimeout * 200 )) -S $DRBD_PEER ) \ +- && [[ $out = *"(ok)" ]]; then ++ if out=$( crmadmin -t $(( cibtimeout * 200 ))$crm_timeout_unit_ms -S $DRBD_PEER ) \ ++ && [[ $out = *@(": ok"|" (ok)") ]]; then + peer_state="reachable" + return + fi +diff --git a/scripts/crm-fence-peer.sh b/scripts/crm-fence-peer.sh +index cb5deded..96786734 100755 +--- a/scripts/crm-fence-peer.sh ++++ b/scripts/crm-fence-peer.sh +@@ -244,6 +244,20 @@ check_cluster_properties() + crm_is_not_false $stonith_enabled && stonith_enabled=true || stonith_enabled=false + } + ++setup_crm_timeout_unit_ms() ++{ ++ # crmadmin timeout was in ms for <= 2.0.x, ++ # but became a TIMESPEC in >= 2.1. ++ # Up to 2.0.4, atoi() was used, which effectively ignores "trailing ++ # garbage", so we could get away with always appending "ms", but with ++ # 2.0.5, it became g_option_context_parse G_OPTION_ARG_INT, which ++ # "Cannot parse integer value “200ms” for --timeout" :-| ++ if crmadmin --help 2>&1 | grep -q -e "--timeout=.*in milliseconds"; then ++ crm_timeout_unit_ms="" ++ else ++ crm_timeout_unit_ms="ms" ++ fi ++} + + # + # In case this is a two-node cluster (still common with +@@ -426,6 +440,7 @@ drbd_peer_fencing() + + local startup_fencing stonith_enabled + check_cluster_properties ++ setup_crm_timeout_unit_ms + + if [[ -z $have_constraint ]] ; then + # try to place it. +@@ -718,14 +733,17 @@ check_peer_node_reachable() + # it is obviously reachable. + # + # Do this only after we have been able to reach a DC above. +- # Note: crmadmin timeout is in milli-seconds, and defaults to 30000 (30 seconds). ++ # Note: crmadmin timeout defaults to 30 seconds. ++ # + # Our variable $cibtimeout should be in deci-seconds (see above) + # (unless you use a very old version of pacemaker, so don't do that). + # Convert deci-seconds to milli-seconds, and double it. ++ # See also setup_crm_timeout_unit_ms() above. ++ # + if [[ $crmd = "online" ]] ; then + local out +- if out=$( crmadmin -t $(( cibtimeout * 200 )) -S $DRBD_PEER ) \ +- && [[ $out = *"(ok)" ]]; then ++ if out=$( crmadmin -t $(( cibtimeout * 200 ))$crm_timeout_unit_ms -S $DRBD_PEER ) \ ++ && [[ $out = *@(": ok"|" (ok)") ]]; then + peer_state="reachable" + return + fi +-- +2.40.0 + diff --git a/0002-crm-fence-peer-fix-timeout-with-Pacemaker-2.0.5-mill.patch b/0002-crm-fence-peer-fix-timeout-with-Pacemaker-2.0.5-mill.patch new file mode 100644 index 0000000..88b4ec3 --- /dev/null +++ b/0002-crm-fence-peer-fix-timeout-with-Pacemaker-2.0.5-mill.patch @@ -0,0 +1,90 @@ +From 68d1e4242f165917bc2c787d9df0fe41251e05e6 Mon Sep 17 00:00:00 2001 +From: Lars Ellenberg +Date: Wed, 12 Jan 2022 13:50:35 +0100 +Subject: [PATCH] crm-fence-peer: fix timeout with Pacemaker 2.0.5: milli + seconds vs seconds +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Addendum to 8a28be74bc6efa93931c957e54c01abb18b984fe +Commit message of the above cited here: + +> crmadmin timeout was in milli seconds for <= 2.0.x, +> but became a TIMESPEC with default seconds in >= 2.1. +> +> Up to 2.0.4, atoi() was used, which effectively ignores "trailing garbage", +> so we could get away with always appending "ms". +> But with 2.0.5, it became g_option_context_parse G_OPTION_ARG_INT, which +> "Cannot parse integer value “200ms” for --timeout" :-| +> +> So grep the help message for "timeout.*milliseconds", +> and if not present, append an explicit "ms" unit. + +And this is where I got it wrong :-( +somewhere later they re-organised the help text +so now I would need to parse --help-all. + +Instead try to actually call "crmadmin -t 100ms --version". +If that works, it apparently understands (or ignores) +the "ms" unit. +--- + scripts/crm-fence-peer.9.sh | 14 +++++++++++--- + scripts/crm-fence-peer.sh | 14 +++++++++++--- + 2 files changed, 22 insertions(+), 6 deletions(-) + +diff --git a/scripts/crm-fence-peer.9.sh b/scripts/crm-fence-peer.9.sh +index c943bf9f..fc8d2bc3 100755 +--- a/scripts/crm-fence-peer.9.sh ++++ b/scripts/crm-fence-peer.9.sh +@@ -400,10 +400,18 @@ setup_crm_timeout_unit_ms() + # garbage", so we could get away with always appending "ms", but with + # 2.0.5, it became g_option_context_parse G_OPTION_ARG_INT, which + # "Cannot parse integer value “200ms” for --timeout" :-| +- if crmadmin --help 2>&1 | grep -q -e "--timeout=.*in milliseconds"; then +- crm_timeout_unit_ms="" +- else ++ # Can not parse the help text reliably, because they changed content ++ # and organisation of the help text between 2.0.4 and 2.0.5. ++ # Just try using ms unit, and see if it fails. ++ if crmadmin -t 100ms --version &> /dev/null; then ++ # this is either a recent version that actually understands ms ++ # as part of the TIMESPEC, or a version that still uses atoi(). + crm_timeout_unit_ms="ms" ++ else ++ # this one likely failed with ++ # crmadmin: Cannot parse integer value “100ms” for -t ++ # (>= 2.0.5, < 2.1) ++ crm_timeout_unit_ms="" + fi + } + +diff --git a/scripts/crm-fence-peer.sh b/scripts/crm-fence-peer.sh +index 96786734..b0e4e0f1 100755 +--- a/scripts/crm-fence-peer.sh ++++ b/scripts/crm-fence-peer.sh +@@ -252,10 +252,18 @@ setup_crm_timeout_unit_ms() + # garbage", so we could get away with always appending "ms", but with + # 2.0.5, it became g_option_context_parse G_OPTION_ARG_INT, which + # "Cannot parse integer value “200ms” for --timeout" :-| +- if crmadmin --help 2>&1 | grep -q -e "--timeout=.*in milliseconds"; then +- crm_timeout_unit_ms="" +- else ++ # Can not parse the help text reliably, because they changed content ++ # and organisation of the help text between 2.0.4 and 2.0.5. ++ # Just try using ms unit, and see if it fails. ++ if crmadmin -t 100ms --version &> /dev/null; then ++ # this is either a recent version that actually understands ms ++ # as part of the TIMESPEC, or a version that still uses atoi(). + crm_timeout_unit_ms="ms" ++ else ++ # this one likely failed with ++ # crmadmin: Cannot parse integer value “100ms” for -t ++ # (>= 2.0.5, < 2.1) ++ crm_timeout_unit_ms="" + fi + } + +-- +2.40.0 + diff --git a/drbd-utils.changes b/drbd-utils.changes index 9308dd2..d7cba1a 100644 --- a/drbd-utils.changes +++ b/drbd-utils.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Mon Mar 27 15:16:52 UTC 2023 - Nicholas Yang + +- bsc#1209783: crm-fence-peer incompatible with Pacemaker 2.1 and need backport 854a5f6 and 8a28be7 + ------------------------------------------------------------------- Thu Mar 23 06:22:17 UTC 2023 - Nicholas Yang diff --git a/drbd-utils.spec b/drbd-utils.spec index 0e5fd7c..aae6b20 100644 --- a/drbd-utils.spec +++ b/drbd-utils.spec @@ -48,6 +48,8 @@ Patch3: fence-after-pacemaker-down.patch Patch4: 0001-Disable-quorum-in-default-configuration-bsc-1032142.patch Patch5: move_fencing_from_disk_to_net_in_example.patch Patch6: pie-fix.patch +Patch7: 0001-crm-fence-peer-fix-timeout-with-Pacemaker-2.1-milli-.patch +Patch8: 0002-crm-fence-peer-fix-timeout-with-Pacemaker-2.0.5-mill.patch Patch99: rpmlint-build-error.patch Provides: drbd-bash-completion = %{version} @@ -99,6 +101,8 @@ raid 1. It is a building block for setting up clusters. %patch4 -p1 %patch5 -p1 %patch6 -p1 +%patch7 -p1 +%patch8 -p1 %patch99 -p1 %build