ctdb-ipalloc: Add per-IP known_on bitmap
authorMartin Schwenke <martin@meltin.net>
Tue, 7 Feb 2017 04:23:36 +0000 (15:23 +1100)
committerMartin Schwenke <martins@samba.org>
Fri, 24 Feb 2017 06:47:12 +0000 (07:47 +0100)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/server/ipalloc.c
ctdb/server/ipalloc.h

index a0e497eaca8b28d1629f0411889c49f49c5e4b08..5dffb0d72164c4e1e704301c2245a298fade4bf1 100644 (file)
@@ -163,12 +163,19 @@ static bool populate_bitmap(struct ipalloc_state *ipalloc_state)
 
        for (ip = ipalloc_state->all_ips; ip != NULL; ip = ip->next) {
 
+               ip->known_on = bitmap_talloc(ip, ipalloc_state->num);
+               if (ip->known_on == NULL) {
+                       return false;
+               }
+
                ip->available_on = bitmap_talloc(ip, ipalloc_state->num);
                if (ip->available_on == NULL) {
                        return false;
                }
 
                for (i = 0; i < ipalloc_state->num; i++) {
+                       struct ctdb_public_ip_list *known =
+                               &ipalloc_state->known_public_ips[i];
                        struct ctdb_public_ip_list *avail =
                                &ipalloc_state->available_public_ips[i];
 
@@ -180,6 +187,21 @@ static bool populate_bitmap(struct ipalloc_state *ipalloc_state)
                                        break;
                                }
                        }
+
+                       /* Optimisation: available => known */
+                       if (bitmap_query(ip->available_on, i)) {
+                               bitmap_set(ip->known_on, i);
+                               continue;
+                       }
+
+                       /* Check to see if "ip" is known on node "i" */
+                       for (j = 0; j < known->num; j++) {
+                               if (ctdb_sock_addr_same_ip(
+                                           &ip->addr, &known->ip[j].addr)) {
+                                       bitmap_set(ip->known_on, i);
+                                       break;
+                               }
+                       }
                }
        }
 
index 842b9afa0f54cc42a7607c6b723398769e357386..590dcb31e4a443f608e9108d8ee9d72f98f7ccd7 100644 (file)
@@ -33,6 +33,7 @@ struct public_ip_list {
        struct public_ip_list *next;
        uint32_t pnn;
        ctdb_sock_addr addr;
+       struct bitmap *known_on;
        struct bitmap *available_on;
 };