Whamcloud - gitweb
LU-3720 test: use actual stripe count in sanity.sh 130d
[fs/lustre-release.git] / lustre / tests / sanity.sh
index eae0af9..5ac4621 100644 (file)
@@ -638,6 +638,9 @@ test_17n() {
 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
 
 test_17o() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ]] &&
+               skip "Need MDS version at least 2.3.64" && return
+
        local WDIR=$DIR/${tdir}o
        local mdt_index
        local mdtdevname
@@ -3090,6 +3093,37 @@ test_39m() {
 }
 run_test 39m "test atime and mtime before 1970"
 
+test_39n() { # LU-3832
+       local atime_diff=$(do_facet $SINGLEMDS \
+               lctl get_param -n mdd.*MDT0000*.atime_diff)
+       local atime0
+       local atime1
+       local atime2
+
+       do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
+
+       rm -rf $DIR/$tfile
+       dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
+       atime0=$(stat -c %X $DIR/$tfile)
+
+       sleep 5
+       $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
+       atime1=$(stat -c %X $DIR/$tfile)
+
+       sleep 5
+       cancel_lru_locks mdc
+       cancel_lru_locks osc
+       $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
+       atime2=$(stat -c %X $DIR/$tfile)
+
+       do_facet $SINGLEMDS \
+               lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
+
+       [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
+       [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
+}
+run_test 39n "check that O_NOATIME is honored"
+
 test_40() {
        dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
        $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
@@ -3924,8 +3958,7 @@ run_test 54e "console/tty device works in lustre ======================"
 test_56a() {   # was test_56
         rm -rf $DIR/$tdir
         $SETSTRIPE -d $DIR
-       test_mkdir $DIR/$tdir
-        test_mkdir $DIR/$tdir/dir
+        test_mkdir -p $DIR/$tdir/dir
         NUMFILES=3
         NUMFILESx2=$(($NUMFILES * 2))
         for i in `seq 1 $NUMFILES` ; do
@@ -4511,6 +4544,34 @@ test_56x() {
 }
 run_test 56x "lfs migration support"
 
+test_56y() {
+       local res=""
+
+       local dir0=$DIR/$tdir/$testnum
+       mkdir -p $dir0 || error "creating dir $dir0"
+       local f1=$dir0/file1
+       local f2=$dir0/file2
+
+       touch $f1 || error "creating std file $f1"
+       $MULTIOP $f2 H2c || error "creating released file $f2"
+
+       # a directory can be raid0, so ask only for files
+       res=$($LFIND $dir0 -L raid0 -type f | wc -l)
+       [[ $res == 2 ]] || error "search raid0: found $res files != 2"
+
+       res=$($LFIND $dir0 \! -L raid0 -type f | wc -l)
+       [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
+
+       # only files can be released, so no need to force file search
+       res=$($LFIND $dir0 -L released)
+       [[ $res == $f2 ]] || error "search released: found $res != $f2"
+
+       res=$($LFIND $dir0 \! -L released)
+       [[ $res == $f1 ]] || error "search !released: found $res != $f1"
+
+}
+run_test 56y "lfs find -L raid0|released"
+
 test_57a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        # note test will not do anything if MDS is not local
@@ -5804,40 +5865,31 @@ test_101c() {
        local STRIPE_SIZE=1048576
        local FILE_LENGTH=$((STRIPE_SIZE*100))
        local nreads=10000
-       local osc
-
-    setup_test101bc
-
-    cancel_lru_locks osc
-    $LCTL set_param osc.*.rpc_stats 0
-    $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
-    for osc in $($LCTL get_param -N osc.*); do
-        if [ "$osc" == "osc.num_refs" ]; then
-            continue
-        fi
+       local osc_rpc_stats
 
-        local lines=$($LCTL get_param -n ${osc}.rpc_stats | wc | awk '{print $1}')
-        if [ $lines -le 20 ]; then
-            continue
-        fi
+       setup_test101bc
 
-        local rpc4k=$($LCTL get_param -n ${osc}.rpc_stats |
-                                     awk '$1 == "1:" { print $2; exit; }')
-        local rpc8k=$($LCTL get_param -n ${osc}.rpc_stats |
-                                     awk '$1 == "2:" { print $2; exit; }')
-        local rpc16k=$($LCTL get_param -n ${osc}.rpc_stats |
-                                     awk '$1 == "4:" { print $2; exit; }')
-        local rpc32k=$($LCTL get_param -n ${osc}.rpc_stats |
-                                     awk '$1 == "8:" { print $2; exit; }')
-
-        [ $rpc4k != 0 ]  && error "Small 4k read IO ${rpc4k}!"
-        [ $rpc8k != 0 ]  && error "Small 8k read IO ${rpc8k}!"
-        [ $rpc16k != 0 ] && error "Small 16k read IO ${rpc16k}!"
-        [ $rpc32k != 0 ] && error "Small 32k read IO ${rpc32k}!"
-        echo "${osc} rpc check passed!"
-    done
-    cleanup_test101bc
-    true
+       cancel_lru_locks osc
+       $LCTL set_param osc.*.rpc_stats 0
+       $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
+       for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
+               local stats=$($LCTL get_param -n $osc_rpc_stats)
+               local lines=$(echo "$stats" | awk 'END {print NR;}')
+               local size
+
+               if [ $lines -le 20 ]; then
+                       continue
+               fi
+               for size in 1 2 4 8; do
+                       local rpc=$(echo "$stats" |
+                                   awk '($1 == "'$size':") {print $2; exit; }')
+                       [ $rpc != 0 ] &&
+                               error "Small $((size*4))k read IO $rpc !"
+               done
+               echo "$osc_rpc_stats check passed!"
+       done
+       cleanup_test101bc
+       true
 }
 run_test 101c "check stripe_size aligned read-ahead ================="
 
@@ -5854,12 +5906,13 @@ test_101d() {
 
        local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
        [ $space -gt $((size * 1024)) ] ||
-               { skip "Need free space ${size}M, have $space" && return; }
+               { skip "Need free space ${size}M, have ${space}K" && return; }
 
-    echo Creating ${size}M test file $file
-    dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
-    echo Cancel LRU locks on lustre client to flush the client cache
-    cancel_lru_locks osc
+       echo "Creating test file $file of size ${size}M with ${space}K free space"
+       $SETSTRIPE -c -1 $file || error "setstripe failed"
+       dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
+       echo Cancel LRU locks on lustre client to flush the client cache
+       cancel_lru_locks osc
 
     echo Disable read-ahead
     local old_READAHEAD=$(set_read_ahead 0)
@@ -7973,10 +8026,14 @@ test_130d() {
        $SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file||error "setstripe on $fm_file"
        [ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
                skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return
-       dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file"
+
+       local actual_stripecnt=$($GETSTRIPE -c $fm_file)
+       dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt ||
+               error "dd failed on $fm_file"
 
        filefrag -ves $fm_file || error "filefrag $fm_file failed"
-       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+       filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" |
+               grep -v "ext:" | grep -v "found"`
 
        last_lun=`echo $filefrag_op | cut -d: -f5`
 
@@ -8000,7 +8057,7 @@ test_130d() {
                (( tot_len += ext_len ))
                last_lun=$frag_lun
        done
-       if (( num_luns != OSTCOUNT || tot_len != 1024 )); then
+       if (( num_luns != actual_stripecnt || tot_len != 1024 )); then
                cleanup_130
                error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
                return
@@ -8587,12 +8644,48 @@ test_150() {
 }
 run_test 150 "truncate/append tests"
 
+#LU-2902 roc_hit was not able to read all values from lproc
+function roc_hit_init() {
+       local list=$(comma_list $(osts_nodes))
+       local dir=$DIR/$tdir-check
+       local file=$dir/file
+       local BEFORE
+       local AFTER
+       local idx
+
+       test_mkdir -p $dir
+       #use setstripe to do a write to every ost
+       for i in $(seq 0 $((OSTCOUNT-1))); do
+               $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
+               dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
+               idx=$(printf %04x $i)
+               BEFORE=$(get_osd_param $list *OST*$idx stats |
+                   awk '$1 == "cache_access" {sum += $2} END { print sum }')
+               if [ -z "$BEFORE" ]; then
+                       BEFORE=0
+               fi
+
+               cancel_lru_locks osc
+               cat $file >/dev/null
+
+               AFTER=$(get_osd_param $list *OST*$idx stats |
+                   awk '$1 == "cache_access" {sum += $2} END { print sum }')
+
+               echo BEFORE:$BEFORE AFTER:$AFTER
+               if ! let "AFTER - BEFORE == 4"; then
+                       rm -rf $dir
+                       error "roc_hit is not safe to use"
+               fi
+               rm $file
+       done
+
+       rm -rf $dir
+}
+
 function roc_hit() {
        local list=$(comma_list $(osts_nodes))
-       #debug temp debug for LU-2902: lets see what values we get back
-       echo $(get_osd_param $list '' stats) 1>&2
        echo $(get_osd_param $list '' stats |
-              awk '/'cache_hit'/ {sum+=$2} END {print sum}')
+               awk '$1 == "cache_hit" {sum += $2} END { print sum }')
 }
 
 function set_cache() {
@@ -8634,6 +8727,8 @@ test_151() {
                return 0
        fi
 
+       roc_hit_init
+
        #define OBD_FAIL_OBD_NO_LRU  0x609
        do_nodes $list $LCTL set_param fail_loc=0x609
 
@@ -9049,6 +9144,8 @@ test_156() {
                skip "LU-1956/LU-2261: stats unimplemented on OSD ZFS" &&
                return
 
+       roc_hit_init
+
     log "Turn on read and write cache"
     set_cache read on
     set_cache writethrough on
@@ -9406,6 +9503,93 @@ test_161b() {
 }
 run_test 161b "link ea sanity under remote directory"
 
+test_161c() {
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.5) ]] &&
+               skip "Need MDS version at least 2.1.5" && return
+
+       # define CLF_RENAME_LAST 0x0001
+       # rename overwrite a target having nlink = 1 (changelog flag 0x1)
+       local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+               changelog_register -n)
+       rm -rf $DIR/$tdir
+       mkdir -p $DIR/$tdir
+       touch $DIR/$tdir/foo_161c
+       touch $DIR/$tdir/bar_161c
+       mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
+       $LFS changelog $MDT0 | grep RENME
+       local flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | \
+               cut -f5 -d' ')
+       $LFS changelog_clear $MDT0 $USER 0
+       if [ x$flags != "x0x1" ]; then
+               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+                       $USER
+               error "flag $flags is not 0x1"
+       fi
+       echo "rename overwrite a target having nlink = 1," \
+               "changelog record has flags of $flags"
+
+       # rename overwrite a target having nlink > 1 (changelog flag 0x0)
+       touch $DIR/$tdir/foo_161c
+       touch $DIR/$tdir/bar_161c
+       ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
+       mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
+       $LFS changelog $MDT0 | grep RENME
+       flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
+       $LFS changelog_clear $MDT0 $USER 0
+       if [ x$flags != "x0x0" ]; then
+               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+                       $USER
+               error "flag $flags is not 0x0"
+       fi
+       echo "rename overwrite a target having nlink > 1," \
+               "changelog record has flags of $flags"
+
+       # rename doesn't overwrite a target (changelog flag 0x0)
+       touch $DIR/$tdir/foo_161c
+       mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
+       $LFS changelog $MDT0 | grep RENME
+       flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
+       $LFS changelog_clear $MDT0 $USER 0
+       if [ x$flags != "x0x0" ]; then
+               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+                       $USER
+               error "flag $flags is not 0x0"
+       fi
+       echo "rename doesn't overwrite a target," \
+               "changelog record has flags of $flags"
+
+       # define CLF_UNLINK_LAST 0x0001
+       # unlink a file having nlink = 1 (changelog flag 0x1)
+       rm -f $DIR/$tdir/foo2_161c
+       $LFS changelog $MDT0 | grep UNLNK
+       flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
+       $LFS changelog_clear $MDT0 $USER 0
+       if [ x$flags != "x0x1" ]; then
+               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+                       $USER
+               error "flag $flags is not 0x1"
+       fi
+       echo "unlink a file having nlink = 1," \
+               "changelog record has flags of $flags"
+
+       # unlink a file having nlink > 1 (changelog flag 0x0)
+       ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
+       rm -f $DIR/$tdir/foobar_161c
+       $LFS changelog $MDT0 | grep UNLNK
+       flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
+       $LFS changelog_clear $MDT0 $USER 0
+       if [ x$flags != "x0x0" ]; then
+               do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+                       $USER
+               error "flag $flags is not 0x0"
+       fi
+       echo "unlink a file having nlink > 1," \
+               "changelog record has flags of $flags"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+}
+run_test 161c "check CL_RENME[UNLINK] changelog record flags"
+
 check_path() {
     local expected=$1
     shift
@@ -9468,20 +9652,6 @@ test_162() {
 }
 run_test 162 "path lookup sanity"
 
-test_163() {
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       remote_mds_nodsh && skip "remote MDS with nodsh" && return
-       copytool --test $FSNAME || { skip "copytool not runnable: $?" && return; }
-       copytool $FSNAME &
-       sleep 1
-       local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid)
-       # this proc file is temporary and linux-only
-       do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
-         error "kernel->userspace send failed"
-       kill -INT $!
-}
-run_test 163 "kernel <-> userspace comms"
-
 test_169() {
        # do directio so as not to populate the page cache
        log "creating a 10 Mb file"
@@ -10676,12 +10846,13 @@ test_215() { # for bugs 18102, 21079, 21517
 
        # /proc/sys/lnet/routes should look like this:
        # Routing disabled/enabled
-       # net hops state router
-       # where net is a string like tcp0, hops >= 0, state is up/down,
+       # net hops priority state router
+       # where net is a string like tcp0, hops > 0, priority >= 0,
+       # state is up/down,
        # router is a string like 192.168.1.1@tcp2
        L1="^Routing (disabled|enabled)$"
-       L2="^net +hops +state +router$"
-       BR="^$NET +$N +(up|down) +$NID$"
+       L2="^net +hops +priority +state +router$"
+       BR="^$NET +$N +(0|1) +(up|down) +$NID$"
        create_lnet_proc_files "routes"
        check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2"
        check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
@@ -11256,8 +11427,7 @@ test_229() { # LU-2482, LU-3448
 
        $GETSTRIPE -v $DIR/$tfile
 
-       local pattern=$($GETSTRIPE -v $DIR/$tfile |
-                       grep lmm_stripe_pattern | awk '{print $2}')
+       local pattern=$($GETSTRIPE -L $DIR/$tfile)
        [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
 
        local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
@@ -11415,12 +11585,57 @@ test_232() {
 run_test 232 "failed lock should not block umount"
 
 test_233() {
+       [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] ||
+       { skip "Need MDS version at least 2.3.64"; return; }
+
        local fid=$($LFS path2fid $MOUNT)
        stat $MOUNT/.lustre/fid/$fid > /dev/null ||
                error "cannot access $MOUNT using its FID '$fid'"
 }
 run_test 233 "checking that OBF of the FS root succeeds"
 
+test_234() {
+       local p="$TMP/sanityN-$TESTNAME.parameters"
+       save_lustre_params client "llite.*.xattr_cache" > $p
+       lctl set_param llite.*.xattr_cache 1 ||
+               { skip "xattr cache is not supported"; return 0; }
+
+       mkdir -p $DIR/$tdir || error "mkdir failed"
+       touch $DIR/$tdir/$tfile || error "touch failed"
+       # OBD_FAIL_LLITE_XATTR_ENOMEM
+       $LCTL set_param fail_loc=0x1405
+       setfattr -n user.attr -v value $DIR/$tdir/$tfile &&
+               error "setfattr should have failed with ENOMEM"
+       if [ ! -f /etc/SuSE-release ]; then
+               # attr pre-2.4.44-7 had a bug with rc
+               # LU-3703 - SLES clients have older attr
+               getfattr -n user.attr $DIR/$tdir/$tfile &&
+                       error "getfattr should have failed with ENOMEM"
+       fi
+       $LCTL set_param fail_loc=0x0
+       rm -rf $DIR/$tdir
+
+       restore_lustre_params < $p
+       rm -f $p
+}
+run_test 234 "xattr cache should not crash on ENOMEM"
+
+test_235() {
+        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] &&
+               skip "Need MDS version at least 2.4.52" && return
+       flock_deadlock $DIR/$tfile
+       local RC=$?
+       case $RC in
+               0)
+               ;;
+               124) error "process hangs on a deadlock"
+               ;;
+               *) error "error executing flock_deadlock $DIR/$tfile"
+               ;;
+       esac
+}
+run_test 235 "LU-1715: flock deadlock detection does not work properly"
+
 #
 # tests that do cleanup/setup should be run at the end
 #