scripts: Wait until IPv6 addresses are not "tentative"
authorMartin Schwenke <martin@meltin.net>
Fri, 21 Nov 2014 06:33:21 +0000 (17:33 +1100)
committerMartin Schwenke <martin@meltin.net>
Wed, 10 Dec 2014 04:06:08 +0000 (15:06 +1100)
There are a few potential failure modes when adding an IPv6 address.
It takes a little while of duplicate address detection to complete, so
wait for a while.  After a timeout, also need to check to see if
duplicate address detection failed - if it did then actually drop the
IP address.

This really needs some careful thinking.  If CTDB disappears on a node
but the node's IP addresses are still on interfaces then the above
failure mode could cause the takeover nodes to become banned.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
(Imported from commit d0b2375c3d754da3cd68e34617ab3edd36e9317b)

config/functions

index 02b3b2c81d372add51fca10ed2f3bd188ca91fb2..ef05e356538b88a3a3ee016f823a3da7ee1789f6 100755 (executable)
@@ -859,6 +859,29 @@ add_ip_to_iface ()
        echo "Failed to add $_ip/$_maskbits on dev $_iface"
        return 1
     }
+
+    # Wait 5 seconds for IPv6 addresses to stop being tentative...
+    if [ -z "$_bcast" ] ; then
+       for _x in $(seq 1 10) ; do
+           ip addr show to "${_ip}/128" | grep -q "tentative" || break
+           sleep 0.5
+       done
+
+       # If the address was a duplicate then it won't be on the
+       # interface so flag an error.
+       _t=$(ip addr show to "${_ip}/128")
+       case "$_t" in
+           "")
+               echo "Failed to add $_ip/$_maskbits on dev $_iface"
+               return 1
+               ;;
+           *tentative*|*dadfailed*)
+               echo "Failed to add $_ip/$_maskbits on dev $_iface"
+               ip addr del "$_ip/$_maskbits" dev "$_iface"
+               return 1
+               ;;
+       esac
+    fi
 }
 
 delete_ip_from_iface()