Blame SOURCES/bz720543-pcmk-crmd_correctly_update_expected_state_when_the_previous_dc_shuts_down.patch

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