Handle PostgreSQL self-restart demotion preflight

This commit is contained in:
Lyncoln
2026-09-18 09:43:35 -04:00
parent 1e72dda238
commit 06c106c57c
3 changed files with 175 additions and 0 deletions
+62
View File
@@ -802,6 +802,47 @@ def demote_prepare(config, runtime_state, request_parameters):
"successor_node": successor_node,
}
promoted_nodes = {
str(name).strip().lower()
for name in str(
notification.get("promoted_uname", "")
).split()
if str(name).strip()
}
if successor_node == node_name:
if node_name not in promoted_nodes:
return {
"ocf_rc": 1,
"ready": False,
"reason": "self_restart_not_current_primary",
"node": node_name,
"target_node": target_node,
"successor_node": successor_node,
}
return {
"ocf_rc": 0,
"ready": False,
"identity_validated": True,
"reason": "local_restart_checks_pending",
"mutation": False,
"node": node_name,
"target_node": target_node,
"successor_node": successor_node,
"handoff_mode": "local_restart",
"final_handoff_required": False,
"age_seconds": age,
"checks": {
"notification": True,
"local_target": True,
"self_successor": True,
"local_currently_promoted": True,
"postgresql_mutated": False,
"database_checks": False,
},
}
if not successor_node:
return {
"ocf_rc": 1,
@@ -885,6 +926,7 @@ def demote_database(config, runtime_state, request_parameters):
if preparation.get("reason") not in (
"database_checks_pending",
"local_restart_checks_pending",
):
return preparation
@@ -898,6 +940,26 @@ def demote_database(config, runtime_state, request_parameters):
"local": local["ha"],
}
if preparation.get("reason") == "local_restart_checks_pending":
return {
"ocf_rc": 0,
"ready": True,
"mutation": False,
"final_handoff_required": False,
"handoff_mode": "local_restart",
"reason": "local_restart_demotion_ready",
"node": preparation["node"],
"target_node": preparation["target_node"],
"successor_node": preparation["successor_node"],
"checks": {
"notification": True,
"local_target": True,
"local_primary": True,
"self_successor": True,
"remote_handoff_required": False,
},
}
successor_node = preparation["successor_node"]
peers = parse_replication_peers(
config.get("PG_REPLICATION_PEERS", "")