summaryrefslogtreecommitdiffstats
path: root/daemons/controld/controld_callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemons/controld/controld_callbacks.c')
-rw-r--r--daemons/controld/controld_callbacks.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/daemons/controld/controld_callbacks.c b/daemons/controld/controld_callbacks.c
index d578adc..7078739 100644
--- a/daemons/controld/controld_callbacks.c
+++ b/daemons/controld/controld_callbacks.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2022 the Pacemaker project contributors
+ * Copyright 2004-2023 the Pacemaker project contributors
*
* The version control history for this file may have further details.
*
@@ -107,6 +107,8 @@ peer_update_callback(enum crm_status_type type, crm_node_t * node, const void *d
bool appeared = FALSE;
bool is_remote = pcmk_is_set(node->flags, crm_remote_node);
+ controld_node_pending_timer(node);
+
/* The controller waits to receive some information from the membership
* layer before declaring itself operational. If this is being called for a
* cluster node, indicate that we have it.
@@ -274,13 +276,14 @@ peer_update_callback(enum crm_status_type type, crm_node_t * node, const void *d
if (down) {
const char *task = crm_element_value(down->xml, XML_LRM_ATTR_TASK);
- if (pcmk__str_eq(task, CRM_OP_FENCE, pcmk__str_casei)) {
+ if (pcmk__str_eq(task, PCMK_ACTION_STONITH, pcmk__str_casei)) {
/* tengine_stonith_callback() confirms fence actions */
crm_trace("Updating CIB %s fencer reported fencing of %s complete",
(pcmk_is_set(down->flags, pcmk__graph_action_confirmed)? "after" : "before"), node->uname);
- } else if (!appeared && pcmk__str_eq(task, CRM_OP_SHUTDOWN, pcmk__str_casei)) {
+ } else if (!appeared && pcmk__str_eq(task, PCMK_ACTION_DO_SHUTDOWN,
+ pcmk__str_casei)) {
// Shutdown actions are immediately confirmed (i.e. no_wait)
if (!is_remote) {
@@ -342,6 +345,17 @@ peer_update_callback(enum crm_status_type type, crm_node_t * node, const void *d
}
}
+ if (!appeared && (type == crm_status_processes)
+ && (node->when_member > 1)) {
+ /* The node left CPG but is still a cluster member. Set its
+ * membership time to 1 to record it in the cluster state as a
+ * boolean, so we don't fence it due to node-pending-timeout.
+ */
+ node->when_member = 1;
+ flags |= node_update_cluster;
+ controld_node_pending_timer(node);
+ }
+
/* Update the CIB node state */
update = create_node_state_update(node, flags, NULL, __func__);
if (update == NULL) {