------------------------------------------------------------
revno: 651
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
branch nick: tridge
timestamp: Mon 2007-10-15 14:28:51 +1000
message:
  sync flags between nodes in monitor loop in recmaster
modified:
  server/ctdb_recoverd.c         recoverd.c-20070503213540-bvxuyd9jm1f7ig90-1
=== modified file 'server/ctdb_recoverd.c'
--- a/server/ctdb_recoverd.c    2007-10-15 04:17:49 +0000
+++ b/server/ctdb_recoverd.c    2007-10-15 04:28:51 +0000
@@ -713,6 +713,50 @@
        }
 }
 
+
+/*
+  update our local flags from all remote connected nodes. 
+ */
+static int update_local_flags(struct ctdb_context *ctdb, struct ctdb_node_map 
*nodemap)
+{
+       int j;
+       TALLOC_CTX *mem_ctx = talloc_new(ctdb);
+
+       /* get the nodemap for all active remote nodes and verify
+          they are the same as for this node
+        */
+       for (j=0; j<nodemap->num; j++) {
+               struct ctdb_node_map *remote_nodemap=NULL;
+               int ret;
+
+               if (nodemap->nodes[j].flags & NODE_FLAGS_DISCONNECTED) {
+                       continue;
+               }
+               if (nodemap->nodes[j].pnn == ctdb->pnn) {
+                       continue;
+               }
+
+               ret = ctdb_ctrl_getnodemap(ctdb, CONTROL_TIMEOUT(), 
nodemap->nodes[j].pnn, 
+                                          mem_ctx, &remote_nodemap);
+               if (ret != 0) {
+                       DEBUG(0, (__location__ " Unable to get nodemap from 
remote node %u\n", 
+                                 nodemap->nodes[j].pnn));
+                       talloc_free(mem_ctx);
+                       return -1;
+               }
+               if (nodemap->nodes[j].flags != remote_nodemap->nodes[j].flags) {
+                       DEBUG(0,("Remote node %u had flags 0x%x, local had 0x%x 
- updating local\n",
+                                nodemap->nodes[j].pnn, nodemap->nodes[j].flags,
+                                remote_nodemap->nodes[j].flags));
+                       nodemap->nodes[j].flags = 
remote_nodemap->nodes[j].flags;
+               }
+               talloc_free(remote_nodemap);
+       }
+       talloc_free(mem_ctx);
+       return 0;
+}
+
+
 /* Create a new random generation ip. 
    The generation id can not be the INVALID_GENERATION id
 */
@@ -1650,34 +1694,11 @@
        }
 
 
-       /* we are recovery master, go through the list of all connected nodes
-          and get the nodeflags from them and update our copy of nodeflags
-        */
-       for (j=0; j<nodemap->num; j++) {
-               if (nodemap->nodes[j].flags & NODE_FLAGS_DISCONNECTED) {
-                       continue;
-               }
-               if (nodemap->nodes[j].pnn == pnn) {
-                       continue;
-               }
-
-               ret = ctdb_ctrl_getnodemap(ctdb, CONTROL_TIMEOUT(), 
nodemap->nodes[j].pnn, 
-                                          mem_ctx, &remote_nodemap);
-               if (ret != 0) {
-                       DEBUG(0, (__location__ " Unable to get nodemap from 
remote node %u\n", 
-                                 nodemap->nodes[j].pnn));
-                       goto again;
-               }
-
-               /* update our nodemap flags according to the other
-                  server - this gets the NODE_FLAGS_DISABLED
-                  flag. Note that the remote node is authoritative
-                  for its flags (except CONNECTED, which we know
-                  matches in this code) */
-               if (nodemap->nodes[j].flags != remote_nodemap->nodes[j].flags) {
-                       nodemap->nodes[j].flags = 
remote_nodemap->nodes[j].flags;
-                       rec->need_takeover_run = true;
-               }
+       /* ensure our local copies of flags are right */
+       ret = update_local_flags(ctdb, nodemap);
+       if (ret != 0) {
+               DEBUG(0,("Unable to update local flags\n"));
+               goto again;
        }
 
        /* update the list of public ips that a node can handle for

Reply via email to