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);
- if (tval_noiptakeover == NULL) {
- return false;
- }
-
tval_noiphostonalldisabled =
get_tunable_from_nodes(ctdb, ipalloc_state, nodemap,
"NoIPHostOnAllDisabled", 0);
}
ipalloc_set_node_flags(ipalloc_state, new,
- tval_noiptakeover,
tval_noiphostonalldisabled);
- talloc_free(tval_noiptakeover);
talloc_free(tval_noiphostonalldisabled);
talloc_free(new);
ipalloc_state = ipalloc_state_init(tmp_ctx, ctdb->num_nodes,
determine_algorithm(&ctdb->tunable),
+ (ctdb->tunable.no_ip_takeover != 0),
(ctdb->tunable.no_ip_failback != 0),
force_rebalance_nodes);
if (ipalloc_state == NULL) {
ipalloc_state_init(TALLOC_CTX *mem_ctx,
uint32_t num_nodes,
enum ipalloc_algorithm algorithm,
+ bool no_ip_takeover,
bool no_ip_failback,
uint32_t *force_rebalance_nodes)
{
ipalloc_state->num = num_nodes;
- ipalloc_state->noiptakeover =
- talloc_zero_array(ipalloc_state,
- bool,
- ipalloc_state->num);
- if (ipalloc_state->noiptakeover == NULL) {
- DEBUG(DEBUG_ERR, (__location__ " Out of memory\n"));
- goto fail;
- }
ipalloc_state->noiphost =
talloc_zero_array(ipalloc_state,
bool,
}
ipalloc_state->algorithm = algorithm;
+ ipalloc_state->no_ip_takeover = no_ip_takeover;
ipalloc_state->no_ip_failback = no_ip_failback;
ipalloc_state->force_rebalance_nodes = force_rebalance_nodes;
/* Set internal flags for IP allocation:
* Clear ip flags
- * Set NOIPTAKOVER ip flags from per-node NoIPTakeover tunable
* Set NOIPHOST ip flag for each INACTIVE node
* if all nodes are disabled:
* Set NOIPHOST ip flags from per-node NoIPHostOnAllDisabled tunable
*/
void ipalloc_set_node_flags(struct ipalloc_state *ipalloc_state,
struct ctdb_node_map *nodemap,
- uint32_t *tval_noiptakeover,
uint32_t *tval_noiphostonalldisabled)
{
int i;
for (i=0;i<nodemap->num;i++) {
- /* Can not take IPs on node with NoIPTakeover set */
- if (tval_noiptakeover[i] != 0) {
- ipalloc_state->noiptakeover[i] = true;
- }
-
/* Can not host IPs on INACTIVE node */
if (nodemap->node[i].flags & NODE_FLAGS_INACTIVE) {
ipalloc_state->noiphost[i] = true;
struct ipalloc_state * ipalloc_state_init(TALLOC_CTX *mem_ctx,
uint32_t num_nodes,
enum ipalloc_algorithm algorithm,
+ bool no_ip_takeover,
bool no_ip_failback,
uint32_t *force_rebalance_nodes);
void ipalloc_set_node_flags(struct ipalloc_state *ipalloc_state,
struct ctdb_node_map *nodemap,
- uint32_t *tval_noiptakeover,
uint32_t *tval_noiphostonalldisabled);
void ipalloc_set_public_ips(struct ipalloc_state *ipalloc_state,
int32_t pnn,
struct public_ip_list *ip)
{
- if (ipalloc_state->noiptakeover[pnn]) {
+ if (ipalloc_state->no_ip_takeover) {
return false;
}
/* Arrays with data for each node */
struct ctdb_public_ip_list *available_public_ips;
struct ctdb_public_ip_list *known_public_ips;
- bool *noiptakeover;
bool *noiphost;
struct public_ip_list *all_ips;
enum ipalloc_algorithm algorithm;
bool no_ip_failback;
+ bool no_ip_takeover;
uint32_t *force_rebalance_nodes;
};
echo "Number of addresses on node 1 : $num"
-echo "Turning on NoIPTakeover on node 1"
-try_command_on_node 1 "$CTDB setvar NoIPTakeover 1"
+echo "Turning on NoIPTakeover on all nodes"
+try_command_on_node all "$CTDB setvar NoIPTakeover 1"
try_command_on_node 1 "$CTDB ipreallocate"
echo Disable node 1
{
struct ctdb_public_ip_list *known;
struct ctdb_public_ip_list *avail;
- char *tok, *ns, *t;
+ char *tok, *ns;
+ const char *t;
struct ctdb_node_map *nodemap;
- uint32_t *tval_noiptakeover;
+ uint32_t noiptakeover;
uint32_t *tval_noiptakeoverondisabled;
ctdb_sock_addr sa_zero = { .ip = { 0 } };
enum ipalloc_algorithm algorithm;
}
}
+ t = getenv("CTDB_SET_NoIPTakeover");
+ if (t != NULL) {
+ noiptakeover = (uint32_t) strtol(t, NULL, 0);
+ } else {
+ noiptakeover = 0;
+ }
+
*ipalloc_state = ipalloc_state_init(mem_ctx, nodemap->num,
algorithm,
+ (noiptakeover != 0),
false, NULL);
assert(*ipalloc_state != NULL);
ipalloc_set_public_ips(*ipalloc_state, known, avail);
- tval_noiptakeover = get_tunable_values(mem_ctx, nodemap->num,
- "CTDB_SET_NoIPTakeover");
- assert(tval_noiptakeover != NULL);
tval_noiptakeoverondisabled =
get_tunable_values(mem_ctx, nodemap->num,
"CTDB_SET_NoIPHostOnAllDisabled");
assert(tval_noiptakeoverondisabled != NULL);
ipalloc_set_node_flags(*ipalloc_state, nodemap,
- tval_noiptakeover,
tval_noiptakeoverondisabled);
}
. "${TEST_SCRIPTS_DIR}/unit.sh"
-define_test "Node with NODE_FLAGS_NOIPTAKEOVER doesn't gain IPs"
+define_test "NoIPTakeover - nodes don't gain IPs"
export CTDB_TEST_LOGLEVEL=ERR
required_result <<EOF
192.168.21.254 1
-192.168.21.253 2
+192.168.21.253 1
192.168.21.252 1
-192.168.20.254 2
-192.168.20.253 2
+192.168.20.254 1
+192.168.20.253 1
192.168.20.252 1
-192.168.20.251 2
+192.168.20.251 1
192.168.20.250 1
192.168.20.249 1
EOF
-export CTDB_SET_NoIPTakeover="1,0,0"
+export CTDB_SET_NoIPTakeover=1
simple_test 0,0,0 <<EOF
192.168.20.249 1
. "${TEST_SCRIPTS_DIR}/unit.sh"
-define_test "Node with NODE_FLAGS_NOIPTAKEOVER doesn't lose IPs"
+define_test "NoIPTakeover: nodes don't lose IPs"
export CTDB_TEST_LOGLEVEL=ERR
192.168.20.249 0
EOF
-export CTDB_SET_NoIPTakeover="1,0,0"
+export CTDB_SET_NoIPTakeover=1
simple_test 0,0,0 <<EOF
192.168.20.249 0
. "${TEST_SCRIPTS_DIR}/unit.sh"
-define_test "3 nodes, 2->3 unhealthy, all IPs assigned, split NoIPTakeover"
+define_test "3 nodes, 2->3 unhealthy, all IPs assigned, NoIPTakeover"
export CTDB_TEST_LOGLEVEL=ERR
-# We expect 1/2 the IPs to move, but the rest to stay (as opposed to
-# NoIPHostOnAllDisabled)
+# We expect the IPs stay where they are (as opposed to
+# NoIPHostOnAllDisabled). IPs are hosted when all nodes are disabled,
+# but they have nowhere else to go because of NoIPTakeover.
required_result <<EOF
192.168.21.254 2
-192.168.21.253 0
+192.168.21.253 2
192.168.21.252 2
-192.168.20.254 0
-192.168.20.253 0
+192.168.20.254 2
+192.168.20.253 2
192.168.20.252 2
-192.168.20.251 0
+192.168.20.251 2
192.168.20.250 2
192.168.20.249 2
EOF
-export CTDB_SET_NoIPTakeover=0,1,1
+export CTDB_SET_NoIPTakeover=1
simple_test 2,2,2 <<EOF
192.168.21.254 2