From: Martin Schwenke Date: Mon, 23 May 2016 10:23:18 +0000 (+1000) Subject: ctdb-ipalloc: New function ipalloc_set_public_ips() X-Git-Tag: tdb-1.3.10~543 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c47c35c5a69ebb1020a0c4538fa2f8de4b59e87;p=thirdparty%2Fsamba.git ctdb-ipalloc: New function ipalloc_set_public_ips() Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c index d5a96c51bce..b40bbadbf56 100644 --- a/ctdb/server/ctdb_takeover.c +++ b/ctdb/server/ctdb_takeover.c @@ -1619,8 +1619,10 @@ static void takeover_run_process_failures(struct ctdb_context *ctdb, * - Populate NoIPTakover tunable in IP allocation state * - Populate NoIPHost in IP allocation state, derived from node flags * and NoIPHostOnAllDisabled tunable - * - Retrieve and populate known and available IP lists in IP - * allocation state + * - Retrieve known and available IP addresses (done separately so + * values can be faked in unit testing) + * - Use ipalloc_set_public_ips() to set known and available IP + addresses for allocation * - If no available IP addresses then early exit * - Build list of (known IPs, currently assigned node) * - Populate list of nodes to force rebalance - internal structure, @@ -1697,8 +1699,11 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodem return -1; } - ipalloc_state->known_public_ips = known_ips; - ipalloc_state->available_public_ips = available_ips; + if (! ipalloc_set_public_ips(ipalloc_state, known_ips, available_ips)) { + DEBUG(DEBUG_ERR, ("Failed to set public IPs\n")); + talloc_free(tmp_ctx); + return -1; + } /* Short-circuit IP allocation if no node has available IPs */ can_host_ips = false; diff --git a/ctdb/server/ipalloc.c b/ctdb/server/ipalloc.c index ae9e8def2d8..fa2503db42b 100644 --- a/ctdb/server/ipalloc.c +++ b/ctdb/server/ipalloc.c @@ -28,6 +28,16 @@ #include "server/ipalloc_private.h" +bool ipalloc_set_public_ips(struct ipalloc_state *ipalloc_state, + struct ctdb_public_ip_list *known_ips, + struct ctdb_public_ip_list *available_ips) +{ + ipalloc_state->known_public_ips = known_ips; + ipalloc_state->available_public_ips = available_ips; + + return true; +} + /* The calculation part of the IP allocation algorithm. */ bool ipalloc(struct ipalloc_state *ipalloc_state) { diff --git a/ctdb/server/ipalloc.h b/ctdb/server/ipalloc.h index 1acaf35c96c..b5a1bcc849d 100644 --- a/ctdb/server/ipalloc.h +++ b/ctdb/server/ipalloc.h @@ -56,6 +56,10 @@ struct ipalloc_state { uint32_t *force_rebalance_nodes; }; +bool ipalloc_set_public_ips(struct ipalloc_state *ipalloc_state, + struct ctdb_public_ip_list *known_ips, + struct ctdb_public_ip_list *available_ips); + bool ipalloc(struct ipalloc_state *ipalloc_state); #endif /* __CTDB_IPALLOC_H__ */ diff --git a/ctdb/tests/src/ctdb_takeover_tests.c b/ctdb/tests/src/ctdb_takeover_tests.c index 9de3f2789f2..162de2b7359 100644 --- a/ctdb/tests/src/ctdb_takeover_tests.c +++ b/ctdb/tests/src/ctdb_takeover_tests.c @@ -309,8 +309,10 @@ static void ctdb_test_init(const char nodestates[], (*ctdb)->nodes[i]->flags = nodemap->nodes[i].flags; } - (*ipalloc_state)->available_public_ips = avail; - (*ipalloc_state)->known_public_ips = known; + if (! ipalloc_set_public_ips(*ipalloc_state, known, avail)) { + DEBUG(DEBUG_ERR, ("Failed to set public IPs\n")); + exit(1); + } set_ipflags_internal(*ipalloc_state, nodemap, tval_noiptakeover,