ctdb-ipalloc: Fold force_rebalance_candidates into IP allocation state
authorMartin Schwenke <martin@meltin.net>
Fri, 6 Nov 2015 05:20:53 +0000 (16:20 +1100)
committerAmitay Isaacs <amitay@samba.org>
Fri, 4 Dec 2015 08:17:17 +0000 (09:17 +0100)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/server/ctdb_takeover.c
ctdb/tests/src/ctdb_takeover_tests.c

index 4ff007d2792821b23dcaf162580a9a36b9547acd..942dcf7b1e61cab80e7aa24dcc7b5f88ff29d98b 100644 (file)
@@ -66,6 +66,7 @@ struct ipalloc_state {
        struct public_ip_list *all_ips;
        enum ipalloc_algorithm algorithm;
        uint32_t no_ip_failback;
+       uint32_t *force_rebalance_nodes;
 };
 
 struct ctdb_interface {
@@ -1728,7 +1729,6 @@ try_again:
 }
 
 static bool lcp2_init(struct ipalloc_state *ipalloc_state,
-                     uint32_t *force_rebalance_nodes,
                      uint32_t **lcp2_imbalances,
                      bool **rebalance_candidates)
 {
@@ -1770,11 +1770,13 @@ static bool lcp2_init(struct ipalloc_state *ipalloc_state,
 
        /* 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));
@@ -2143,8 +2145,7 @@ static bool ip_alloc_nondeterministic_ips(struct ipalloc_state *ipalloc_state)
        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;
@@ -2153,7 +2154,7 @@ static bool ip_alloc_lcp2(struct ipalloc_state *ipalloc_state,
 
        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;
@@ -2205,14 +2206,13 @@ static bool all_nodes_are_disabled(struct ctdb_node_map_old *nodemap)
 }
 
 /* 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);
@@ -2650,8 +2650,10 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodem
        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
index f1d015a9f033fffa779aa053c66c62d1d9da9522..49ef2e823f11097602a306c14503ae3b49c644d7 100644 (file)
@@ -522,6 +522,8 @@ static void ctdb_test_init(const char nodestates[],
 
        (*ipalloc_state)->all_ips = create_merged_ip_list(*ctdb,
                                                          *ipalloc_state);
+
+       (*ipalloc_state)->force_rebalance_nodes = NULL;
 }
 
 /* IP layout is read from stdin. */
@@ -535,7 +537,7 @@ static void ctdb_test_lcp2_allocate_unassigned(const char nodestates[])
 
        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);
 
@@ -555,7 +557,7 @@ static void ctdb_test_lcp2_failback(const char nodestates[])
 
        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);
 
@@ -575,7 +577,7 @@ static void ctdb_test_lcp2_failback_loop(const char nodestates[])
 
        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);
 
@@ -596,7 +598,7 @@ static void ctdb_test_ctdb_takeover_run_core(const char nodestates[],
        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);