/* Arrays with data for each node */
struct ctdb_public_ip_list_old **known_public_ips;
struct ctdb_public_ip_list_old **available_public_ips;
+ struct ctdb_ipflags *ipflags;
enum ipalloc_algorithm algorithm;
uint32_t no_ip_failback;
*/
static bool can_node_host_ip(struct ipalloc_state *ipalloc_state,
int32_t pnn,
- struct ctdb_ipflags ipflags,
struct public_ip_list *ip)
{
struct ctdb_public_ip_list_old *public_ips;
int i;
- if (ipflags.noiphost) {
+ if (ipalloc_state->ipflags[pnn].noiphost) {
return false;
}
static bool can_node_takeover_ip(struct ipalloc_state *ipalloc_state,
int32_t pnn,
- struct ctdb_ipflags ipflags,
struct public_ip_list *ip)
{
- if (ipflags.noiptakeover) {
+ if (ipalloc_state->ipflags[pnn].noiptakeover) {
return false;
}
- return can_node_host_ip(ipalloc_state, pnn, ipflags, ip);
+ return can_node_host_ip(ipalloc_state, pnn, ip);
}
/* search the node lists list for a node to takeover this ip.
so that the ips get spread out evenly.
*/
static int find_takeover_node(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *ip,
struct public_ip_list *all_ips)
{
pnn = -1;
for (i=0; i<numnodes; i++) {
/* verify that this node can serve this ip */
- if (!can_node_takeover_ip(ipalloc_state, i, ipflags[i], ip)) {
+ if (!can_node_takeover_ip(ipalloc_state, i, ip)) {
/* no it couldnt so skip to the next node */
continue;
}
* finding the best node for each.
*/
static void basic_allocate_unassigned(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips)
{
struct public_ip_list *tmp_ip;
*/
for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
if (tmp_ip->pnn == -1) {
- if (find_takeover_node(ipalloc_state, ipflags,
+ if (find_takeover_node(ipalloc_state,
tmp_ip, all_ips)) {
DEBUG(DEBUG_WARNING,
("Failed to find node to cover ip %s\n",
/* Basic non-deterministic rebalancing algorithm.
*/
static void basic_failback(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
int num_ips)
{
for (i=0; i<numnodes; i++) {
/* only check nodes that can actually serve this ip */
if (!can_node_takeover_ip(ipalloc_state, i,
- ipflags[i], tmp_ip)) {
+ tmp_ip)) {
/* no it couldnt so skip to the next node */
continue;
}
for (tmp=all_ips;tmp;tmp=tmp->next) {
if (tmp->pnn == maxnode) {
(void)find_takeover_node(ipalloc_state,
- ipflags,
tmp,
all_ips);
retries++;
}
static bool lcp2_init(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
uint32_t *force_rebalance_nodes,
uint32_t **lcp2_imbalances,
* the IP/node combination that will cost the least.
*/
static void lcp2_allocate_unassigned(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
uint32_t *lcp2_imbalances)
{
/* only check nodes that can actually takeover this ip */
if (!can_node_takeover_ip(ipalloc_state,
dstnode,
- ipflags[dstnode],
tmp_ip)) {
/* no it couldnt so skip to the next node */
continue;
* combination to move from the source node.
*/
static bool lcp2_failback_candidate(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
int srcnode,
uint32_t *lcp2_imbalances,
/* only check nodes that can actually takeover this ip */
if (!can_node_takeover_ip(ipalloc_state, dstnode,
- ipflags[dstnode], tmp_ip)) {
+ tmp_ip)) {
/* no it couldnt so skip to the next node */
continue;
}
* IP/destination node combination to move from the source node.
*/
static void lcp2_failback(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
uint32_t *lcp2_imbalances,
bool *rebalance_candidates)
}
if (lcp2_failback_candidate(ipalloc_state,
- ipflags,
all_ips,
lips[i].pnn,
lcp2_imbalances,
}
static void unassign_unsuitable_ips(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips)
{
struct public_ip_list *tmp_ip;
continue;
}
if (!can_node_host_ip(ipalloc_state, tmp_ip->pnn,
- ipflags[tmp_ip->pnn], tmp_ip) != 0) {
+ tmp_ip) != 0) {
/* this node can not serve this ip. */
DEBUG(DEBUG_DEBUG,("Unassign IP: %s from %d\n",
ctdb_addr_to_str(&(tmp_ip->addr)),
}
static bool ip_alloc_deterministic_ips(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips)
{
struct public_ip_list *tmp_ip;
DEBUG(DEBUG_WARNING, ("WARNING: 'NoIPFailback' set but ignored - incompatible with 'DeterministicIPs\n"));
}
- unassign_unsuitable_ips(ipalloc_state, ipflags, all_ips);
+ unassign_unsuitable_ips(ipalloc_state, all_ips);
- basic_allocate_unassigned(ipalloc_state, ipflags, all_ips);
+ basic_allocate_unassigned(ipalloc_state, all_ips);
/* No failback here! */
}
static bool ip_alloc_nondeterministic_ips(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips)
{
/* This should be pushed down into basic_failback. */
num_ips++;
}
- unassign_unsuitable_ips(ipalloc_state, ipflags, all_ips);
+ unassign_unsuitable_ips(ipalloc_state, all_ips);
- basic_allocate_unassigned(ipalloc_state, ipflags, all_ips);
+ basic_allocate_unassigned(ipalloc_state, all_ips);
/* If we don't want IPs to fail back then don't rebalance IPs. */
if (1 == ipalloc_state->no_ip_failback) {
/* Now, try to make sure the ip adresses are evenly distributed
across the nodes.
*/
- basic_failback(ipalloc_state, ipflags, all_ips, num_ips);
+ basic_failback(ipalloc_state, all_ips, num_ips);
return true;
}
static bool ip_alloc_lcp2(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
uint32_t *force_rebalance_nodes)
{
int numnodes, num_rebalance_candidates, i;
bool ret = true;
- unassign_unsuitable_ips(ipalloc_state, ipflags, all_ips);
+ unassign_unsuitable_ips(ipalloc_state, all_ips);
- if (!lcp2_init(ipalloc_state, ipflags, all_ips,force_rebalance_nodes,
+ if (!lcp2_init(ipalloc_state, all_ips,force_rebalance_nodes,
&lcp2_imbalances, &rebalance_candidates)) {
ret = false;
goto finished;
}
- lcp2_allocate_unassigned(ipalloc_state, ipflags, all_ips, lcp2_imbalances);
+ lcp2_allocate_unassigned(ipalloc_state, all_ips, lcp2_imbalances);
/* If we don't want IPs to fail back then don't rebalance IPs. */
if (1 == ipalloc_state->no_ip_failback) {
/* Now, try to make sure the ip adresses are evenly distributed
across the nodes.
*/
- lcp2_failback(ipalloc_state, ipflags, all_ips,
+ lcp2_failback(ipalloc_state, all_ips,
lcp2_imbalances, rebalance_candidates);
finished:
/* The calculation part of the IP allocation algorithm. */
static bool ctdb_takeover_run_core(struct ipalloc_state *ipalloc_state,
- struct ctdb_ipflags *ipflags,
struct public_ip_list *all_ips,
uint32_t *force_rebalance_nodes)
{
switch (ipalloc_state->algorithm) {
case IPALLOC_LCP2:
- ret = ip_alloc_lcp2(ipalloc_state, ipflags, all_ips,
+ ret = ip_alloc_lcp2(ipalloc_state, all_ips,
force_rebalance_nodes);
break;
case IPALLOC_DETERMINISTIC:
- ret = ip_alloc_deterministic_ips(ipalloc_state, ipflags, all_ips);
+ ret = ip_alloc_deterministic_ips(ipalloc_state, all_ips);
break;
case IPALLOC_NONDETERMINISTIC:
- ret = ip_alloc_nondeterministic_ips(ipalloc_state, ipflags, all_ips);
+ ret = ip_alloc_nondeterministic_ips(ipalloc_state, all_ips);
break;
}
talloc_free(tmp_ctx);
return -1;
}
+ ipalloc_state->ipflags= ipflags;
/* Fetch known/available public IPs from each active node */
ret = ctdb_reload_remote_public_ips(ctdb, ipalloc_state, nodemap);
all_ips = create_merged_ip_list(ctdb, ipalloc_state);
/* Do the IP reassignment calculations */
- ctdb_takeover_run_core(ipalloc_state, ipflags,
+ ctdb_takeover_run_core(ipalloc_state,
all_ips, force_rebalance_nodes);
/* Now tell all nodes to release any public IPs should not
struct ctdb_context **ctdb,
struct public_ip_list **all_ips,
struct ipalloc_state **ipalloc_state,
- struct ctdb_ipflags **ipflags,
bool read_ips_for_multiple_nodes)
{
struct ctdb_public_ip_list_old **known;
(*ipalloc_state)->known_public_ips[i] = known[i];
}
- *ipflags = set_ipflags_internal(*ipalloc_state, nodemap,
- tval_noiptakeover,
- tval_noiptakeoverondisabled);
+ (*ipalloc_state)->ipflags =
+ set_ipflags_internal(*ipalloc_state, nodemap,
+ tval_noiptakeover,
+ tval_noiptakeoverondisabled);
}
/* IP layout is read from stdin. */
struct ctdb_context *ctdb;
struct public_ip_list *all_ips;
struct ipalloc_state *ipalloc_state;
- struct ctdb_ipflags *ipflags;
uint32_t *lcp2_imbalances;
bool *newly_healthy;
- ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state, &ipflags,
+ ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state,
false);
- lcp2_init(ipalloc_state, ipflags, all_ips, NULL,
+ lcp2_init(ipalloc_state, all_ips, NULL,
&lcp2_imbalances, &newly_healthy);
- lcp2_allocate_unassigned(ipalloc_state, ipflags,
+ lcp2_allocate_unassigned(ipalloc_state,
all_ips, lcp2_imbalances);
print_ctdb_public_ip_list(all_ips);
struct ctdb_context *ctdb;
struct public_ip_list *all_ips;
struct ipalloc_state *ipalloc_state;
- struct ctdb_ipflags *ipflags;
uint32_t *lcp2_imbalances;
bool *newly_healthy;
- ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state, &ipflags,
+ ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state,
false);
- lcp2_init(ipalloc_state, ipflags, all_ips, NULL,
+ lcp2_init(ipalloc_state, all_ips, NULL,
&lcp2_imbalances, &newly_healthy);
- lcp2_failback(ipalloc_state, ipflags,
+ lcp2_failback(ipalloc_state,
all_ips, lcp2_imbalances, newly_healthy);
print_ctdb_public_ip_list(all_ips);
struct ctdb_context *ctdb;
struct public_ip_list *all_ips;
struct ipalloc_state *ipalloc_state;
- struct ctdb_ipflags *ipflags;
uint32_t *lcp2_imbalances;
bool *newly_healthy;
- ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state, &ipflags,
+ ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state,
false);
- lcp2_init(ipalloc_state, ipflags, all_ips, NULL,
+ lcp2_init(ipalloc_state, all_ips, NULL,
&lcp2_imbalances, &newly_healthy);
- lcp2_failback(ipalloc_state, ipflags,
+ lcp2_failback(ipalloc_state,
all_ips, lcp2_imbalances, newly_healthy);
print_ctdb_public_ip_list(all_ips);
struct ctdb_context *ctdb;
struct public_ip_list *all_ips;
struct ipalloc_state *ipalloc_state;
- struct ctdb_ipflags *ipflags;
- ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state, &ipflags,
+ ctdb_test_init(nodestates, &ctdb, &all_ips, &ipalloc_state,
read_ips_for_multiple_nodes);
all_ips = create_merged_ip_list(ctdb, ipalloc_state);
- ctdb_takeover_run_core(ipalloc_state, ipflags, all_ips, NULL);
+ ctdb_takeover_run_core(ipalloc_state, all_ips, NULL);
print_ctdb_public_ip_list(all_ips);