diff options
author | Martin Schwenke <martin@meltin.net> | 2014-11-21 17:33:21 +1100 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2014-12-05 21:02:40 +0100 |
commit | d0b2375c3d754da3cd68e34617ab3edd36e9317b (patch) | |
tree | 7d5643a23075eed2cd6a6ec99876a4437fd0ffec | |
parent | d4212bd6a533b4b54b56e376a9246f2396cba253 (diff) | |
download | samba-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-x | ctdb/config/functions | 23 |
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() |