From 6f1f8814f22be507390b41956222fe14e5929e19 Mon Sep 17 00:00:00 2001 From: Lyncoln Date: Thu, 17 Sep 2026 18:27:46 -0400 Subject: [PATCH] Shadow database demotion checks from native path --- checksums/SHA256SUMS | 5 +- .../applications/postgresql/native_peers.sh | 55 +++++++++++++++++++ tests/run-all.sh | 1 + tests/test-demote-database-shadow.sh | 13 +++++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100755 tests/test-demote-database-shadow.sh diff --git a/checksums/SHA256SUMS b/checksums/SHA256SUMS index 92dca68..0fa0294 100644 --- a/checksums/SHA256SUMS +++ b/checksums/SHA256SUMS @@ -2,7 +2,7 @@ 5aa02fa065d1dba55486838fa4f0cd8eba982edaaf73cdc7d818223a09cbadc6 ocf/loxthelion/managed-container 10932919c4339b553c7c9dbf30b45a917c51c0a08f362e12678003d58b12fa82 ocf/loxthelion/managed-container.d/applications/postgresql/auth.sh 61d64b4a3a15c354f101ef34c5dc0425723f4204207d359b5377d2b9f04f6b23 ocf/loxthelion/managed-container.d/applications/postgresql/demote.sh -38323b217204132e572a9b1cfec8072773e502e49d6f0f96dfa2e565d332bbd1 ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh +98f2940d866fce1ed9a532129cbcc3e2b3aa34787866a326ca64626972593b80 ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh bcfde96b98f4727a8c97d42a39b7c6ec925b1b89d17ef67cc58eb7bd67afbfae ocf/loxthelion/managed-container.d/applications/postgresql/notify.sh 957a5a72ed277d0216e070abb80733483be3d421b9fa488e27fdd75bb2919548 ocf/loxthelion/managed-container.d/applications/postgresql/peer_config.sh 5091bc554915d1450fe939f94c0b0a370fecdb2ae5db9c4f0f55c340c0145519 ocf/loxthelion/managed-container.d/applications/postgresql/plugin.sh @@ -23,7 +23,8 @@ a42bb59a058ffeb59c1baa96e403856910bbbaea98f9104ff93daf4b5970c780 postgres-host/ 957a5a72ed277d0216e070abb80733483be3d421b9fa488e27fdd75bb2919548 postgres-host/postgres-ha-peer-config.sh deb09e3ae40629f43b262ba4f9a7ebf59a1dca3da9d8c94478f670aea28bd0e1 quadlet/postgres.container 04a125068677bbee6e71d313ca9d95d35faa32851b79de781cd7b9f466561445 quadlet/postgres.env.example -cd883d7defcbdd8911aece12160122efd896a47661d1ab86f676ee3d56733b3e tests/run-all.sh +cf2c9ea8aa6dada519df2305218907fa93fb5a09f0999bcc62fdd3728c3ce7c5 tests/run-all.sh +22d3eb56e8cd3ae1a58e2616f44abd3818f79d7e5df55c1c158e36dca7c77f42 tests/test-demote-database-shadow.sh 5e5d4fdd2b6c7e0b8b146de7aad06c1f96b221a10fec525b00d40e0d85709fb0 tests/test-entrypoint-structure.sh 2faee72cf2fdcbfa667c3e1c2a7aabc053b96a9b8127ff7440ddb717fd2dc314 tests/test-notify-daemon-shadow.sh 9150004af86a819d7d1b5ae2b3fa9d4ddd0480f55babd094137052109864b057 tests/test-notify-target-shadow.sh diff --git a/ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh b/ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh index 7b6b314..37eb7d8 100755 --- a/ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh +++ b/ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh @@ -29,6 +29,59 @@ mc_peer_write_recovery \"\$PGDATA\" \"\$1\" \"\$2\" \"\$3\" \"\$4\" \"\$5\"" sh "${REPLICATION_USER}" "${OCF_RESKEY_CRM_meta_on_node:-$(hostname)}" "${REPLICATION_SLOT}" } +mc_pg_demote_database_shadow() +{ + local socket_path resource response rc + + socket_path="${MC_PROXY_SOCKET:-/run/user/1000/managed-containerd/managed-containerd.sock}" + resource="${OCF_RESOURCE_INSTANCE:-}" + resource="${resource%%:*}" + + [ -n "${resource}" ] || return 0 + + response="$( + timeout --kill-after=1s 5s \ + python3 \ + "${MC_PROXY_CLIENT:-/usr/lib/ocf/resource.d/loxthelion/managed-container.d/proxy_client.py}" \ + "${socket_path}" \ + "${resource}" \ + "demote.database" \ + 10 \ + 11 + )" + rc=$? + + if [ "${rc}" -ne 0 ]; then + ocf_log warn \ + "managed-containerd demote.database shadow unavailable rc=${rc}" + return 0 + fi + + if MC_DAEMON_RESPONSE="${response}" python3 -c ' +import json +import os + +response = json.loads(os.environ["MC_DAEMON_RESPONSE"]) + +if ( + response.get("ocf_rc") != 0 + or response.get("ready") is not True + or response.get("mutation") is not False + or response.get("final_handoff_required") is not True +): + raise SystemExit(1) +'; then + ocf_log info \ + "managed-containerd demote.database shadow: comparison=MATCH response=${response}" + else + ocf_log err \ + "managed-containerd demote.database shadow MISMATCH response=${response}" + fi + + return 0 +} + + mc_pg_native_demote() ( local mc_native_started=${SECONDS} @@ -100,6 +153,8 @@ mc_pg_native_demote() return "${OCF_ERR_GENERIC}" } + mc_pg_demote_database_shadow + if [ "$(printf '%s' "${target_node}" | tr '[:upper:]' '[:lower:]')" = \ "$(printf '%s' "${local_node}" | tr '[:upper:]' '[:lower:]')" ]; then self_restart=true diff --git a/tests/run-all.sh b/tests/run-all.sh index d333c53..2f75fe5 100755 --- a/tests/run-all.sh +++ b/tests/run-all.sh @@ -26,6 +26,7 @@ python3 ./tests/test-proxy-client-actions.py python3 ./tests/test-proxy-client-parameters.py ./tests/test-notify-daemon-shadow.sh ./tests/test-notify-target-shadow.sh +./tests/test-demote-database-shadow.sh echo echo ">>> Python syntax" diff --git a/tests/test-demote-database-shadow.sh b/tests/test-demote-database-shadow.sh new file mode 100755 index 0000000..e73cfed --- /dev/null +++ b/tests/test-demote-database-shadow.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)" +FILE="$ROOT/ocf/loxthelion/managed-container.d/applications/postgresql/native_peers.sh" + +grep -q '^mc_pg_demote_database_shadow()' "$FILE" +grep -q '"demote.database"' "$FILE" +grep -q 'final_handoff_required' "$FILE" +grep -q 'comparison=MATCH' "$FILE" +grep -q 'demote.database shadow MISMATCH' "$FILE" + +echo "DEMOTE_DATABASE_SHADOW_TEST_PASS=1"