commit 4443e76aaccb60fb49f7c32eb2c0a34e0965a291
Author: Andrew Beekhof <andrew@beekhof.net>
Date: Wed Oct 2 09:00:39 2013 +1000
Fix: crmd: Correctly update expected state when the previous DC shuts down
(cherry picked from commit 25ebce69ecc07799b50cf6e0ca4704345e7cf336)
diff --git a/crmd/join_dc.c b/crmd/join_dc.c
index b45fff2..5e6c827 100644
--- a/crmd/join_dc.c
+++ b/crmd/join_dc.c
@@ -103,17 +103,19 @@ initialize_join(gboolean before)
static void
join_make_offer(gpointer key, gpointer value, gpointer user_data)
{
- const char *join_to = NULL;
- const crm_node_t *member = value;
+ xmlNode *offer = NULL;
+ crm_node_t *member = (crm_node_t *)value;
CRM_ASSERT(member != NULL);
if (crm_is_peer_active(member) == FALSE) {
- crm_trace("Not making an offer to %s: not active", member->uname);
+ crm_info("Not making an offer to %s: not active (%s)", member->uname, member->state);
+ if(member->expected == NULL && safe_str_eq(member->state, CRM_NODE_LOST)) {
+ crm_update_peer_expected(__FUNCTION__, member, CRMD_JOINSTATE_DOWN);
+ }
return;
}
- join_to = member->uname;
- if (join_to == NULL) {
+ if (member->uname == NULL) {
crm_err("No recipient for welcome message");
return;
}
@@ -130,26 +132,18 @@ join_make_offer(gpointer key, gpointer value, gpointer user_data)
crm_update_peer_join(__FUNCTION__, (crm_node_t*)member, crm_join_none);
- if (crm_is_peer_active(member)) {
- crm_node_t *peer = crm_get_peer(0, join_to);
- xmlNode *offer = create_request(CRM_OP_JOIN_OFFER, NULL, join_to,
- CRM_SYSTEM_CRMD, CRM_SYSTEM_DC, NULL);
-
- crm_xml_add_int(offer, F_CRM_JOIN_ID, current_join_id);
- /* send the welcome */
- crm_info("join-%d: Sending offer to %s", current_join_id, join_to);
+ offer = create_request(CRM_OP_JOIN_OFFER, NULL, member->uname,
+ CRM_SYSTEM_CRMD, CRM_SYSTEM_DC, NULL);
- send_cluster_message(peer, crm_msg_crmd, offer, TRUE);
- free_xml(offer);
+ crm_xml_add_int(offer, F_CRM_JOIN_ID, current_join_id);
+ /* send the welcome */
+ crm_info("join-%d: Sending offer to %s", current_join_id, member->uname);
- crm_update_peer_join(__FUNCTION__, peer, crm_join_welcomed);
- /* crm_update_peer_expected(__FUNCTION__, member, CRMD_JOINSTATE_PENDING); */
-
- } else {
- crm_info("Peer process on %s is not active (yet?): %.8lx %d",
- join_to, (long)member->processes, g_hash_table_size(crm_peer_cache));
- }
+ send_cluster_message(member, crm_msg_crmd, offer, TRUE);
+ free_xml(offer);
+ crm_update_peer_join(__FUNCTION__, member, crm_join_welcomed);
+ /* crm_update_peer_expected(__FUNCTION__, member, CRMD_JOINSTATE_PENDING); */
}
/* A_DC_JOIN_OFFER_ALL */
diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c
index e3082b4..e7d5b69 100644
--- a/lib/cluster/membership.c
+++ b/lib/cluster/membership.c
@@ -532,8 +532,8 @@ crm_update_peer_expected(const char *source, crm_node_t * node, const char *expe
}
if (changed) {
- crm_info("%s: Node %s[%u] - expected state is now %s", source, node->uname, node->id,
- expected);
+ crm_info("%s: Node %s[%u] - expected state is now %s (was %s)", source, node->uname, node->id,
+ expected, last);
free(last);
} else {
crm_trace("%s: Node %s[%u] - expected state is unchanged (%s)", source, node->uname,