diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-12-16 16:09:40 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2010-01-20 11:10:59 +0100 |
commit | 37880b0d0a600f01a7217f32e4b763463ea7975a (patch) | |
tree | bd001ad3d212c6b04d3a0e3a1517dac690fbe522 /ctdb | |
parent | d89604afabf7cfb606fa993720f78553e3c35987 (diff) | |
download | samba-37880b0d0a600f01a7217f32e4b763463ea7975a.tar.gz samba-37880b0d0a600f01a7217f32e4b763463ea7975a.tar.xz samba-37880b0d0a600f01a7217f32e4b763463ea7975a.zip |
server: use CTDB_PUBLIC_IP_FLAGS_ONLY_AVAILABLE during a takeover run
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
(This used to be ctdb commit a695a38e49e7c3e15a9706392dc920eeab1f11ba)
Diffstat (limited to 'ctdb')
-rw-r--r-- | ctdb/include/ctdb_private.h | 3 | ||||
-rw-r--r-- | ctdb/server/ctdb_recoverd.c | 36 | ||||
-rw-r--r-- | ctdb/server/ctdb_takeover.c | 4 |
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; |