From 2eb0b9e98ad4de4a2c9f376ff98558cd855fab53 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Wed, 22 Jun 2016 11:37:52 +1000 Subject: [PATCH] ctdb-ipalloc: Switch set_ipflags_internal() to use a new-style node map Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- ctdb/server/ctdb_takeover.c | 41 ++++++++++++++++++++++++---- ctdb/tests/src/ctdb_takeover_tests.c | 18 ++++++------ 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c index 00e06715c5e..5b4f7958a90 100644 --- a/ctdb/server/ctdb_takeover.c +++ b/ctdb/server/ctdb_takeover.c @@ -1185,12 +1185,13 @@ ctdb_fetch_remote_public_ips(struct ctdb_context *ctdb, return public_ips; } -static bool all_nodes_are_disabled(struct ctdb_node_map_old *nodemap) +static bool all_nodes_are_disabled(struct ctdb_node_map *nodemap) { int i; for (i=0;inum;i++) { - if (!(nodemap->nodes[i].flags & (NODE_FLAGS_INACTIVE|NODE_FLAGS_DISABLED))) { + if (!(nodemap->node[i].flags & + (NODE_FLAGS_INACTIVE|NODE_FLAGS_DISABLED))) { /* Found one completely healthy node */ return false; } @@ -1321,7 +1322,7 @@ static uint32_t *get_tunable_from_nodes(struct ctdb_context *ctdb, * Set NOIPHOST ip flags for disabled nodes */ static void set_ipflags_internal(struct ipalloc_state *ipalloc_state, - struct ctdb_node_map_old *nodemap, + struct ctdb_node_map *nodemap, uint32_t *tval_noiptakeover, uint32_t *tval_noiphostonalldisabled) { @@ -1334,7 +1335,7 @@ static void set_ipflags_internal(struct ipalloc_state *ipalloc_state, } /* Can not host IPs on INACTIVE node */ - if (nodemap->nodes[i].flags & NODE_FLAGS_INACTIVE) { + if (nodemap->node[i].flags & NODE_FLAGS_INACTIVE) { ipalloc_state->noiphost[i] = true; } } @@ -1353,19 +1354,41 @@ static void set_ipflags_internal(struct ipalloc_state *ipalloc_state, * IPs on DISABLED node */ for (i=0;inum;i++) { - if (nodemap->nodes[i].flags & NODE_FLAGS_DISABLED) { + if (nodemap->node[i].flags & NODE_FLAGS_DISABLED) { ipalloc_state->noiphost[i] = true; } } } } +static struct ctdb_node_map * +ctdb_node_map_old_to_new(TALLOC_CTX *mem_ctx, + const struct ctdb_node_map_old *old) +{ + struct ctdb_node_map *new; + + new = talloc(mem_ctx, struct ctdb_node_map); + if (new == NULL) { + DEBUG(DEBUG_ERR, (__location__ " out of memory\n")); + return NULL; + } + new->num = old->num; + new->node = talloc_zero_array(new, + struct ctdb_node_and_flags, new->num); + memcpy(new->node, &old->nodes[0], + sizeof(struct ctdb_node_and_flags) * new->num); + + return new; +} + + static bool set_ipflags(struct ctdb_context *ctdb, struct ipalloc_state *ipalloc_state, struct ctdb_node_map_old *nodemap) { uint32_t *tval_noiptakeover; uint32_t *tval_noiphostonalldisabled; + struct ctdb_node_map *new; tval_noiptakeover = get_tunable_from_nodes(ctdb, ipalloc_state, nodemap, "NoIPTakeover", 0); @@ -1381,12 +1404,18 @@ static bool set_ipflags(struct ctdb_context *ctdb, return false; } - set_ipflags_internal(ipalloc_state, nodemap, + new = ctdb_node_map_old_to_new(ipalloc_state, nodemap); + if (new == NULL) { + return false; + } + + set_ipflags_internal(ipalloc_state, new, tval_noiptakeover, tval_noiphostonalldisabled); talloc_free(tval_noiptakeover); talloc_free(tval_noiphostonalldisabled); + talloc_free(new); return true; } diff --git a/ctdb/tests/src/ctdb_takeover_tests.c b/ctdb/tests/src/ctdb_takeover_tests.c index 1e8e573d5b8..20d4b3404fa 100644 --- a/ctdb/tests/src/ctdb_takeover_tests.c +++ b/ctdb/tests/src/ctdb_takeover_tests.c @@ -239,7 +239,7 @@ static void ctdb_test_init(const char nodestates[], struct ctdb_public_ip_list *avail; int i; char *tok, *ns, *t; - struct ctdb_node_map_old *nodemap; + struct ctdb_node_map *nodemap; uint32_t *tval_noiptakeover; uint32_t *tval_noiptakeoverondisabled; ctdb_sock_addr sa_zero = { .ip = { 0 } }; @@ -249,19 +249,17 @@ static void ctdb_test_init(const char nodestates[], /* Avoid that const */ ns = talloc_strdup(*ctdb, nodestates); - nodemap = talloc_zero(*ctdb, struct ctdb_node_map_old); + nodemap = talloc_zero(*ctdb, struct ctdb_node_map); assert(nodemap != NULL); nodemap->num = 0; tok = strtok(ns, ","); while (tok != NULL) { uint32_t n = nodemap->num; - size_t size = - offsetof(struct ctdb_node_map_old, nodes) + - (n + 1) * sizeof(struct ctdb_node_and_flags); - nodemap = talloc_realloc_size(*ctdb, nodemap, size); - nodemap->nodes[n].pnn = n; - nodemap->nodes[n].flags = (uint32_t) strtol(tok, NULL, 0); - nodemap->nodes[n].addr = sa_zero; + nodemap->node = talloc_realloc(nodemap, nodemap->node, + struct ctdb_node_and_flags, n+1); + nodemap->node[n].pnn = n; + nodemap->node[n].flags = (uint32_t) strtol(tok, NULL, 0); + nodemap->node[n].addr = sa_zero; nodemap->num++; tok = strtok(NULL, ","); } @@ -307,7 +305,7 @@ static void ctdb_test_init(const char nodestates[], for (i=0; i < nodemap->num; i++) { (*ctdb)->nodes[i] = talloc(*ctdb, struct ctdb_node); (*ctdb)->nodes[i]->pnn = i; - (*ctdb)->nodes[i]->flags = nodemap->nodes[i].flags; + (*ctdb)->nodes[i]->flags = nodemap->node[i].flags; } if (! ipalloc_set_public_ips(*ipalloc_state, known, avail)) {