[SCM] CTDB repository - branch master updated - ctdb-2.0-44-g13a5944

Amitay Isaacs amitay at samba.org
Mon Jan 7 21:23:28 MST 2013


The branch, master has been updated
       via  13a5944f8a27d43006acfffba76958693cae7702 (commit)
      from  3cc596d2b459d834f9785b3a98027e46431ff2b9 (commit)

http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 13a5944f8a27d43006acfffba76958693cae7702
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Oct 12 16:12:38 2012 +1100

    tests/simple: Add test to check recovery daemon IP verification
    
    Also update ips_are_on_nodeglob() to handle negation.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>

-----------------------------------------------------------------------

Summary of changes:
 tests/scripts/integration.bash         |   24 ++++++--
 tests/simple/60_recoverd_missing_ip.sh |  103 ++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 6 deletions(-)
 create mode 100755 tests/simple/60_recoverd_missing_ip.sh


Changeset truncated at 500 lines:

diff --git a/tests/scripts/integration.bash b/tests/scripts/integration.bash
index 07e764e..2e5fb37 100644
--- a/tests/scripts/integration.bash
+++ b/tests/scripts/integration.bash
@@ -438,8 +438,14 @@ wait_until_node_has_status ()
 
 # Useful for superficially testing IP failover.
 # IPs must be on nodes matching nodeglob.
+# If the first argument is '!' then the IPs must not be on nodes
+# matching nodeglob.
 ips_are_on_nodeglob ()
 {
+    local negating=false
+    if [ "$1" = "!" ] ; then
+	negating=true ; shift
+    fi
     local nodeglob="$1" ; shift
     local ips="$*"
 
@@ -447,17 +453,23 @@ ips_are_on_nodeglob ()
 
     all_ips_on_node 1
 
-    while read ip pnn ; do
-	for check in $ips ; do
+    for check in $ips ; do
+	while read ip pnn ; do
 	    if [ "$check" = "$ip" ] ; then
 		case "$pnn" in
-		    ($nodeglob) : ;;
-		    (*) return 1  ;;
+		    ($nodeglob) if $negating ; then return 1 ; fi ;;
+		    (*) if ! $negating ; then return 1 ; fi  ;;
 		esac
 		ips="${ips/${ip}}" # Remove from list
+		break
 	    fi
-	done
-    done <<<"$out" # bashism to avoid problem setting variable in pipeline.
+	    # If we're negating and we didn't see the address then it
+	    # isn't hosted by anyone!
+	    if $negating ; then
+		ips="${ips/${check}}"
+	    fi
+	done <<<"$out" # bashism to avoid problem setting variable in pipeline.
+    done
 
     ips="${ips// }" # Remove any spaces.
     [ -z "$ips" ]
diff --git a/tests/simple/60_recoverd_missing_ip.sh b/tests/simple/60_recoverd_missing_ip.sh
new file mode 100755
index 0000000..fc12e4c
--- /dev/null
+++ b/tests/simple/60_recoverd_missing_ip.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+
+test_info()
+{
+    cat <<EOF
+Verify that the reconvery daemon handles unhosted IPs properly.
+EOF
+}
+
+. "${TEST_SCRIPTS_DIR}/integration.bash"
+
+ctdb_test_init "$@"
+
+set -e
+
+cluster_is_healthy
+
+# Reset configuration
+ctdb_restart_when_done
+
+select_test_node_and_ips
+
+echo "Running test against node $test_node and IP $test_ip"
+
+# Find the interface
+try_command_on_node $test_node "$CTDB ip -v -Y | awk -F: -v ip=$test_ip '\$2 == ip { print \$4 }'"
+iface="$out"
+
+if [ -z "$TEST_LOCAL_DAEMONS" ] ; then
+    # Find the netmask
+    try_command_on_node $test_node ip addr show to $test_ip
+    mask="${out##*/}"
+    mask="${mask%% *}"
+else
+    mask="24"
+fi
+
+echo "$test_ip/$mask is on $iface"
+
+echo "Deleting IP $test_ip from all nodes"
+try_command_on_node -v $test_node $CTDB delip -n all $test_ip
+
+wait_until_ips_are_on_nodeglob '!' $test_node $test_ip
+
+try_command_on_node -v all $CTDB ip
+
+my_exit_hook ()
+{
+    if [ -z "$TEST_LOCAL_DAEMONS" ] ; then
+	onnode -q all $CTDB enablescript "10.interface"
+    fi
+}
+
+ctdb_test_exit_hook_add my_exit_hook
+
+if [ -z "$TEST_LOCAL_DAEMONS" ] ; then
+    # Stop monitor events from bringing up the link status of an interface
+    try_command_on_node $test_node $CTDB disablescript 10.interface
+fi
+
+# This effectively cancels any monitor event that is in progress and
+# runs a new one
+try_command_on_node $test_node $CTDB eventscript monitor
+
+echo "Marking interface $iface down on node $test_node"
+try_command_on_node $test_node $CTDB setifacelink $iface down
+
+try_command_on_node $test_node $CTDB clearlog recoverd
+
+echo "Adding IP $test_ip to node $test_node"
+try_command_on_node $test_node $CTDB addip $test_ip/$mask $iface
+
+# Give the recovery daemon enough time to start doing IP verification
+sleep_for 15
+
+try_command_on_node $test_node $CTDB getlog recoverd
+
+msg="Public IP '$test_ip' is not assigned and we could serve it"
+
+echo "$msg"
+
+if grep "$msg"  <<<"$out" ; then
+    echo "BAD: the recovery daemon noticed that the IP was unhosted"
+    exit 1
+else
+    echo "GOOD: the recovery daemon did not notice that the IP was unhosted"
+fi
+
+try_command_on_node $test_node $CTDB clearlog recoverd
+
+echo "Marking interface $iface up on node $test_node"
+try_command_on_node $test_node $CTDB setifacelink $iface up
+
+wait_until_ips_are_on_nodeglob $test_node $test_ip
+
+try_command_on_node -v $test_node $CTDB getlog recoverd
+
+if grep "$msg" <<<"$out" ; then
+    echo "GOOD: the recovery daemon noticed that the IP was unhosted"
+else
+    echo "BAD: the recovery daemon did not notice that the IP was unhosted"
+    exit 1
+fi


-- 
CTDB repository


More information about the samba-cvs mailing list