Whamcloud - gitweb
LU-404 bind umount /sbin/mount.lustre only if necessary
[fs/lustre-release.git] / lustre / tests / test-framework.sh
index 89c76ae..14547a1 100644 (file)
@@ -8,7 +8,7 @@ set -e
 
 export REFORMAT=${REFORMAT:-""}
 export WRITECONF=${WRITECONF:-""}
-export VERBOSE=false
+export VERBOSE=${VERBOSE:-false}
 export CATASTROPHE=${CATASTROPHE:-/proc/sys/lnet/catastrophe}
 export GSS=false
 export GSS_KRB5=false
@@ -117,21 +117,13 @@ init_test_env() {
     export DUMPE2FS=${DUMPE2FS:-dumpe2fs}
     export E2FSCK=${E2FSCK:-e2fsck}
     export LFSCK_BIN=${LFSCK_BIN:-lfsck}
-    export LFSCK_ALWAYS=${LFSCK_ALWAYS:-"no"} # check filesystem after each test suit
-    export SKIP_LFSCK=${SKIP_LFSCK:-"yes"} # bug 13698, change to "no" when fixed
-    export SHARED_DIRECTORY=${SHARED_DIRECTORY:-"/tmp"}
+
+    export LFSCK_ALWAYS=${LFSCK_ALWAYS:-"no"} # check fs after each test suite
     export FSCK_MAX_ERR=4   # File system errors left uncorrected
-    if [ "$SKIP_LFSCK" == "no" ]; then
-        if [ ! -x `which $LFSCK_BIN` ]; then
-            log "$($E2FSCK -V)"
-            error_exit "$E2FSCK does not support lfsck"
-        fi
+    export SHARED_DIRECTORY=${SHARED_DIRECTORY:-"/tmp"}
+    export MDSDB=${MDSDB:-$SHARED_DIRECTORY/mdsdb}
+    export OSTDB=${OSTDB:-$SHARED_DIRECTORY/ostdb}
 
-        export MDSDB=${MDSDB:-$SHARED_DIRECTORY/mdsdb}
-        export OSTDB=${OSTDB:-$SHARED_DIRECTORY/ostdb}
-        export MDSDB_OPT="--mdsdb $MDSDB"
-        export OSTDB_OPT="--ostdb $OSTDB-\$ostidx"
-    fi
     #[ -d /r ] && export ROOT=${ROOT:-/r}
     export TMP=${TMP:-$ROOT/tmp}
     export TESTSUITELOG=${TMP}/${TESTSUITE}.log
@@ -141,16 +133,16 @@ init_test_env() {
     fi
     export HOSTNAME=${HOSTNAME:-`hostname`}
     if ! echo $PATH | grep -q $LUSTRE/utils; then
-        export PATH=$PATH:$LUSTRE/utils
+        export PATH=$LUSTRE/utils:$PATH
     fi
     if ! echo $PATH | grep -q $LUSTRE/utils/gss; then
-        export PATH=$PATH:$LUSTRE/utils/gss
+        export PATH=$LUSTRE/utils/gss:$PATH
     fi
     if ! echo $PATH | grep -q $LUSTRE/tests; then
         export PATH=$LUSTRE/tests:$PATH
     fi
     if ! echo $PATH | grep -q $LUSTRE/../lustre-iokit/sgpdd-survey; then
-        export PATH=$PATH:$LUSTRE/../lustre-iokit/sgpdd-survey
+        export PATH=$LUSTRE/../lustre-iokit/sgpdd-survey:$PATH
     fi
     export LST=${LST:-"$LUSTRE/../lnet/utils/lst"}
     [ ! -f "$LST" ] && export LST=$(which lst)
@@ -165,7 +157,7 @@ init_test_env() {
         export PATH=$LUSTRE/tests/racer:$PATH:
     fi
     if ! echo $PATH | grep -q $LUSTRE/tests/mpi; then
-        export PATH=$PATH:$LUSTRE/tests/mpi
+        export PATH=$LUSTRE/tests/mpi:$PATH
     fi
     export RSYNC_RSH=${RSYNC_RSH:-rsh}
     export LCTL=${LCTL:-"$LUSTRE/utils/lctl"}
@@ -265,7 +257,7 @@ esac
 
 
 module_loaded () {
-   /sbin/lsmod | grep -q $1
+   /sbin/lsmod | grep -q "^\<$1\>"
 }
 
 # Load a module on the system where this is running.
@@ -294,7 +286,7 @@ load_module() {
         eval set -- \$$optvar
         if [ $# -eq 0 -a -n "$MODPROBECONF" ]; then
             # Nothing in $MODOPTS_<MODULE>; try modprobe.conf
-            set -- $(grep "^options\\s*\<${module}\>" $MODPROBECONF)
+            set -- $(grep -P "^options\\s+${BASE}" $MODPROBECONF)
             # Get rid of "options $module"
             (($# > 0)) && shift 2
 
@@ -380,7 +372,11 @@ load_modules_local() {
     $LCTL modules > $OGDB/ogdb-$HOSTNAME
 
     # 'mount' doesn't look in $PATH, just sbin
-    [ -f $LUSTRE/utils/mount.lustre ] && cp $LUSTRE/utils/mount.lustre /sbin/. || true
+    if [ -f $LUSTRE/utils/mount.lustre ] && \
+       ! grep -qe "/sbin/mount\.lustre " /proc/mounts; then
+        [ ! -f /sbin/mount.lustre ] && touch /sbin/mount.lustre
+        mount --bind $LUSTRE/utils/mount.lustre /sbin/mount.lustre || true
+    fi
 }
 
 load_modules () {
@@ -422,6 +418,12 @@ unload_modules() {
         fi
     fi
 
+    if grep -qe "/sbin/mount\.lustre" /proc/mounts; then
+        umount /sbin/mount.lustre || true
+        [ -w /sbin/mount.lustre -a ! -s /sbin/mount.lustre ] && \
+            rm -f /sbin/mount.lustre || true
+    fi
+
     check_mem_leak || return 254
 
     echo "modules unloaded."
@@ -720,13 +722,10 @@ setup_quota(){
 }
 
 zconf_mount() {
-    local OPTIONS
     local client=$1
     local mnt=$2
-    # Only supply -o to mount if we have options
-    if [ -n "$MOUNTOPT" ]; then
-        OPTIONS="-o $MOUNTOPT"
-    fi
+    local OPTIONS=${3:-$MOUNTOPT}
+
     local device=$MGSNID:/$FSNAME
     if [ -z "$mnt" -o -z "$FSNAME" ]; then
         echo Bad zconf mount command: opt=$OPTIONS dev=$device mnt=$mnt
@@ -835,10 +834,6 @@ zconf_mount_clients() {
     local mnt=$2
     local OPTIONS=${3:-$MOUNTOPT}
 
-    # Only supply -o to mount if we have options
-    if [ "$OPTIONS" ]; then
-        OPTIONS="-o $OPTIONS"
-    fi
     local device=$MGSNID:/$FSNAME
     if [ -z "$mnt" -o -z "$FSNAME" ]; then
         echo Bad zconf mount command: opt=$OPTIONS dev=$device mnt=$mnt
@@ -1035,14 +1030,14 @@ check_progs_installed () {
 }
 
 # recovery-scale functions
-client_var_name() {
-    echo __$(echo $1 | tr '-' 'X')
+node_var_name() {
+    echo __$(echo $1 | tr '-' '_' | tr '.' '_')
 }
 
 start_client_load() {
     local client=$1
     local load=$2
-    local var=$(client_var_name $client)_load
+    local var=$(node_var_name $client)_load
     eval export ${var}=$load
 
     do_node $client "PATH=$PATH MOUNT=$MOUNT ERRORS_OK=$ERRORS_OK \
@@ -1073,7 +1068,7 @@ start_client_loads () {
 # only for remote client 
 check_client_load () {
     local client=$1
-    local var=$(client_var_name $client)_load
+    local var=$(node_var_name $client)_load
     local TESTLOAD=run_${!var}.sh
 
     ps auxww | grep -v grep | grep $client | grep -q "$TESTLOAD" || return 1
@@ -1147,7 +1142,7 @@ restart_client_loads () {
         check_client_load $client
         rc=${PIPESTATUS[0]}
         if [ "$rc" != 0 -a "$expectedfail" ]; then
-            local var=$(client_var_name $client)_load
+            local var=$(node_var_name $client)_load
             start_client_load $client ${!var}
             echo "Restarted client load ${!var}: on $client. Checking ..."
             check_client_load $client
@@ -1682,7 +1677,7 @@ do_node() {
     fi
     if $VERBOSE; then
         echo "CMD: $HOST $@" >&2
-        $myPDSH $HOST $LCTL mark "$@" > /dev/null 2>&1 || :
+        $myPDSH $HOST "$LCTL mark \"$@\"" > /dev/null 2>&1 || :
     fi
 
     if [ "$myPDSH" = "rsh" ]; then
@@ -1756,7 +1751,7 @@ do_nodes() {
 
     if $VERBOSE; then
         echo "CMD: $rnodes $@" >&2
-        $myPDSH $rnodes $LCTL mark "$@" > /dev/null 2>&1 || :
+        $myPDSH $rnodes "$LCTL mark \"$@\"" > /dev/null 2>&1 || :
     fi
 
     # do not replace anything from pdsh output if -N is used
@@ -2222,6 +2217,9 @@ nfs_client_mode () {
         # FIXME: remove hostname when 19215 fixed
         do_nodes $clients "echo \\\$(hostname); grep ' '$MOUNT' ' /proc/mounts"
         declare -a nfsexport=(`grep ' '$MOUNT' ' /proc/mounts | awk '{print $1}' | awk -F: '{print $1 " "  $2}'`)
+        if [[ ${#nfsexport[@]} -eq 0 ]]; then
+                error_exit NFSCLIENT=$NFSCLIENT mode, but no NFS export found!
+        fi
         do_nodes ${nfsexport[0]} "echo \\\$(hostname); df -T  ${nfsexport[1]}"
         return
     fi
@@ -2450,11 +2448,10 @@ get_svr_devs() {
 run_e2fsck() {
     local node=$1
     local target_dev=$2
-    local ostidx=$3
-    local ostdb_opt=$4
+    local extra_opts=$3
 
     df > /dev/null      # update statfs data on disk
-    local cmd="$E2FSCK -d -v -f -n $MDSDB_OPT $ostdb_opt $target_dev"
+    local cmd="$E2FSCK -d -v -t -t -f -n $extra_opts $target_dev"
     echo $cmd
     local rc=0
     do_node $node $cmd || rc=$?
@@ -2482,15 +2479,14 @@ generate_db() {
         error "$SHARED_DIRECTORY is not a shared directory"
     rm $tmp_file
 
-    run_e2fsck $(mdts_nodes) $MDTDEV
+    run_e2fsck $(mdts_nodes) $MDTDEV "--mdsdb $MDSDB"
 
     i=0
     ostidx=0
     OSTDB_LIST=""
     for node in $(osts_nodes); do
         for dev in ${OSTDEVS[i]}; do
-            local ostdb_opt=`eval echo $OSTDB_OPT`
-            run_e2fsck $node $dev $ostidx "$ostdb_opt"
+            run_e2fsck $node $dev "--mdsdb $MDSDB --ostdb $OSTDB-$ostidx"
             OSTDB_LIST="$OSTDB_LIST $OSTDB-$ostidx"
             ostidx=$((ostidx + 1))
         done
@@ -2512,14 +2508,10 @@ run_lfsck() {
 }
 
 check_and_cleanup_lustre() {
-    if [ "$LFSCK_ALWAYS" = "yes" ]; then
+    if [ "$LFSCK_ALWAYS" = "yes" -a "$TESTSUITE" != "lfsck" ]; then
         get_svr_devs
         generate_db
-        if [ "$SKIP_LFSCK" == "no" ]; then
-            run_lfsck
-        else
-            echo "skip lfsck"
-        fi
+        run_lfsck
     fi
 
     if is_mounted $MOUNT; then
@@ -2899,7 +2891,7 @@ exit_status () {
     local status=0
     local log=$TESTSUITELOG
 
-    [ -f "$log" ] && grep -q FAIL $log && status=1
+    [ -f "$log" ] && grep -q FAIL: $log && status=1
     exit $status
 }
 
@@ -2928,6 +2920,8 @@ skip_env () {
 skip () {
     echo
     log " SKIP: ${TESTSUITE} ${TESTNAME} $@"
+    [ "$ALWAYS_SKIPPED" ] && \
+        skip_logged ${TESTNAME} "$@" || true
     [ "$TESTSUITELOG" ] && \
         echo "${TESTSUITE}: SKIP: $TESTNAME $@" >> $TESTSUITELOG || true
 }
@@ -2943,9 +2937,12 @@ build_test_filter() {
         log "excepting tests: `echo $EXCEPT $ALWAYS_EXCEPT`"
     [ "$EXCEPT_SLOW" ] && \
         log "skipping tests SLOW=no: `echo $EXCEPT_SLOW`"
-    for E in $EXCEPT $ALWAYS_EXCEPT; do
+    for E in $EXCEPT; do
         eval EXCEPT_${E}=true
     done
+    for E in $ALWAYS_EXCEPT; do
+        eval EXCEPT_ALWAYS_${E}=true
+    done
     for E in $EXCEPT_SLOW; do
         eval EXCEPT_SLOW_${E}=true
     done
@@ -2964,6 +2961,7 @@ basetest() {
 
 # print a newline if the last test was skipped
 export LAST_SKIPPED=
+export ALWAYS_SKIPPED=
 #
 # Main entry into test-framework. This is called with the name and
 # description of a test. The name is used to find the function to run
@@ -3005,6 +3003,20 @@ run_test() {
         TESTNAME=test_$1 skip "skipping excluded test $1 (base $base)"
         return 0
     fi
+    testname=EXCEPT_ALWAYS_$1
+    if [ ${!testname}x != x ]; then
+        LAST_SKIPPED="y"
+        ALWAYS_SKIPPED="y"
+        TESTNAME=test_$1 skip "skipping ALWAYS excluded test $1"
+        return 0
+    fi
+    testname=EXCEPT_ALWAYS_$base
+    if [ ${!testname}x != x ]; then
+        LAST_SKIPPED="y"
+        ALWAYS_SKIPPED="y"
+        TESTNAME=test_$1 skip "skipping ALWAYS excluded test $1 (base $base)"
+        return 0
+    fi
     testname=EXCEPT_SLOW_$1
     if [ ${!testname}x != x ]; then
         LAST_SKIPPED="y"
@@ -3019,6 +3031,7 @@ run_test() {
     fi
 
     LAST_SKIPPED=
+    ALWAYS_SKIPPED=
     run_one_logged $1 "$2"
 
     return $?
@@ -3070,8 +3083,11 @@ pass() {
 }
 
 check_mds() {
-    FFREE=$(do_node $SINGLEMDS lctl get_param -n osd.*MDT*.filesfree | awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}')
-    FTOTAL=$(do_node $SINGLEMDS lctl get_param -n osd.*MDT*.filestotal | awk 'BEGIN{avail=0}; {avail+=$1}; END{print avail}')
+    local FFREE=$(do_node $SINGLEMDS \
+        lctl get_param -n osd*.*MDT*.filesfree | calc_sum)
+    local FTOTAL=$(do_node $SINGLEMDS \
+        lctl get_param -n osd*.*MDT*.filestotal | calc_sum)
+
     [ $FFREE -ge $FTOTAL ] && error "files free $FFREE > total $FTOTAL" || true
 }
 
@@ -3158,6 +3174,14 @@ run_one_logged() {
     return 0
 }
 
+#
+# Print information of skipped tests to result.yml
+#
+skip_logged(){
+    log_sub_test_begin $1
+    log_sub_test_end "SKIP" "0" "0" "\"$2\""
+}
+
 canonical_path() {
     (cd `dirname $1`; echo $PWD/`basename $1`)
 }
@@ -4384,7 +4408,7 @@ init_logging() {
         echo "Logging to local directory: $LOGDIR"
     fi
 
-    yml_nodes_file $LOGDIR
+    yml_nodes_file $LOGDIR >> $YAML_LOG
     yml_results_file >> $YAML_LOG
 }
 
@@ -4397,11 +4421,11 @@ log_test_status() {
 }
 
 log_sub_test_begin() {
-    yml_log_sub_test_begin $@ >> $YAML_LOG
+    yml_log_sub_test_begin "$@" >> $YAML_LOG
 }
 
 log_sub_test_end() {
-    yml_log_sub_test_end $@ >> $YAML_LOG
+    yml_log_sub_test_end "$@" >> $YAML_LOG
 }
 
 run_llverdev()
@@ -4509,3 +4533,7 @@ is_sanity_benchmark() {
     return 1
 }
 
+min_ost_size () {
+    $LCTL get_param -n osc.*.kbytesavail | sort -n | head -n1
+}
+