summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2014-11-21 17:33:21 +1100
committerMartin Schwenke <martins@samba.org>2014-12-05 21:02:40 +0100
commitd0b2375c3d754da3cd68e34617ab3edd36e9317b (patch)
tree7d5643a23075eed2cd6a6ec99876a4437fd0ffec
parentd4212bd6a533b4b54b56e376a9246f2396cba253 (diff)
downloadsamba-d0b2375c3d754da3cd68e34617ab3edd36e9317b.tar.gz
samba-d0b2375c3d754da3cd68e34617ab3edd36e9317b.tar.xz
samba-d0b2375c3d754da3cd68e34617ab3edd36e9317b.zip
ctdb-scripts: Wait until IPv6 addresses are not "tentative"
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>
-rwxr-xr-xctdb/config/functions23
1 files changed, 23 insertions, 0 deletions
diff --git a/ctdb/config/functions b/ctdb/config/functions
index b9f3638a7d..23cb2364e3 100755
--- a/ctdb/config/functions
+++ b/ctdb/config/functions
@@ -869,6 +869,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()