summaryrefslogtreecommitdiffstats
path: root/ctdb
diff options
context:
space:
mode:
Diffstat (limited to 'ctdb')
-rw-r--r--ctdb/include/ctdb_private.h3
-rw-r--r--ctdb/server/ctdb_recoverd.c36
-rw-r--r--ctdb/server/ctdb_takeover.c4
3 files changed, 32 insertions, 11 deletions
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index 217821313a..b9ca5cb02b 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -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;
};
diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c
index 1c3b213da7..b6cd1ea684 100644
--- a/ctdb/server/ctdb_recoverd.c
+++ b/ctdb/server/ctdb_recoverd.c
@@ -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;
}
diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c
index d7dfa71c73..0f8fd1cf16 100644
--- a/ctdb/server/ctdb_takeover.c
+++ b/ctdb/server/ctdb_takeover.c
@@ -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;