ctdb-ipalloc: Fix buggy short-circuit when no IPs are available
authorMartin Schwenke <martin@meltin.net>
Wed, 29 Jun 2016 06:36:28 +0000 (16:36 +1000)
committerAmitay Isaacs <amitay@samba.org>
Mon, 4 Jul 2016 13:42:25 +0000 (15:42 +0200)
At the moment IP is short-circuited when there are no available IP
addresses.  However, if some IP addresses are already allocated then
"no available IP addresses" means that all the addresses should
(probably) be released.  The current short-circuit means that no
already hosted IP addresses will be released.

The short-circuit exists to avoid lots of messages saying that all IP
addresses can not be assigned at startup time.  So, add a check to
ipalloc_can_host_ips() so that it succeeds if IP addresses are already
allocated to nodes.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/server/ipalloc.c

index 868ac841bcb317bb4ea70a16d122d94933f0a26b..295671a924f53bddc03e242ea7f5eff2fe1cb33f 100644 (file)
@@ -129,9 +129,23 @@ bool ipalloc_set_public_ips(struct ipalloc_state *ipalloc_state,
        return (ipalloc_state->all_ips != NULL);
 }
 
+/* This can only return false if there are no available IPs *and*
+ * there are no IP addresses currently allocated.  If the latter is
+ * true then the cluster can clearly host IPs... just not necessarily
+ * right now... */
 bool ipalloc_can_host_ips(struct ipalloc_state *ipalloc_state)
 {
        int i;
+       struct public_ip_list *ip_list;
+
+
+       for (ip_list = ipalloc_state->all_ips;
+            ip_list != NULL;
+            ip_list = ip_list->next) {
+               if (ip_list->pnn != -1) {
+                       return true;
+               }
+       }
 
        for (i=0; i < ipalloc_state->num; i++) {
                if (ipalloc_state->available_public_ips[i].num != 0) {