server: use CTDB_PUBLIC_IP_FLAGS_ONLY_AVAILABLE during a takeover run
authorStefan Metzmacher <metze@samba.org>
Wed, 16 Dec 2009 15:09:40 +0000 (16:09 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 20 Jan 2010 10:10:59 +0000 (11:10 +0100)
We know ask for the known and available interfaces.
This means a node gets a RELEASE_IP event for all interfaces
it "knows", but doesn't serve and a node only gets a TAKE_IP event
for "available" interfaces.

metze

include/ctdb_private.h
server/ctdb_recoverd.c
server/ctdb_takeover.c

index 217821313a1dc15ceec14300c0524e989ce718ed..b9ca5cb02bb3c6498e91b5febba3fcef86fe9798 100644 (file)
@@ -246,7 +246,8 @@ struct ctdb_node {
           across the nodes.  it needs to know which public ip's can be handled
           by each node.
        */
-       struct ctdb_all_public_ips *public_ips;
+       struct ctdb_all_public_ips *known_public_ips;
+       struct ctdb_all_public_ips *available_public_ips;
        /* used by the recovery dameon to track when a node should be banned */
        struct ctdb_banning_state *ban_state; 
 };
index 1c3b213da77c856b7c411105169296d3542c125b..b6cd1ea684a95eefd2d33101190e1307f4b3ff6f 100644 (file)
@@ -3010,9 +3010,13 @@ again:
        }
        for (j=0; j<nodemap->num; j++) {
                /* release any existing data */
-               if (ctdb->nodes[j]->public_ips) {
-                       talloc_free(ctdb->nodes[j]->public_ips);
-                       ctdb->nodes[j]->public_ips = NULL;
+               if (ctdb->nodes[j]->known_public_ips) {
+                       talloc_free(ctdb->nodes[j]->known_public_ips);
+                       ctdb->nodes[j]->known_public_ips = NULL;
+               }
+               if (ctdb->nodes[j]->available_public_ips) {
+                       talloc_free(ctdb->nodes[j]->available_public_ips);
+                       ctdb->nodes[j]->available_public_ips = NULL;
                }
 
                if (nodemap->nodes[j].flags & NODE_FLAGS_INACTIVE) {
@@ -3020,11 +3024,27 @@ again:
                }
 
                /* grab a new shiny list of public ips from the node */
-               if (ctdb_ctrl_get_public_ips(ctdb, CONTROL_TIMEOUT(),
-                       ctdb->nodes[j]->pnn, 
-                       ctdb->nodes,
-                       &ctdb->nodes[j]->public_ips)) {
-                       DEBUG(DEBUG_ERR,("Failed to read public ips from node : %u\n", 
+               ret = ctdb_ctrl_get_public_ips_flags(ctdb,
+                                       CONTROL_TIMEOUT(),
+                                       ctdb->nodes[j]->pnn,
+                                       ctdb->nodes,
+                                       0,
+                                       &ctdb->nodes[j]->known_public_ips);
+               if (ret != 0) {
+                       DEBUG(DEBUG_ERR,("Failed to read known public ips from node : %u\n",
+                               ctdb->nodes[j]->pnn));
+                       goto again;
+               }
+
+               /* grab a new shiny list of public ips from the node */
+               ret = ctdb_ctrl_get_public_ips_flags(ctdb,
+                                       CONTROL_TIMEOUT(),
+                                       ctdb->nodes[j]->pnn,
+                                       ctdb->nodes,
+                                       CTDB_PUBLIC_IP_FLAGS_ONLY_AVAILABLE,
+                                       &ctdb->nodes[j]->available_public_ips);
+               if (ret != 0) {
+                       DEBUG(DEBUG_ERR,("Failed to read available public ips from node : %u\n",
                                ctdb->nodes[j]->pnn));
                        goto again;
                }
index d7dfa71c735c33492d9100f3a517d9fc49f2a9b5..0f8fd1cf1620a9b5812e37b0094f793da8425c0f 100644 (file)
@@ -820,7 +820,7 @@ static int can_node_serve_ip(struct ctdb_context *ctdb, int32_t pnn,
        struct ctdb_all_public_ips *public_ips;
        int i;
 
-       public_ips = ctdb->nodes[pnn]->public_ips;
+       public_ips = ctdb->nodes[pnn]->available_public_ips;
 
        if (public_ips == NULL) {
                return -1;
@@ -937,7 +937,7 @@ create_merged_ip_list(struct ctdb_context *ctdb, TALLOC_CTX *tmp_ctx)
        ip_tree = trbt_create(tmp_ctx, 0);
 
        for (i=0;i<ctdb->num_nodes;i++) {
-               public_ips = ctdb->nodes[i]->public_ips;
+               public_ips = ctdb->nodes[i]->known_public_ips;
 
                if (ctdb->nodes[i]->flags & NODE_FLAGS_DELETED) {
                        continue;