Whamcloud - gitweb
LU-5810 tests: add client hostname to lctl mark
[fs/lustre-release.git] / lustre / tests / test-framework.sh
index c413a35..b323882 100755 (executable)
@@ -54,16 +54,25 @@ fi
 [ -z "$MODPROBECONF" -a -f /etc/modprobe.conf ] &&
     MODPROBECONF=/etc/modprobe.conf
 
+sanitize_parameters() {
+       for i in DIR DIR1 DIR2 MOUNT MOUNT1 MOUNT2
+       do
+               local path=${!i}
+               if [ -d "$path" ]; then
+                       eval export $i=$(echo $path | sed -r 's/\/+$//g')
+               fi
+       done
+}
 assert_DIR () {
-    local failed=""
-    [[ $DIR/ = $MOUNT/* ]] || \
-        { failed=1 && echo "DIR=$DIR not in $MOUNT. Aborting."; }
-    [[ $DIR1/ = $MOUNT1/* ]] || \
-        { failed=1 && echo "DIR1=$DIR1 not in $MOUNT1. Aborting."; }
-    [[ $DIR2/ = $MOUNT2/* ]] || \
-        { failed=1 && echo "DIR2=$DIR2 not in $MOUNT2. Aborting"; }
+       local failed=""
+       [[ $DIR/ = $MOUNT/* ]] ||
+               { failed=1 && echo "DIR=$DIR not in $MOUNT. Aborting."; }
+       [[ $DIR1/ = $MOUNT1/* ]] ||
+               { failed=1 && echo "DIR1=$DIR1 not in $MOUNT1. Aborting."; }
+       [[ $DIR2/ = $MOUNT2/* ]] ||
+               { failed=1 && echo "DIR2=$DIR2 not in $MOUNT2. Aborting"; }
 
-    [ -n "$failed" ] && exit 99 || true
+       [ -n "$failed" ] && exit 99 || true
 }
 
 usage() {
@@ -324,20 +333,20 @@ init_test_env() {
        export SHUTDOWN_ATTEMPTS=${SHUTDOWN_ATTEMPTS:-3}
        export OSD_TRACK_DECLARES_LBUG=${OSD_TRACK_DECLARES_LBUG:-"yes"}
 
-    # command line
+       # command line
 
-    while getopts "rvwf:" opt $*; do
-        case $opt in
-            f) CONFIG=$OPTARG;;
-            r) REFORMAT=--reformat;;
-            v) VERBOSE=true;;
-            w) WRITECONF=writeconf;;
-            \?) usage;;
-        esac
-    done
+       while getopts "rvwf:" opt $*; do
+               case $opt in
+                       f) CONFIG=$OPTARG;;
+                       r) REFORMAT=yes;;
+                       v) VERBOSE=true;;
+                       w) WRITECONF=writeconf;;
+                       \?) usage;;
+               esac
+       done
 
-    shift $((OPTIND - 1))
-    ONLY=${ONLY:-$*}
+       shift $((OPTIND - 1))
+       ONLY=${ONLY:-$*}
 
        # print the durations of each test if "true"
        DDETAILS=${DDETAILS:-false}
@@ -560,13 +569,15 @@ load_modules_local() {
     load_module lov/lov
     load_module mgc/mgc
     load_module obdecho/obdecho
-    if ! client_only; then
-        SYMLIST=/proc/kallsyms
-        grep -q crc16 $SYMLIST || { modprobe crc16 2>/dev/null || true; }
-        grep -q -w jbd $SYMLIST || { modprobe jbd 2>/dev/null || true; }
-        grep -q -w jbd2 $SYMLIST || { modprobe jbd2 2>/dev/null || true; }
+       if ! client_only; then
+               SYMLIST=/proc/kallsyms
+               grep -q crc16 $SYMLIST ||
+                       { modprobe crc16 2>/dev/null || true; }
+               grep -q -w jbd2 $SYMLIST ||
+                       { modprobe jbd2 2>/dev/null || true; }
                load_module lfsck/lfsck
-               [ "$LQUOTA" != "no" ] && load_module quota/lquota $LQUOTAOPTS
+               [ "$LQUOTA" != "no" ] &&
+                       load_module quota/lquota $LQUOTAOPTS
                if [[ $(node_fstypes $HOSTNAME) == *zfs* ]]; then
                        modprobe zfs
                        load_module osd-zfs/osd_zfs
@@ -574,6 +585,8 @@ load_modules_local() {
                if [[ $(node_fstypes $HOSTNAME) == *ldiskfs* ]]; then
                        grep -q exportfs_decode_fh $SYMLIST ||
                                { modprobe exportfs 2> /dev/null || true; }
+                       grep -q -w mbcache $SYMLIST ||
+                               { modprobe mbcache 2>/dev/null || true; }
                        load_module ../ldiskfs/ldiskfs
                        load_module osd-ldiskfs/osd_ldiskfs
                fi
@@ -585,7 +598,7 @@ load_modules_local() {
                load_module osp/osp
                load_module ofd/ofd
                load_module osp/osp
-    fi
+       fi
 
        load_module llite/lustre
        llite_lloop_enabled && load_module llite/llite_lloop
@@ -817,7 +830,7 @@ facet_type() {
 facet_number() {
        local facet=$1
 
-       if [ $facet == mgs ]; then
+       if [ $facet == mgs ] || [ $facet == client ]; then
                return 1
        fi
 
@@ -1263,6 +1276,11 @@ mount_facet() {
                return $RC
        fi
 
+       health=$(do_facet ${facet} "$LCTL get_param -n health_check")
+       if [[ "$health" != "healthy" ]]; then
+               error "$facet is in a unhealthy state"
+       fi
+
        set_default_debug_facet $facet
 
        if [[ $facet == mds* ]]; then
@@ -2529,8 +2547,8 @@ replay_barrier() {
        # inside fail() and fail_abort().
        #
        do_facet $facet $LCTL --device ${!svc} readonly
-       do_facet $facet $LCTL mark "$facet REPLAY BARRIER on ${!svc}"
-       $LCTL mark "local REPLAY BARRIER on ${!svc}"
+       do_facet $facet $LCTL mark "$HOSTNAME: $facet REPLAY BARRIER on ${!svc}"
+       $LCTL mark "$HOSTNAME: local REPLAY BARRIER on ${!svc}"
 }
 
 replay_barrier_nodf() {
@@ -2540,8 +2558,8 @@ replay_barrier_nodf() {
        echo Replay barrier on ${!svc}
        do_facet $facet $LCTL --device ${!svc} notransno
        do_facet $facet $LCTL --device ${!svc} readonly
-       do_facet $facet $LCTL mark "$facet REPLAY BARRIER on ${!svc}"
-       $LCTL mark "local REPLAY BARRIER on ${!svc}"
+       do_facet $facet $LCTL mark "$HOSTNAME: $facet REPLAY BARRIER on ${!svc}"
+       $LCTL mark "$HOSTNAME: local REPLAY BARRIER on ${!svc}"
 }
 
 replay_barrier_nosync() {
@@ -2550,8 +2568,8 @@ replay_barrier_nosync() {
        echo Replay barrier on ${!svc}
        do_facet $facet $LCTL --device ${!svc} notransno
        do_facet $facet $LCTL --device ${!svc} readonly
-       do_facet $facet $LCTL mark "$facet REPLAY BARRIER on ${!svc}"
-       $LCTL mark "local REPLAY BARRIER on ${!svc}"
+       do_facet $facet $LCTL mark "$HOSTNAME: $facet REPLAY BARRIER on ${!svc}"
+       $LCTL mark "$HOSTNAME: local REPLAY BARRIER on ${!svc}"
 }
 
 #
@@ -2866,26 +2884,26 @@ change_active() {
 }
 
 do_node() {
-    local verbose=false
-    # do not stripe off hostname if verbose, bug 19215
-    if [ x$1 = x--verbose ]; then
-        shift
-        verbose=true
-    fi
+       local verbose=false
+       # do not stripe off hostname if verbose, bug 19215
+       if [ x$1 = x--verbose ]; then
+               shift
+               verbose=true
+       fi
 
-    local HOST=$1
-    shift
-    local myPDSH=$PDSH
-    if [ "$HOST" = "$HOSTNAME" ]; then
-        myPDSH="no_dsh"
-    elif [ -z "$myPDSH" -o "$myPDSH" = "no_dsh" ]; then
-        echo "cannot run remote command on $HOST with $myPDSH"
-        return 128
-    fi
-    if $VERBOSE; then
-        echo "CMD: $HOST $@" >&2
-        $myPDSH $HOST "$LCTL mark \"$@\"" > /dev/null 2>&1 || :
-    fi
+       local HOST=$1
+       shift
+       local myPDSH=$PDSH
+       if [ "$HOST" = "$HOSTNAME" ]; then
+               myPDSH="no_dsh"
+       elif [ -z "$myPDSH" -o "$myPDSH" = "no_dsh" ]; then
+               echo "cannot run remote command on $HOST with $myPDSH"
+               return 128
+       fi
+       if $VERBOSE; then
+               echo "CMD: $HOST $@" >&2
+               $myPDSH $HOST "$LCTL mark \"$HOSTNAME: $@\"" &>/dev/null || :
+       fi
 
     if [ "$myPDSH" = "rsh" ]; then
 # we need this because rsh does not return exit code of an executed command
@@ -2981,17 +2999,18 @@ do_nodes() {
         return $?
     fi
 
-    # This is part from do_node
-    local myPDSH=$PDSH
+       # This is part from do_node
+       local myPDSH=$PDSH
 
-    [ -z "$myPDSH" -o "$myPDSH" = "no_dsh" -o "$myPDSH" = "rsh" ] && \
-        echo "cannot run remote command on $rnodes with $myPDSH" && return 128
+       [ -z "$myPDSH" -o "$myPDSH" = "no_dsh" -o "$myPDSH" = "rsh" ] &&
+               echo "cannot run remote command on $rnodes with $myPDSH" &&
+               return 128
 
-    export FANOUT=$(get_node_count "${rnodes//,/ }")
-    if $VERBOSE; then
-        echo "CMD: $rnodes $@" >&2
-        $myPDSH $rnodes "$LCTL mark \"$@\"" > /dev/null 2>&1 || :
-    fi
+       export FANOUT=$(get_node_count "${rnodes//,/ }")
+       if $VERBOSE; then
+               echo "CMD: $rnodes $@" >&2
+               $myPDSH $rnodes "$LCTL mark \"$HOSTNAME: $@\"" &>/dev/null || :
+       fi
 
     # do not replace anything from pdsh output if -N is used
     # -N     Disable hostname: prefix on lines of output.
@@ -3975,21 +3994,22 @@ is_empty_fs() {
 }
 
 check_and_setup_lustre() {
-    nfs_client_mode && return
+       sanitize_parameters
+       nfs_client_mode && return
        cifs_client_mode && return
 
-    local MOUNTED=$(mounted_lustre_filesystems)
-
-    local do_check=true
-    # 1.
-    # both MOUNT and MOUNT2 are not mounted
-    if ! is_mounted $MOUNT && ! is_mounted $MOUNT2; then
-        [ "$REFORMAT" ] && formatall
-        # setupall mounts both MOUNT and MOUNT2 (if MOUNT_2 is set)
-        setupall
-        is_mounted $MOUNT || error "NAME=$NAME not mounted"
-        export I_MOUNTED=yes
-        do_check=false
+       local MOUNTED=$(mounted_lustre_filesystems)
+
+       local do_check=true
+       # 1.
+       # both MOUNT and MOUNT2 are not mounted
+       if ! is_mounted $MOUNT && ! is_mounted $MOUNT2; then
+               [ "$REFORMAT" = "yes" ] && formatall
+               # setupall mounts both MOUNT and MOUNT2 (if MOUNT_2 is set)
+               setupall
+               is_mounted $MOUNT || error "NAME=$NAME not mounted"
+               export I_MOUNTED=yes
+               do_check=false
     # 2.
     # MOUNT2 is mounted
     elif is_mounted $MOUNT2; then
@@ -4605,10 +4625,10 @@ set_nodes_failloc () {
 }
 
 cancel_lru_locks() {
-       #$LCTL mark "cancel_lru_locks $1 start"
+       #$LCTL mark "$HOSTNAME: cancel_lru_locks $1 start"
        $LCTL set_param -n ldlm.namespaces.*$1*.lru_size=clear
        $LCTL get_param ldlm.namespaces.*$1*.lock_unused_count | grep -v '=0'
-       #$LCTL mark "cancel_lru_locks $1 stop"
+       #$LCTL mark "$HOSTNAME: cancel_lru_locks $1 stop"
 }
 
 default_lru_size()
@@ -4685,20 +4705,17 @@ stop_full_debug_logging() {
 
 # prints bash call stack
 print_stack_trace() {
+       local skip=${1:-1}
        echo "  Trace dump:"
-       for (( i=1; i < ${#BASH_LINENO[*]} ; i++ )) ; do
-               local s=${BASH_SOURCE[$i]}
-               local l=${BASH_LINENO[$i-1]}
-               local f=${FUNCNAME[$i]}
-               echo "  = $s:$l:$f()"
+       for (( i=$skip; i < ${#BASH_LINENO[*]} ; i++ )) ; do
+               local src=${BASH_SOURCE[$i]}
+               local lineno=${BASH_LINENO[$i-1]}
+               local funcname=${FUNCNAME[$i]}
+               echo "  = $src:$lineno:$funcname()"
        done
 }
 
-##################################
-# Test interface
-##################################
-
-error_noexit() {
+report_error() {
        local TYPE=${TYPE:-"FAIL"}
 
        local dump=true
@@ -4708,10 +4725,8 @@ error_noexit() {
                dump=false
        fi
 
-
        log " ${TESTSUITE} ${TESTNAME}: @@@@@@ ${TYPE}: $@ "
-       print_stack_trace >&2
-
+       (print_stack_trace 2) >&2
        mkdir -p $LOGDIR
        # We need to dump the logs on all nodes
        if $dump; then
@@ -4735,6 +4750,14 @@ error_noexit() {
        reset_fail_loc
 }
 
+##################################
+# Test interface
+##################################
+
+error_noexit() {
+       report_error "$@"
+}
+
 exit_status () {
        local status=0
        local log=$TESTSUITELOG
@@ -4744,12 +4767,13 @@ exit_status () {
 }
 
 error() {
-       error_noexit "$@"
+       report_error "$@"
        exit 1
 }
 
 error_exit() {
-       error "$@"
+       report_error "$@"
+       exit 1
 }
 
 # use only if we are ignoring failures for this test, bugno required.
@@ -4759,11 +4783,11 @@ error_exit() {
 error_ignore() {
        local TYPE="IGNORE ($1)"
        shift
-       error_noexit "$@"
+       report_error "$@"
 }
 
 error_and_remount() {
-       error_noexit "$@"
+       report_error "$@"
        remount_client $MOUNT
        exit 1
 }
@@ -4902,17 +4926,18 @@ log() {
        echo "$*" >&2
        load_module ../libcfs/libcfs/libcfs
 
-    local MSG="$*"
-    # Get rid of '
-    MSG=${MSG//\'/\\\'}
-    MSG=${MSG//\(/\\\(}
-    MSG=${MSG//\)/\\\)}
-    MSG=${MSG//\;/\\\;}
-    MSG=${MSG//\|/\\\|}
-    MSG=${MSG//\>/\\\>}
-    MSG=${MSG//\</\\\<}
-    MSG=${MSG//\//\\\/}
-    do_nodes $(comma_list $(nodes_list)) $LCTL mark "$MSG" 2> /dev/null || true
+       local MSG="$HOSTNAME: $*"
+       # Get rid of '
+       MSG=${MSG//\'/\\\'}
+       MSG=${MSG//\(/\\\(}
+       MSG=${MSG//\)/\\\)}
+       MSG=${MSG//\;/\\\;}
+       MSG=${MSG//\|/\\\|}
+       MSG=${MSG//\>/\\\>}
+       MSG=${MSG//\</\\\<}
+       MSG=${MSG//\//\\\/}
+       do_nodes $(comma_list $(nodes_list)) $LCTL mark "$MSG" 2> /dev/null ||
+               true
 }
 
 trace() {
@@ -5420,12 +5445,7 @@ get_random_entry () {
 }
 
 client_only () {
-    [ "$CLIENTONLY" ] || [ "$CLIENTMODSONLY" = yes ]
-}
-
-is_patchless ()
-{
-    lctl get_param version | grep -q patchless
+       [ "$CLIENTONLY" ] || [ "$CLIENTMODSONLY" = yes ]
 }
 
 check_versions () {