commit 4443e76aaccb60fb49f7c32eb2c0a34e0965a291 Author: Andrew Beekhof 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,