Blame SOURCES/0024-Refactor-membership-Safely-autoreap-nodes-without-co.patch

3d71c6
From: Andrew Beekhof <andrew@beekhof.net>
3d71c6
Date: Tue, 8 Sep 2015 12:05:04 +1000
3d71c6
Subject: [PATCH] Refactor: membership: Safely autoreap nodes without code
3d71c6
 duplication
3d71c6
3d71c6
(cherry picked from commit acd660a1bdf40ada599041cb14d2128632d2e7a5)
3d71c6
---
3d71c6
 lib/cluster/membership.c | 43 +++++++++++++++++++++----------------------
3d71c6
 1 file changed, 21 insertions(+), 22 deletions(-)
3d71c6
3d71c6
diff --git a/lib/cluster/membership.c b/lib/cluster/membership.c
3d71c6
index b7958eb..3081e54 100644
3d71c6
--- a/lib/cluster/membership.c
3d71c6
+++ b/lib/cluster/membership.c
3d71c6
@@ -795,8 +795,8 @@ crm_update_peer_expected(const char *source, crm_node_t * node, const char *expe
3d71c6
  *       called within a cache iteration if reaping is possible,
3d71c6
  *       otherwise reaping could invalidate the iterator.
3d71c6
  */
3d71c6
-crm_node_t *
3d71c6
-crm_update_peer_state(const char *source, crm_node_t * node, const char *state, int membership)
3d71c6
+static crm_node_t *
3d71c6
+crm_update_peer_state_iter(const char *source, crm_node_t * node, const char *state, int membership, GHashTableIter *iter)
3d71c6
 {
3d71c6
     gboolean is_member;
3d71c6
 
3d71c6
@@ -822,13 +822,19 @@ crm_update_peer_state(const char *source, crm_node_t * node, const char *state,
3d71c6
         free(last);
3d71c6
 
3d71c6
         if (!is_member && crm_autoreap) {
3d71c6
-            if (status_type == crm_status_rstate) {
3d71c6
+            if(iter) {
3d71c6
+                crm_notice("Purged 1 peer with id=%u and/or uname=%s from the membership cache", node->id, node->uname);
3d71c6
+                g_hash_table_iter_remove(iter);
3d71c6
+
3d71c6
+            } else if (status_type == crm_status_rstate) {
3d71c6
                 crm_remote_peer_cache_remove(node->uname);
3d71c6
+
3d71c6
             } else {
3d71c6
                 reap_crm_member(node->id, node->uname);
3d71c6
             }
3d71c6
             node = NULL;
3d71c6
         }
3d71c6
+
3d71c6
     } else {
3d71c6
         crm_trace("%s: Node %s[%u] - state is unchanged (%s)", source, node->uname, node->id,
3d71c6
                   state);
3d71c6
@@ -836,6 +842,12 @@ crm_update_peer_state(const char *source, crm_node_t * node, const char *state,
3d71c6
     return node;
3d71c6
 }
3d71c6
 
3d71c6
+crm_node_t *
3d71c6
+crm_update_peer_state(const char *source, crm_node_t * node, const char *state, int membership)
3d71c6
+{
3d71c6
+    return crm_update_peer_state_iter(source, node, state, membership, NULL);
3d71c6
+}
3d71c6
+
3d71c6
 /*!
3d71c6
  * \internal
3d71c6
  * \brief Reap all nodes from cache whose membership information does not match
3d71c6
@@ -853,26 +865,13 @@ crm_reap_unseen_nodes(uint64_t membership)
3d71c6
     while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&node)) {
3d71c6
         if (node->last_seen != membership) {
3d71c6
             if (node->state) {
3d71c6
-                /* crm_update_peer_state() cannot be called here, because that
3d71c6
-                 * might modify the peer cache, invalidating our iterator
3d71c6
+                /*
3d71c6
+                 * Calling crm_update_peer_state_iter() allows us to
3d71c6
+                 * remove the node from crm_peer_cache without
3d71c6
+                 * invalidating our iterator
3d71c6
                  */
3d71c6
-                if (safe_str_eq(node->state, CRM_NODE_LOST)) {
3d71c6
-                    crm_trace("Node %s[%u] - state is unchanged (%s)",
3d71c6
-                              node->uname, node->id, CRM_NODE_LOST);
3d71c6
-                } else {
3d71c6
-                    char *last = node->state;
3d71c6
-
3d71c6
-                    node->state = strdup(CRM_NODE_LOST);
3d71c6
-                    crm_notice("Node %s[%u] - state is now %s (was %s)",
3d71c6
-                               node->uname, node->id, CRM_NODE_LOST, last);
3d71c6
-                    if (crm_status_callback) {
3d71c6
-                        crm_status_callback(crm_status_nstate, node, last);
3d71c6
-                    }
3d71c6
-                    if (crm_autoreap) {
3d71c6
-                        g_hash_table_iter_remove(&iter);
3d71c6
-                    }
3d71c6
-                    free(last);
3d71c6
-                }
3d71c6
+                crm_update_peer_state_iter(__FUNCTION__, node, CRM_NODE_LOST, membership, &iter);
3d71c6
+
3d71c6
             } else {
3d71c6
                 crm_info("State of node %s[%u] is still unknown",
3d71c6
                          node->uname, node->id);