ctdb-ipalloc: Fold force_rebalance_candidates into IP allocation state
[obnox/samba/samba-obnox.git] / ctdb / tests / src / ctdb_takeover_tests.c
index 1aa06205235c84dadc5e5f172ef43db763a77dd5..49ef2e823f11097602a306c14503ae3b49c644d7 100644 (file)
 /* Format of each line is "IP pnn" - the separator has to be at least
  * 1 space (not a tab or whatever - a space!).
  */
-static struct ctdb_public_ip_list *
+static struct public_ip_list *
 read_ctdb_public_ip_list(TALLOC_CTX *ctx)
 {
        char line[1024];
        ctdb_sock_addr addr;
        char *t;
        int pnn;
-       struct ctdb_public_ip_list *last = NULL;
+       struct public_ip_list *last = NULL;
 
-       struct ctdb_public_ip_list *ret = NULL;
+       struct public_ip_list *ret = NULL;
 
        while (fgets(line, sizeof(line), stdin) != NULL) {
                
@@ -55,9 +55,9 @@ read_ctdb_public_ip_list(TALLOC_CTX *ctx)
               
                if (parse_ip(line, NULL, 0, &addr)) {
                        if (last == NULL) {
-                               last = talloc(ctx, struct ctdb_public_ip_list);
+                               last = talloc(ctx, struct public_ip_list);
                        } else {
-                               last->next = talloc(ctx, struct ctdb_public_ip_list);
+                               last->next = talloc(ctx, struct public_ip_list);
                                last = last->next;
                        }
                        last->next = NULL;
@@ -74,7 +74,7 @@ read_ctdb_public_ip_list(TALLOC_CTX *ctx)
        return ret;
 }
 
-void print_ctdb_public_ip_list(struct ctdb_public_ip_list * ips)
+static void print_ctdb_public_ip_list(struct public_ip_list * ips)
 {
        while (ips) {
                printf("%s %d\n", ctdb_addr_to_str(&(ips->addr)), ips->pnn);
@@ -84,9 +84,9 @@ void print_ctdb_public_ip_list(struct ctdb_public_ip_list * ips)
 
 /* Read some IPs from stdin, 1 per line, parse them and then print
  * them back out. */
-void ctdb_test_read_ctdb_public_ip_list(void)
+static void ctdb_test_read_ctdb_public_ip_list(void)
 {
-       struct ctdb_public_ip_list *l;
+       struct public_ip_list *l;
 
        TALLOC_CTX *tmp_ctx = talloc_new(NULL);
 
@@ -97,26 +97,41 @@ void ctdb_test_read_ctdb_public_ip_list(void)
        talloc_free(tmp_ctx);
 }
 
+static uint32_t *get_tunable_values(TALLOC_CTX *tmp_ctx,
+                                   int numnodes,
+                                   const char *tunable);
+static enum ctdb_runstate *get_runstate(TALLOC_CTX *tmp_ctx,
+                                       int numnodes);
+
 /* Format of each line is "IP CURRENT_PNN ALLOWED_PNN,...".
  */
 static bool
-read_ctdb_public_ip_info(TALLOC_CTX *ctx,
+read_ctdb_public_ip_info(TALLOC_CTX *ctx  ,
                         int numnodes,
-                        struct ctdb_public_ip_list ** all_ips,
-                        struct ctdb_all_public_ips *** avail)
+                        struct public_ip_list ** all_ips,
+                        struct ctdb_public_ip_list_old *** known,
+                        struct ctdb_public_ip_list_old *** avail)
 {
        char line[1024];
        ctdb_sock_addr addr;
        char *t, *tok;
-       struct ctdb_public_ip_list * ta;
+       struct public_ip_list * ta;
        int pnn, numips, curr, n, i;
-       struct ctdb_all_public_ips * a;
+       struct ctdb_public_ip_list_old * a;
 
-       struct ctdb_public_ip_list *last = NULL;
+       struct public_ip_list *last = NULL;
+       enum ctdb_runstate *runstate;
+
+       runstate = get_runstate(ctx, numnodes);
 
-       *avail = talloc_array_size(ctx, sizeof(struct ctdb_all_public_ips *), CTDB_TEST_MAX_NODES);
+       *known = talloc_array_size(ctx, sizeof(struct ctdb_public_ip_list_old *), CTDB_TEST_MAX_NODES);
+       memset(*known, 0,
+              sizeof(struct ctdb_public_ip_list_old *) * CTDB_TEST_MAX_NODES);
+
+       *avail = talloc_array_size(ctx, sizeof(struct ctdb_public_ip_list_old *),
+                                  CTDB_TEST_MAX_NODES);
        memset(*avail, 0,
-              sizeof(struct ctdb_all_public_ips *) * CTDB_TEST_MAX_NODES);
+              sizeof(struct ctdb_public_ip_list_old *) * CTDB_TEST_MAX_NODES);
 
        numips = 0;
        *all_ips = NULL;
@@ -159,9 +174,9 @@ read_ctdb_public_ip_info(TALLOC_CTX *ctx,
 
                /* Add address + pnn to all_ips */
                if (last == NULL) {
-                       last = talloc(ctx, struct ctdb_public_ip_list);
+                       last = talloc(ctx, struct public_ip_list);
                } else {
-                       last->next = talloc(ctx, struct ctdb_public_ip_list);
+                       last->next = talloc(ctx, struct public_ip_list);
                        last = last->next;
                }
                last->next = NULL;
@@ -180,22 +195,22 @@ read_ctdb_public_ip_info(TALLOC_CTX *ctx,
                t = strtok(tok, ",");
                while (t != NULL) {
                        n = (int) strtol(t, (char **) NULL, 10);
-                       if ((*avail)[n] == NULL) {
-                               (*avail)[n] = talloc_array(ctx, struct ctdb_all_public_ips, CTDB_TEST_MAX_IPS);
-                               (*avail)[n]->num = 0;
+                       if ((*known)[n] == NULL) {
+                               (*known)[n] = talloc_array(ctx, struct ctdb_public_ip_list_old, CTDB_TEST_MAX_IPS);
+                               (*known)[n]->num = 0;
                        }
-                       curr = (*avail)[n]->num;
-                       (*avail)[n]->ips[curr].pnn = pnn;
-                       memcpy(&((*avail)[n]->ips[curr].addr),
+                       curr = (*known)[n]->num;
+                       (*known)[n]->ips[curr].pnn = pnn;
+                       memcpy(&((*known)[n]->ips[curr].addr),
                               &addr, sizeof(addr));
-                       (*avail)[n]->num++;
+                       (*known)[n]->num++;
                        t = strtok(NULL, ",");
                }
 
        }
 
        /* Build list of all allowed IPs */
-       a = talloc_array(ctx, struct ctdb_all_public_ips, CTDB_TEST_MAX_IPS);
+       a = talloc_array(ctx, struct ctdb_public_ip_list_old, CTDB_TEST_MAX_IPS);
        a->num = numips;
        for (ta = *all_ips, i=0; ta != NULL && i < numips ; ta = ta->next, i++) {
                a->ips[i].pnn = ta->pnn;
@@ -204,15 +219,19 @@ read_ctdb_public_ip_info(TALLOC_CTX *ctx,
 
        /* Assign it to any nodes that don't have a list assigned */
        for (n = 0; n < numnodes; n++) {
-               if ((*avail)[n] == NULL) {
-                       (*avail)[n] = a;
+               if ((*known)[n] == NULL) {
+                       (*known)[n] = a;
+               }
+               if (runstate[n] == CTDB_RUNSTATE_RUNNING) {
+                       (*avail)[n] = (*known)[n];
                }
        }
 
        return true;
 }
 
-void print_ctdb_available_ips(int numnodes, struct ctdb_all_public_ips **avail)
+static void print_ctdb_available_ips(int numnodes,
+                                    struct ctdb_public_ip_list_old **avail)
 {
        int n, i;
 
@@ -229,11 +248,12 @@ void print_ctdb_available_ips(int numnodes, struct ctdb_all_public_ips **avail)
        }
 }
 
-void ctdb_test_read_ctdb_public_ip_info(const char nodestates[])
+static void ctdb_test_read_ctdb_public_ip_info(const char nodestates[])
 {
        int numnodes;
-       struct ctdb_public_ip_list *l;
-       struct ctdb_all_public_ips **avail;
+       struct public_ip_list *l;
+       struct ctdb_public_ip_list_old **known;
+       struct ctdb_public_ip_list_old **avail;
        char *tok, *ns;
 
        TALLOC_CTX *tmp_ctx = talloc_new(NULL);
@@ -252,7 +272,7 @@ void ctdb_test_read_ctdb_public_ip_info(const char nodestates[])
                tok = strtok(NULL, ",");
        }
        
-       read_ctdb_public_ip_info(tmp_ctx, numnodes, &l, &avail);
+       read_ctdb_public_ip_info(tmp_ctx, numnodes, &l, &known, &avail);
 
        print_ctdb_public_ip_list(l);
        print_ctdb_available_ips(numnodes, avail);
@@ -261,9 +281,9 @@ void ctdb_test_read_ctdb_public_ip_info(const char nodestates[])
 }
 
 /* Read 2 IPs from stdin, calculate the IP distance and print it. */
-void ctdb_test_ip_distance(void)
+static void ctdb_test_ip_distance(void)
 {
-       struct ctdb_public_ip_list *l;
+       struct public_ip_list *l;
        uint32_t distance;
 
        TALLOC_CTX *tmp_ctx = talloc_new(NULL);
@@ -281,10 +301,10 @@ void ctdb_test_ip_distance(void)
 /* Read some IPs from stdin, calculate the sum of the squares of the
  * IP distances between the 1st argument and those read that are on
  * the given node. The given IP must one of the ones in the list.  */
-void ctdb_test_ip_distance_2_sum(const char ip[], int pnn)
+static void ctdb_test_ip_distance_2_sum(const char ip[], int pnn)
 {
-       struct ctdb_public_ip_list *l;
-       struct ctdb_public_ip_list *t;
+       struct public_ip_list *l;
+       struct public_ip_list *t;
        ctdb_sock_addr addr;
        uint32_t distance;
 
@@ -316,11 +336,11 @@ void ctdb_test_ip_distance_2_sum(const char ip[], int pnn)
        talloc_free(tmp_ctx);
 }
 
-/* Read some IPs from stdin, calculate the sume of the squares of the
+/* Read some IPs from stdin, calculate the sum of the squares of the
  * IP distances between the first and the rest, and print it. */
-void ctdb_test_lcp2_imbalance(int pnn)
+static void ctdb_test_lcp2_imbalance(int pnn)
 {
-       struct ctdb_public_ip_list *l;
+       struct public_ip_list *l;
        uint32_t imbalance;
 
        TALLOC_CTX *tmp_ctx = talloc_new(NULL);
@@ -405,20 +425,20 @@ static enum ctdb_runstate *get_runstate(TALLOC_CTX *tmp_ctx,
  * create_merged_ip_list(), so should only be used in tests of
  * ctdb_takeover_run_core().  Yes, it is a hack...  :-)
  */
-void ctdb_test_init(const char nodestates[],
-                   struct ctdb_context **ctdb,
-                   struct ctdb_public_ip_list **all_ips,
-                   struct ctdb_ipflags **ipflags,
-                   bool read_ips_for_multiple_nodes)
+static void ctdb_test_init(const char nodestates[],
+                          struct ctdb_context **ctdb,
+                          struct ipalloc_state **ipalloc_state,
+                          bool read_ips_for_multiple_nodes)
 {
-       struct ctdb_all_public_ips **avail;
+       struct ctdb_public_ip_list_old **known;
+       struct ctdb_public_ip_list_old **avail;
        int i, numnodes;
        uint32_t nodeflags[CTDB_TEST_MAX_NODES];
        char *tok, *ns, *t;
-       struct ctdb_node_map *nodemap;
+       struct ctdb_node_map_old *nodemap;
        uint32_t *tval_noiptakeover;
        uint32_t *tval_noiptakeoverondisabled;
-       enum ctdb_runstate *runstate;
+       struct public_ip_list *all_ips;
 
        *ctdb = talloc_zero(NULL, struct ctdb_context);
 
@@ -430,7 +450,7 @@ void ctdb_test_init(const char nodestates[],
        while (tok != NULL) {
                nodeflags[numnodes] = (uint32_t) strtol(tok, NULL, 0);
                numnodes++;
-               if (numnodes > CTDB_TEST_MAX_NODES) {
+               if (numnodes >= CTDB_TEST_MAX_NODES) {
                        DEBUG(DEBUG_ERR, ("ERROR: Exceeding CTDB_TEST_MAX_NODES: %d\n", CTDB_TEST_MAX_NODES));
                        exit(1);
                }
@@ -466,17 +486,18 @@ void ctdb_test_init(const char nodestates[],
                get_tunable_values(*ctdb, numnodes,
                                   "CTDB_SET_NoIPHostOnAllDisabled");
 
-       runstate = get_runstate(*ctdb, numnodes);
-
-       nodemap =  talloc_array(*ctdb, struct ctdb_node_map, numnodes);
+       nodemap =  talloc_array(*ctdb, struct ctdb_node_map_old, numnodes);
        nodemap->num = numnodes;
 
        if (!read_ips_for_multiple_nodes) {
-               read_ctdb_public_ip_info(*ctdb, numnodes, all_ips, &avail);
+               read_ctdb_public_ip_info(*ctdb, numnodes,
+                                        &all_ips, &known, &avail);
        }
 
        (*ctdb)->nodes = talloc_array(*ctdb, struct ctdb_node *, numnodes); // FIXME: bogus size, overkill
 
+       *ipalloc_state = ipalloc_state_init(*ctdb, *ctdb);
+
        for (i=0; i < numnodes; i++) {
                nodemap->nodes[i].pnn = i;
                nodemap->nodes[i].flags = nodeflags[i];
@@ -484,84 +505,83 @@ void ctdb_test_init(const char nodestates[],
 
                if (read_ips_for_multiple_nodes) {
                        read_ctdb_public_ip_info(*ctdb, numnodes,
-                                                all_ips, &avail);
+                                                &all_ips, &known, &avail);
                }
 
                (*ctdb)->nodes[i] = talloc(*ctdb, struct ctdb_node);
                (*ctdb)->nodes[i]->pnn = i;
                (*ctdb)->nodes[i]->flags = nodeflags[i];
-               (*ctdb)->nodes[i]->available_public_ips = avail[i];
-               (*ctdb)->nodes[i]->known_public_ips = avail[i];
+
+               (*ipalloc_state)->available_public_ips[i] = avail[i];
+               (*ipalloc_state)->known_public_ips[i] = known[i];
        }
 
-       *ipflags = set_ipflags_internal(*ctdb, *ctdb, nodemap,
-                                       tval_noiptakeover,
-                                       tval_noiptakeoverondisabled,
-                                       runstate);
+       set_ipflags_internal(*ipalloc_state, nodemap,
+                            tval_noiptakeover,
+                            tval_noiptakeoverondisabled);
+
+       (*ipalloc_state)->all_ips = create_merged_ip_list(*ctdb,
+                                                         *ipalloc_state);
+
+       (*ipalloc_state)->force_rebalance_nodes = NULL;
 }
 
 /* IP layout is read from stdin. */
-void ctdb_test_lcp2_allocate_unassigned(const char nodestates[])
+static void ctdb_test_lcp2_allocate_unassigned(const char nodestates[])
 {
        struct ctdb_context *ctdb;
-       struct ctdb_public_ip_list *all_ips;
-       struct ctdb_ipflags *ipflags;
+       struct ipalloc_state *ipalloc_state;
 
        uint32_t *lcp2_imbalances;
        bool *newly_healthy;
 
-       ctdb_test_init(nodestates, &ctdb, &all_ips, &ipflags, false);
+       ctdb_test_init(nodestates, &ctdb, &ipalloc_state, false);
 
-       lcp2_init(ctdb, ipflags, all_ips, &lcp2_imbalances, &newly_healthy);
+       lcp2_init(ipalloc_state, &lcp2_imbalances, &newly_healthy);
 
-       lcp2_allocate_unassigned(ctdb, ipflags,
-                                all_ips, lcp2_imbalances);
+       lcp2_allocate_unassigned(ipalloc_state, lcp2_imbalances);
 
-       print_ctdb_public_ip_list(all_ips);
+       print_ctdb_public_ip_list(ipalloc_state->all_ips);
 
        talloc_free(ctdb);
 }
 
 /* IP layout is read from stdin. */
-void ctdb_test_lcp2_failback(const char nodestates[])
+static void ctdb_test_lcp2_failback(const char nodestates[])
 {
        struct ctdb_context *ctdb;
-       struct ctdb_public_ip_list *all_ips;
-       struct ctdb_ipflags *ipflags;
+       struct ipalloc_state *ipalloc_state;
 
        uint32_t *lcp2_imbalances;
        bool *newly_healthy;
 
-       ctdb_test_init(nodestates, &ctdb, &all_ips, &ipflags, false);
+       ctdb_test_init(nodestates, &ctdb, &ipalloc_state, false);
 
-       lcp2_init(ctdb, ipflags, all_ips, &lcp2_imbalances, &newly_healthy);
+       lcp2_init(ipalloc_state, &lcp2_imbalances, &newly_healthy);
 
-       lcp2_failback(ctdb, ipflags,
-                     all_ips, lcp2_imbalances, newly_healthy);
+       lcp2_failback(ipalloc_state, lcp2_imbalances, newly_healthy);
 
-       print_ctdb_public_ip_list(all_ips);
+       print_ctdb_public_ip_list(ipalloc_state->all_ips);
 
        talloc_free(ctdb);
 }
 
 /* IP layout is read from stdin. */
-void ctdb_test_lcp2_failback_loop(const char nodestates[])
+static void ctdb_test_lcp2_failback_loop(const char nodestates[])
 {
        struct ctdb_context *ctdb;
-       struct ctdb_public_ip_list *all_ips;
-       struct ctdb_ipflags *ipflags;
+       struct ipalloc_state *ipalloc_state;
 
        uint32_t *lcp2_imbalances;
        bool *newly_healthy;
 
-       ctdb_test_init(nodestates, &ctdb, &all_ips, &ipflags, false);
+       ctdb_test_init(nodestates, &ctdb, &ipalloc_state, false);
 
-       lcp2_init(ctdb, ipflags, all_ips, &lcp2_imbalances, &newly_healthy);
+       lcp2_init(ipalloc_state, &lcp2_imbalances, &newly_healthy);
 
-       lcp2_failback(ctdb, ipflags,
-                     all_ips, lcp2_imbalances, newly_healthy);
+       lcp2_failback(ipalloc_state, lcp2_imbalances, newly_healthy);
 
-       print_ctdb_public_ip_list(all_ips);
+       print_ctdb_public_ip_list(ipalloc_state->all_ips);
 
        talloc_free(ctdb);
 }
@@ -569,24 +589,23 @@ void ctdb_test_lcp2_failback_loop(const char nodestates[])
 /* IP layout is read from stdin.  See comment for ctdb_test_init() for
  * explanation of read_ips_for_multiple_nodes.
  */
-void ctdb_test_ctdb_takeover_run_core(const char nodestates[],
-                                     bool read_ips_for_multiple_nodes)
+static void ctdb_test_ctdb_takeover_run_core(const char nodestates[],
+                                            bool read_ips_for_multiple_nodes)
 {
        struct ctdb_context *ctdb;
-       struct ctdb_public_ip_list *all_ips;
-       struct ctdb_ipflags *ipflags;
+       struct ipalloc_state *ipalloc_state;
 
-       ctdb_test_init(nodestates, &ctdb, &all_ips, &ipflags,
+       ctdb_test_init(nodestates, &ctdb, &ipalloc_state,
                       read_ips_for_multiple_nodes);
 
-       ctdb_takeover_run_core(ctdb, ipflags, &all_ips);
+       ctdb_takeover_run_core(ipalloc_state);
 
-       print_ctdb_public_ip_list(all_ips);
+       print_ctdb_public_ip_list(ipalloc_state->all_ips);
 
        talloc_free(ctdb);
 }
 
-void usage(void)
+static void usage(void)
 {
        fprintf(stderr, "usage: ctdb_takeover_tests <op>\n");
        exit(1);
@@ -594,9 +613,9 @@ void usage(void)
 
 int main(int argc, const char *argv[])
 {
-       LogLevel = DEBUG_DEBUG;
+       DEBUGLEVEL = DEBUG_DEBUG;
        if (getenv("CTDB_TEST_LOGLEVEL")) {
-               LogLevel = atoi(getenv("CTDB_TEST_LOGLEVEL"));
+               DEBUGLEVEL = atoi(getenv("CTDB_TEST_LOGLEVEL"));
        }
 
        if (argc < 2) {