struct public_ip_list *all_ips;
enum ipalloc_algorithm algorithm;
uint32_t no_ip_failback;
+ uint32_t *force_rebalance_nodes;
};
struct ctdb_interface {
}
static bool lcp2_init(struct ipalloc_state *ipalloc_state,
- uint32_t *force_rebalance_nodes,
uint32_t **lcp2_imbalances,
bool **rebalance_candidates)
{
/* 3rd step: if a node is forced to re-balance then
we allow failback onto the node */
- if (force_rebalance_nodes == NULL) {
+ if (ipalloc_state->force_rebalance_nodes == NULL) {
return true;
}
- for (i = 0; i < talloc_array_length(force_rebalance_nodes); i++) {
- uint32_t pnn = force_rebalance_nodes[i];
+ for (i = 0;
+ i < talloc_array_length(ipalloc_state->force_rebalance_nodes);
+ i++) {
+ uint32_t pnn = ipalloc_state->force_rebalance_nodes[i];
if (pnn >= numnodes) {
DEBUG(DEBUG_ERR,
(__location__ "unknown node %u\n", pnn));
return true;
}
-static bool ip_alloc_lcp2(struct ipalloc_state *ipalloc_state,
- uint32_t *force_rebalance_nodes)
+static bool ip_alloc_lcp2(struct ipalloc_state *ipalloc_state)
{
uint32_t *lcp2_imbalances;
bool *rebalance_candidates;
unassign_unsuitable_ips(ipalloc_state);
- if (!lcp2_init(ipalloc_state, force_rebalance_nodes,
+ if (!lcp2_init(ipalloc_state,
&lcp2_imbalances, &rebalance_candidates)) {
ret = false;
goto finished;
}
/* The calculation part of the IP allocation algorithm. */
-static bool ctdb_takeover_run_core(struct ipalloc_state *ipalloc_state,
- uint32_t *force_rebalance_nodes)
+static bool ctdb_takeover_run_core(struct ipalloc_state *ipalloc_state)
{
bool ret;
switch (ipalloc_state->algorithm) {
case IPALLOC_LCP2:
- ret = ip_alloc_lcp2(ipalloc_state, force_rebalance_nodes);
+ ret = ip_alloc_lcp2(ipalloc_state);
break;
case IPALLOC_DETERMINISTIC:
ret = ip_alloc_deterministic_ips(ipalloc_state);
all_ips = create_merged_ip_list(ctdb, ipalloc_state);
ipalloc_state->all_ips = all_ips;
+ ipalloc_state->force_rebalance_nodes = force_rebalance_nodes;
+
/* Do the IP reassignment calculations */
- ctdb_takeover_run_core(ipalloc_state, force_rebalance_nodes);
+ ctdb_takeover_run_core(ipalloc_state);
/* Now tell all nodes to release any public IPs should not
* host. This will be a NOOP on nodes that don't currently
(*ipalloc_state)->all_ips = create_merged_ip_list(*ctdb,
*ipalloc_state);
+
+ (*ipalloc_state)->force_rebalance_nodes = NULL;
}
/* IP layout is read from stdin. */
ctdb_test_init(nodestates, &ctdb, &ipalloc_state, false);
- lcp2_init(ipalloc_state, NULL, &lcp2_imbalances, &newly_healthy);
+ lcp2_init(ipalloc_state, &lcp2_imbalances, &newly_healthy);
lcp2_allocate_unassigned(ipalloc_state, lcp2_imbalances);
ctdb_test_init(nodestates, &ctdb, &ipalloc_state, false);
- lcp2_init(ipalloc_state, NULL, &lcp2_imbalances, &newly_healthy);
+ lcp2_init(ipalloc_state, &lcp2_imbalances, &newly_healthy);
lcp2_failback(ipalloc_state, lcp2_imbalances, newly_healthy);
ctdb_test_init(nodestates, &ctdb, &ipalloc_state, false);
- lcp2_init(ipalloc_state, NULL, &lcp2_imbalances, &newly_healthy);
+ lcp2_init(ipalloc_state, &lcp2_imbalances, &newly_healthy);
lcp2_failback(ipalloc_state, lcp2_imbalances, newly_healthy);
ctdb_test_init(nodestates, &ctdb, &ipalloc_state,
read_ips_for_multiple_nodes);
- ctdb_takeover_run_core(ipalloc_state, NULL);
+ ctdb_takeover_run_core(ipalloc_state);
print_ctdb_public_ip_list(ipalloc_state->all_ips);