Whamcloud - gitweb
LU-3648 test: large_xattr_enable doesn't detect large xattrs
[fs/lustre-release.git] / lustre / tests / test-framework.sh
index 231b6c3..963db0b 100644 (file)
@@ -298,6 +298,7 @@ init_test_env() {
     fi
 
     export SHUTDOWN_ATTEMPTS=${SHUTDOWN_ATTEMPTS:-3}
+       export OSD_TRACK_DECLARES_LBUG=${OSD_TRACK_DECLARES_LBUG:-"yes"}
 
     # command line
 
@@ -491,6 +492,7 @@ load_modules_local() {
         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; }
+               load_module lfsck/lfsck
                [ "$LQUOTA" != "no" ] && load_module quota/lquota $LQUOTAOPTS
                if [[ $(node_fstypes $HOSTNAME) == *zfs* ]]; then
                        modprobe zfs
@@ -592,7 +594,7 @@ fs_log_size() {
        local size=0
        case $fstype in
                ldiskfs) size=50;; # largest seen is 44, leave some headroom
-               zfs)     size=256;;
+               zfs)     size=400;; # largest seen is 384
        esac
 
        echo -n $size
@@ -899,6 +901,7 @@ export_zpool() {
 
        if [[ -n "$poolname" ]]; then
                do_facet $facet "! $ZPOOL list -H $poolname >/dev/null 2>&1 ||
+                       grep -q ^$poolname/ /proc/mounts ||
                        $ZPOOL export $opts $poolname"
        fi
 }
@@ -916,7 +919,9 @@ import_zpool() {
        poolname=$(zpool_name $facet)
 
        if [[ -n "$poolname" ]]; then
-               do_facet $facet "$ZPOOL import -f $opts $poolname"
+               opts+=" -d $(dirname $(facet_vdevice $facet))"
+               do_facet $facet "$ZPOOL list -H $poolname >/dev/null 2>&1 ||
+                       $ZPOOL import -f $opts $poolname"
        fi
 }
 
@@ -1868,30 +1873,43 @@ cleanup_check() {
 }
 
 wait_update () {
-    local node=$1
-    local TEST=$2
-    local FINAL=$3
-    local MAX=${4:-90}
-
-        local RESULT
-        local WAIT=0
-        local sleep=1
-        local print=10
-        while [ true ]; do
-            RESULT=$(do_node $node "$TEST")
-            if [ "$RESULT" == "$FINAL" ]; then
-                [ -z "$RESULT" -o $WAIT -le $sleep ] ||
-                    echo "Updated after ${WAIT}s: wanted '$FINAL' got '$RESULT'"
-                return 0
-            fi
-            [ $WAIT -ge $MAX ] && break
-            [ $((WAIT % print)) -eq 0 ] &&
-                echo "Waiting $((MAX - WAIT)) secs for update"
-            WAIT=$((WAIT + sleep))
-            sleep $sleep
-        done
-        echo "Update not seen after ${MAX}s: wanted '$FINAL' got '$RESULT'"
-        return 3
+       local verbose=false
+       if [[ "$1" == "--verbose" ]]; then
+               shift
+               verbose=true
+       fi
+
+       local node=$1
+       local TEST=$2
+       local FINAL=$3
+       local MAX=${4:-90}
+       local RESULT
+       local PREV_RESULT
+       local WAIT=0
+       local sleep=1
+       local print=10
+
+       while [ true ]; do
+               RESULT=$(do_node $node "$TEST")
+               if [[ "$RESULT" == "$FINAL" ]]; then
+                       [[ -z "$RESULT" || $WAIT -le $sleep ]] ||
+                               echo "Updated after ${WAIT}s: wanted '$FINAL'"\
+                                    "got '$RESULT'"
+                       return 0
+               fi
+               if [[ $verbose && "$RESULT" != "$PREV_RESULT" ]]; then
+                       echo "Changed after ${WAIT}s: from '$PREV_RESULT'"\
+                            "to '$RESULT'"
+                       PREV_RESULT=$RESULT
+               fi
+               [[ $WAIT -ge $MAX ]] && break
+               [[ $((WAIT % print)) -eq 0 ]] &&
+                       echo "Waiting $((MAX - WAIT)) secs for update"
+               WAIT=$((WAIT + sleep))
+               sleep $sleep
+       done
+       echo "Update not seen after ${MAX}s: wanted '$FINAL' got '$RESULT'"
+       return 3
 }
 
 wait_update_facet() {
@@ -3528,10 +3546,17 @@ is_empty_dir() {
 
 # empty lustre filesystem may have empty directories lost+found and .lustre
 is_empty_fs() {
+       # exclude .lustre & lost+found
        [ $(find $1 -maxdepth 1 -name lost+found -o -name .lustre -prune -o \
                -print | wc -l) = 1 ] || return 1
        [ ! -d $1/lost+found ] || is_empty_dir $1/lost+found || return 1
-       [ ! -d $1/.lustre ] || is_empty_dir $1/.lustre || return 1
+       if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]; then
+               # exclude .lustre/fid (LU-2780)
+               [ $(find $1/.lustre -maxdepth 1 -name fid -prune -o \
+                       -print | wc -l) = 1 ] || return 1
+       else
+               [ ! -d $1/.lustre ] || is_empty_dir $1/.lustre || return 1
+       fi
        return 0
 }
 
@@ -3593,10 +3618,13 @@ check_and_setup_lustre() {
         set_default_debug_nodes $(comma_list $(nodes_list))
     fi
 
-       if [ -n "$OSD_TRACK_DECLARES_LBUG" ] ; then
-               do_nodes $(comma_list $(mdts_nodes) $(osts_nodes)) \
-                        "$LCTL set_param osd-*.track_declares_assert=1" \
-                        > /dev/null
+       if [ $(lower $OSD_TRACK_DECLARES_LBUG) == 'yes' ] ; then
+               local facets="$(get_facets OST),$(get_facets MDS),mgs"
+               local nodes="$(facets_hosts ${facets})"
+               if [ -n "$nodes" ] ; then
+                       do_nodes $nodes "$LCTL set_param \
+                                osd-ldiskfs.track_declares_assert=1 || true"
+               fi
        fi
 
        init_gss
@@ -6060,24 +6088,23 @@ run_llverfs()
 
 #Remove objects from OST
 remove_ost_objects() {
-       shift
-       local ostdev=$1
-       local group=$2
-       shift 2
+       local facet=$1
+       local ostdev=$2
+       local group=$3
+       shift 3
        local objids="$@"
-       local facet=ost$((OSTIDX + 1))
        local mntpt=$(facet_mntpt $facet)
        local opts=$OST_MOUNT_OPTS
        local i
        local rc
 
        echo "removing objects from $ostdev on $facet: $objids"
-       if ! do_facet $facet test -b $ostdev; then
+       if ! test -b $ostdev; then
                opts=$(csa_add "$opts" -o loop)
        fi
        mount -t $(facet_fstype $facet) $opts $ostdev $mntpt ||
                return $?
-       rc=0;
+       rc=0
        for i in $objids; do
                rm $mntpt/O/$group/d$((i % 32))/$i || { rc=$?; break; }
        done
@@ -6101,7 +6128,7 @@ remove_mdt_files() {
        fi
        mount -t $(facet_fstype $facet) $opts $mdtdev $mntpt ||
                return $?
-       rc=0;
+       rc=0
        for f in $files; do
                rm $mntpt/ROOT/$f || { rc=$?; break; }
        done
@@ -6206,7 +6233,8 @@ large_xattr_enabled() {
 
        local mds_dev=$(mdsdevname ${SINGLEMDS//mds/})
 
-       do_facet $SINGLEMDS "$DUMPE2FS -h $mds_dev 2>&1 | grep -q large_xattr"
+       do_facet $SINGLEMDS "$DUMPE2FS -h $mds_dev 2>&1 |
+               grep -E -q '(ea_inode|large_xattr)'"
        return ${PIPESTATUS[0]}
 }
 
@@ -6359,41 +6387,28 @@ generate_logname() {
        echo "$TESTLOG_PREFIX.$TESTNAME.$logname.$(hostname -s).log"
 }
 
-# mkdir directory on different MDTs
+# make directory on different MDTs
 test_mkdir() {
        local option
        local parent
        local child
        local path
-       local dir
        local rc=0
 
-       if [ $# -eq 2 ]; then
-               option=$1
-               path=$2
-       else
-               path=$1
-       fi
-
-       child=${path##*/}
-       parent=${path%/*}
+       case $# in
+               1) path=$1;;
+               2) option=$1
+                  path=$2;;
+               *) error "Only creating single directory is supported";;
+       esac
 
-       if [ "$parent" == "$child" ]; then
-               parent=$(pwd)
-       fi
+       child=$(basename $path)
+       parent=$(dirname $path)
 
-       if [ "$option" == "-p" -a -d ${parent}/${child} ]; then
+       if [ "$option" == "-p" -a -d $parent/$child ]; then
                return $rc
        fi
 
-       # it needs to check whether there is further / in child
-       dir=$(echo $child | awk -F '/' '{print $2}')
-       if [ ! -z "$dir" ]; then
-               local subparent=$(echo $child | awk -F '/' '{ print $1 }')
-               parent=${parent}"/"${subparent}
-               child=$dir
-       fi
-
        if [ ! -d ${parent} ]; then
                if [ "$option" == "-p" ]; then
                        mkdir -p ${parent}
@@ -6403,19 +6418,18 @@ test_mkdir() {
        fi
 
        if [ $MDSCOUNT -le 1 ]; then
-               mkdir $option ${parent}/${child} || rc=$?
+               mkdir $option $parent/$child || rc=$?
        else
                local mdt_idx=$($LFS getstripe -M $parent)
+               local test_num=$(echo $testnum | sed -e 's/[^0-9]*//g')
 
                if [ "$mdt_idx" -ne 0 ]; then
-                       mkdir $option ${parent}/${child} || rc=$?
-                       return $rc
+                       mkdir $option $parent/$child || rc=$?
+               else
+                       mdt_idx=$((test_num % MDSCOUNT))
+                       echo "mkdir $mdt_idx for $parent/$child"
+                       $LFS setdirstripe -i $mdt_idx $parent/$child || rc=$?
                fi
-
-               local test_num=$(echo $testnum | sed -e 's/[^0-9]*//g')
-               local mdt_idx=$((test_num % MDSCOUNT))
-               echo "mkdir $mdt_idx for ${parent}/${child}"
-               $LFS setdirstripe -i $mdt_idx ${parent}/${child} || rc=$?
        fi
        return $rc
 }