X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=02f0d6f9c769ccb930d3a3db852ca1c352e6841c;hb=322968acf183ab16d952cd3026f6580957b31259;hp=b1e0583098ea2b64f89521b4aaab85b99aaa3849;hpb=419016ac3e53e798453106ec04412a4843620916;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index b1e0583..02f0d6f 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -9,10 +9,8 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742 -ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b $SANITY_EXCEPT" -# bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443 -#ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"} +# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 5188 +ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 68b $SANITY_EXCEPT" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! # Tests that fail on uml @@ -468,6 +466,7 @@ test_17g() { run_test 17g "symlinks: really long symlink name ===============================" test_17h() { #bug 17378 + remote_mds_nodsh && skip "remote MDS with nodsh" && return mkdir -p $DIR/$tdir $SETSTRIPE $DIR/$tdir -c -1 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 @@ -477,6 +476,7 @@ test_17h() { #bug 17378 run_test 17h "create objects: lov_free_memmd() doesn't lbug" test_17i() { #bug 20018 + remote_mds_nodsh && skip "remote MDS with nodsh" && return mkdir -p $DIR/$tdir local foo=$DIR/$tdir/$tfile ln -s $foo $foo || error "create symlink failed" @@ -1045,8 +1045,7 @@ exhaust_precreations() { local MDSIDX=$(get_mds_dir "$DIR/$tdir") echo OSTIDX=$OSTIDX MDSIDX=$MDSIDX - local OST=$(lfs osts | grep ${OSTIDX}": " | \ - awk '{print $2}' | sed -e 's/_UUID$//') + local OST=$(ostname_from_index $OSTIDX) local MDT_INDEX=$(lfs df | grep "\[MDT:$((MDSIDX - 1))\]" | awk '{print $1}' | \ sed -e 's/_UUID$//;s/^.*-//') @@ -1140,6 +1139,7 @@ test_27q() { reset_enospc rm -f $DIR/$tdir/$tfile + mkdir -p $DIR/$tdir $MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed" $TRUNCATE $DIR/$tdir/$tfile 80000000 ||error "truncate $DIR/$tdir/$tfile failed" $CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed" @@ -1209,9 +1209,9 @@ test_27u() { # bug 4900 run_test 27u "skip object creation on OSC w/o objects ==========" test_27v() { # bug 4900 - [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - remote_ost_nodsh && skip "remote OST with nodsh" && return + [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return exhaust_all_precreations 0x215 reset_enospc @@ -1222,7 +1222,7 @@ test_27v() { # bug 4900 touch $DIR/$tdir/$tfile #define OBD_FAIL_TGT_DELAY_PRECREATE 0x705 # all except ost1 - for (( i=0; i < OSTCOUNT; i++ )) ; do + for (( i=1; i < OSTCOUNT; i++ )); do do_facet ost$i lctl set_param fail_loc=0x705 done local START=`date +%s` @@ -1230,9 +1230,10 @@ test_27v() { # bug 4900 local FINISH=`date +%s` local TIMEOUT=`lctl get_param -n timeout` - [ $((FINISH - START)) -ge $((TIMEOUT / 2)) ] && \ + local PROCESS=$((FINISH - START)) + [ $PROCESS -ge $((TIMEOUT / 2)) ] && \ error "$FINISH - $START >= $TIMEOUT / 2" - + sleep $((TIMEOUT / 2 - PROCESS)) reset_enospc } run_test 27v "skip object creation on slow OST =================" @@ -1258,10 +1259,11 @@ test_27w() { # bug 10997 run_test 27w "check lfs setstripe -c -s -i options =============" test_27x() { + remote_ost_nodsh && skip "remote OST with nodsh" && return [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return OFFSET=$(($OSTCOUNT - 1)) OSTIDX=0 - local OST=$(lfs osts | awk '/'${OSTIDX}': / { print $2 }' | sed -e 's/_UUID$//') + local OST=$(ostname_from_index $OSTIDX) mkdir -p $DIR/$tdir $SETSTRIPE $DIR/$tdir -c 1 # 1 stripe per file @@ -1279,6 +1281,7 @@ run_test 27x "create files while OST0 is degraded" test_27y() { [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ @@ -1301,14 +1304,14 @@ test_27y() { } fi done - OSTIDX=$(lfs osts | grep ${OST} | awk '{print $1}' | sed -e 's/://') + OSTIDX=$(index_from_ostuuid $OST) mkdir -p $DIR/$tdir $SETSTRIPE $DIR/$tdir -c 1 # 1 stripe / file - do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 1 + do_facet ost$((OSTIDX+1)) lctl set_param -n obdfilter.$OST.degraded 1 sleep_maxage createmany -o $DIR/$tdir/$tfile $fcount - do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 0 + do_facet ost$((OSTIDX+1)) lctl set_param -n obdfilter.$OST.degraded 0 for i in `seq 0 $OFFSET`; do [ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "$OSTIDX"` ] || \ @@ -1344,14 +1347,13 @@ check_seq_oid() [ "$FSTYPE" != "ldiskfs" ] && skip "can not check trusted.fid FSTYPE=$FSTYPE" && return 0 # check the trusted.fid attribute of the OST objects of the file - for (( i=0, j=19; i < ${lmm[8]}; i++, j+=4 )); do + for (( i=0, j=21; i < ${lmm[8]}; i++, j+=4 )); do local obdidx=${lmm[$j]} local devnum=$((obdidx + 1)) local objid=${lmm[$((j+1))]} local group=${lmm[$((j+3))]} local dev=$(ostdevname $devnum) - local dir=${MOUNT%/*}/ost$devnum - local mntpt=$(facet_mntpt ost$devnum) + local dir=$(facet_mntpt ost$devnum) stop ost$devnum do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS || @@ -1371,19 +1373,20 @@ check_seq_oid() [ $stripe -eq $i ] || { error "stripe mismatch"; return 6; } echo -e "\t\tost $obdidx, objid $objid, group $group" - do_facet ost$devnum umount -d $mntpt + do_facet ost$devnum umount -d $dir start ost$devnum $dev $OST_MOUNT_OPTS done } test_27z() { + remote_ost_nodsh && skip "remote OST with nodsh" && return mkdir -p $DIR/$tdir $SETSTRIPE $DIR/$tdir/$tfile-1 -c 1 -o 0 -s 1m || - { error "setstripe -c -1 failed"; return 1; } + { error "setstripe -c 1 failed"; return 1; } dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 || { error "dd 1 mb failed"; return 2; } $SETSTRIPE $DIR/$tdir/$tfile-2 -c -1 -o $(($OSTCOUNT - 1)) -s 1m || - { error "setstripe -c 1 failed"; return 3; } + { error "setstripe -c -1 failed"; return 3; } dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT || { error "dd $OSTCOUNT mb failed"; return 4; } sync @@ -1878,6 +1881,7 @@ test_33c() { local write_bytes local all_zeros + remote_ost_nodsh && skip "remote OST with nodsh" && return all_zeros=: rm -fr $DIR/d33 mkdir -p $DIR/d33 @@ -1887,7 +1891,7 @@ test_33c() { for ostnum in $(seq $OSTCOUNT); do # test-framework's OST numbering is one-based, while Lustre's # is zero-based - ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1))) # Parsing llobdstat's output sucks; we could grep the /proc # path, but that's likely to not be as portable as using the # llobdstat utility. So we parse lctl output instead. @@ -1911,7 +1915,7 @@ test_33c() { # Total up write_bytes after writing. We'd better find non-zeros. for ostnum in $(seq $OSTCOUNT); do - ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1))) write_bytes=$(do_facet ost$ostnum lctl get_param -n \ obdfilter/$ostname/stats | awk '/^write_bytes/ {print $7}' ) @@ -1926,7 +1930,7 @@ test_33c() { if $all_zeros then for ostnum in $(seq $OSTCOUNT); do - ostname=$(printf "lustre-OST%.4d" $((ostnum - 1))) + ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1))) echo "Check that write_bytes is present in obdfilter/*/stats:" do_facet ost$ostnum lctl get_param -n \ obdfilter/$ostname/stats @@ -2413,6 +2417,7 @@ run_test 39k "write, utime, close, stat ========================" TEST_39_ATIME=`date -d "1 year" +%s` test_39l() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return local atime_diff=$(do_facet $SINGLEMDS lctl get_param -n mdd.*.atime_diff) mkdir -p $DIR/$tdir @@ -2977,17 +2982,13 @@ test_51a() { # was test_51 } run_test 51a "special situations: split htree with empty entry ==" -#export NUMTEST=70000 -# FIXME: I select a relatively small number to do basic test. -# large number may give panic(). debugging on this is going on. -export NUMTEST=70 +export NUMTEST=70000 test_51b() { NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'` [ $NUMFREE -lt 21000 ] && \ skip "not enough free inodes ($NUMFREE)" && \ return - check_kernel_version 40 || NUMTEST=31000 [ $NUMFREE -lt $NUMTEST ] && NUMTEST=$(($NUMFREE - 50)) mkdir -p $DIR/d51b @@ -2995,6 +2996,32 @@ test_51b() { } run_test 51b "mkdir .../t-0 --- .../t-$NUMTEST ====================" +test_51ba() { # LU-993 + local BASE=$DIR/d51b + # unlink all but 100 subdirectories, then check it still works + local LEFT=100 + local DELETE=$((NUMTEST - LEFT)) + + ! [ -d "${BASE}/t-$DELETE" ] && skip "test_51b() not run" && return 0 + + # for ldiskfs the nlink count should be 1, but this is OSD specific + # and so this is listed for informational purposes only + log "nlink before: $(stat -c %h $BASE)" + unlinkmany -d $BASE/t- $DELETE || + error "unlink of first $DELETE subdirs failed" + + log "nlink between: $(stat -c %h $BASE)" + local FOUND=$(ls -l ${BASE} | wc -l) + FOUND=$((FOUND - 1)) # trim the first line of ls output + [ $FOUND -ne $LEFT ] && + error "can't find subdirs: found only $FOUND/$LEFT" + + unlinkmany -d $BASE/t- $DELETE $LEFT || + error "unlink of second $LEFT subdirs failed" + log "nlink after: $(stat -c %h $BASE)" +} +run_test 51ba "rmdir .../t-0 --- .../t-$NUMTEST" + test_51bb() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return @@ -3260,7 +3287,7 @@ test_56a() { # was test_56 [ "$OSTCOUNT" -lt 2 ] && \ skip_env "skipping other lfs getstripe --obd test" && return OSTIDX=1 - OBDUUID=$(lfs osts | grep ${OSTIDX}": " | awk '{print $2}') + OBDUUID=$(ostuuid_from_index $OSTIDX) FILENUM=`$GETSTRIPE -ir $DIR/d56 | grep -x $OSTIDX | wc -l` FOUND=`$GETSTRIPE -r --obd $OBDUUID $DIR/d56 | grep obdidx | wc -l` [ $FOUND -eq $FILENUM ] || \ @@ -3348,9 +3375,9 @@ test_56i() { mkdir -p $DIR/$tdir UUID=$(ostuuid_from_index 0 $DIR/$tdir) OUT=$($LFIND -obd $UUID $DIR/$tdir) - [ "$OUT" ] && error "$LFIND returned directory '$OUT'" || true + [ "$OUT" ] && error "$LFIND -obd returned directory '$OUT'" || true } -run_test 56i "check 'lfs find -ost UUID' skips directories =======" +run_test 56i "check 'lfs find -obd UUID' skips directories =======" test_56j() { setup_56_special $NUMFILES $NUMDIRS @@ -3403,19 +3430,27 @@ test_56n() { run_test 56n "check lfs find -type l =============================" test_56o() { - setup_56 $NUMFILES $NUMDIRS TDIR=$DIR/${tdir}g + rm -rf $TDIR + setup_56 $NUMFILES $NUMDIRS utime $TDIR/file1 > /dev/null || error "utime (1)" utime $TDIR/file2 > /dev/null || error "utime (2)" utime $TDIR/dir1 > /dev/null || error "utime (3)" utime $TDIR/dir2 > /dev/null || error "utime (4)" utime $TDIR/dir1/file1 > /dev/null || error "utime (5)" + dd if=/dev/zero count=1 >> $TDIR/dir1/file1 && sync + + EXPECTED=4 + NUMS=`$LFIND -mtime +0 $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find -mtime +0 $TDIR wrong: found $NUMS, expected $EXPECTED" - EXPECTED=5 - NUMS=`$LFIND -mtime +1 $TDIR | wc -l` + EXPECTED=12 + NUMS=`$LFIND -mtime 0 $TDIR | wc -l` [ $NUMS -eq $EXPECTED ] || \ - error "lfs find -mtime $TDIR wrong: found $NUMS, expected $EXPECTED" + error "lfs find -mtime 0 $TDIR wrong: found $NUMS, expected $EXPECTED" + } run_test 56o "check lfs find -mtime for old files ==========================" @@ -3478,6 +3513,7 @@ test_56r() { [ $NUMS -eq $EXPECTED ] || \ error "lfs find $TDIR ! -size 0 wrong: found $NUMS, expected $EXPECTED" echo "test" > $TDIR/56r && sync + echo "test2" > $TDIR/56r2 && sync EXPECTED=1 NUMS=`$LFIND -size 5 -t f $TDIR | wc -l` [ $NUMS -eq $EXPECTED ] || \ @@ -3486,18 +3522,38 @@ test_56r() { NUMS=`$LFIND -size +5 -t f $TDIR | wc -l` [ $NUMS -eq $EXPECTED ] || \ error "lfs find $TDIR -size +5 wrong: found $NUMS, expected $EXPECTED" - EXPECTED=13 + EXPECTED=2 NUMS=`$LFIND -size +0 -t f $TDIR | wc -l` [ $NUMS -eq $EXPECTED ] || \ error "lfs find $TDIR -size +0 wrong: found $NUMS, expected $EXPECTED" - EXPECTED=0 + EXPECTED=2 NUMS=`$LFIND ! -size -5 -t f $TDIR | wc -l` [ $NUMS -eq $EXPECTED ] || \ error "lfs find $TDIR ! -size -5 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=12 + NUMS=`$LFIND -size -5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size -5 wrong: found $NUMS, expected $EXPECTED" } run_test 56r "check lfs find -size works ==========================" +test_56v() { + local FIND_MDT_IDX=0 + + TDIR=${tdir}g + rm -rf $TDIR + setup_56 $NUMFILES $NUMDIRS + + UUID=$(mdtuuid_from_index $FIND_MDT_IDX $DIR/$TDIR) + for file in $($LFIND -mdt $UUID $DIR/$TDIR); do + file_mdt_idx=$($GETSTRIPE -M $file) + [ $file_mdt_idx -eq $FIND_MDT_IDX ] || + error "wrong lfind -m not match getstripe -M" + done +} +run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' =======" + test_57a() { # note test will not do anything if MDS is not local remote_mds_nodsh && skip "remote MDS with nodsh" && return @@ -3514,6 +3570,7 @@ test_57a() { run_test 57a "verify MDS filesystem created with large inodes ==" test_57b() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return local dir=$DIR/d57b local FILECOUNT=100 @@ -3585,6 +3642,7 @@ run_test 59 "verify cancellation of llog records async =========" TEST60_HEAD="test_60 run $RANDOM" test_60a() { + remote_mgs_nodsh && skip "remote MGS with nodsh" && return [ ! -f run-llog.sh ] && skip_env "missing subtest run-llog.sh" && return log "$TEST60_HEAD - from kernel mode" do_facet mgs sh run-llog.sh @@ -3740,9 +3798,9 @@ test_65d() { mkdir -p $DIR/d65 if [ $STRIPECOUNT -le 0 ]; then sc=1 - elif [ $STRIPECOUNT -gt 160 ]; then -#LOV_MAX_STRIPE_COUNT is 160 - [ $OSTCOUNT -gt 160 ] && sc=160 || sc=$(($OSTCOUNT - 1)) + elif [ $STRIPECOUNT -gt 2000 ]; then +#LOV_MAX_STRIPE_COUNT is 2000 + [ $OSTCOUNT -gt 2000 ] && sc=2000 || sc=$(($OSTCOUNT - 1)) else sc=$(($STRIPECOUNT - 1)) fi @@ -3897,6 +3955,8 @@ swap_used() { # test case for lloop driver, basic function test_68a() { [ "$UID" != 0 ] && skip_env "must run as root" && return + llite_lloop_enabled || \ + { skip_env "llite_lloop module disabled" && return; } trap cleanup_68 EXIT @@ -4170,13 +4230,12 @@ set_checksums() return 0 } -export ORIG_CSUM_TYPE="" +export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type | + sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`" CKSUM_TYPES=${CKSUM_TYPES:-"crc32 adler"} +[ "$ORIG_CSUM_TYPE" = "crc32c" ] && CKSUM_TYPES="$CKSUM_TYPES crc32c" set_checksum_type() { - [ "$ORIG_CSUM_TYPE" ] || \ - ORIG_CSUM_TYPE=`lctl get_param -n osc/*osc-[^mM]*/checksum_type | - sed 's/.*\[\(.*\)\].*/\1/g' | head -n1` lctl set_param -n osc.*osc-[^mM]*.checksum_type $1 log "set checksum type to $1" return 0 @@ -4427,6 +4486,7 @@ test_80() { # bug 10718 run_test 80 "Page eviction is equally fast at high offsets too ====" test_81a() { # LU-456 + remote_ost_nodsh && skip "remote OST with nodsh" && return # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228 # MUST OR with the OBD_FAIL_ONCE (0x80000000) do_facet ost0 lctl set_param fail_loc=0x80000228 @@ -4442,6 +4502,7 @@ test_81a() { # LU-456 run_test 81a "OST should retry write when get -ENOSPC ===============" test_81b() { # LU-456 + remote_ost_nodsh && skip "remote OST with nodsh" && return # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228 # Don't OR with the OBD_FAIL_ONCE (0x80000000) do_facet ost0 lctl set_param fail_loc=0x228 @@ -4806,7 +4867,10 @@ test_102b() { echo "get/set/list trusted.lov xattr ..." [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return local testfile=$DIR/$tfile - $SETSTRIPE -s 65536 -i 1 -c 2 $testfile || error "setstripe failed" + $SETSTRIPE -s 65536 -i 1 -c $OSTCOUNT $testfile || + error "setstripe failed" + local STRIPECOUNT=$(lfs getstripe -c $testfile) || + error "getstripe failed" getfattr -d -m "^trusted" $testfile 2> /dev/null | \ grep "trusted.lov" || error "can't get trusted.lov from $testfile" @@ -4821,7 +4885,8 @@ test_102b() { local stripe_size=`grep "size" $tmp_file| awk '{print $2}'` local stripe_count=`grep "count" $tmp_file| awk '{print $2}'` [ "$stripe_size" -eq 65536 ] || error "stripe size $stripe_size != 65536" - [ "$stripe_count" -eq 2 ] || error "stripe count $stripe_count != 2" + [ "$stripe_count" -eq $STRIPECOUNT ] || + error "stripe count $stripe_count != $STRIPECOUNT" rm -f $DIR/$tfile } run_test 102b "getfattr/setfattr for trusted.lov EAs ============" @@ -4833,7 +4898,10 @@ test_102c() { mkdir -p $DIR/$tdir chown $RUNAS_ID $DIR/$tdir local testfile=$DIR/$tdir/$tfile - $RUNAS $SETSTRIPE -s 65536 -i 1 -c 2 $testfile||error "setstripe failed" + $RUNAS $SETSTRIPE -s 65536 -i 1 -c $OSTCOUNT $testfile || + error "setstripe failed" + local STRIPECOUNT=$($RUNAS lfs getstripe -c $testfile) || + error "getstripe failed" $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \ grep "lustre.lov" || error "can't get lustre.lov from $testfile" @@ -4848,7 +4916,8 @@ test_102c() { local stripe_size=`grep "size" $tmp_file| awk '{print $2}'` local stripe_count=`grep "count" $tmp_file| awk '{print $2}'` [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536" - [ $stripe_count -eq 2 ] || error "stripe count $stripe_count != 2" + [ $stripe_count -eq $STRIPECOUNT ] || + error "stripe count $stripe_count != $STRIPECOUNT" } run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ===========" @@ -4935,51 +5004,58 @@ test_102f() { } run_test 102f "tar copy files, not keep osts ===========" -test_102h() { # bug 15777 +grow_xattr() { + local xsize=${1:-1024} # in bytes + local file=$DIR/$tfile + [ -z $(lctl get_param -n mdc.*.connect_flags | grep xattr) ] && - skip "must have user_xattr" && return + skip "must have user_xattr" && return 0 [ -z "$(which setfattr 2>/dev/null)" ] && - skip_env "could not find setfattr" && return + skip_env "could not find setfattr" && return 0 + [ -z "$(which getfattr 2>/dev/null)" ] && + skip_env "could not find getfattr" && return 0 - XBIG=trusted.big - XSIZE=1024 - touch $DIR/$tfile - VALUE=datadatadatadatadatadatadatadata - while [ $(echo $VALUE | wc -c) -lt $XSIZE ]; do - VALUE="$VALUE$VALUE" - done - log "save $XBIG on $DIR/$tfile" - setfattr -n $XBIG -v "$VALUE" $DIR/$tfile || - error "saving $XBIG on $DIR/$tfile failed" - ORIG=$(getfattr -n $XBIG $DIR/$tfile 2> /dev/null | grep $XBIG) - OSIZE=$(echo $ORIG | wc -c) - [ $OSIZE -lt $XSIZE ] && error "set $XBIG too small ($OSIZE < $XSIZE)" - - XSML=trusted.sml - log "save $XSML on $DIR/$tfile" - setfattr -n $XSML -v val $DIR/$tfile || - error "saving $XSML on $DIR/$tfile failed" - NEW=$(getfattr -n $XBIG $DIR/$tfile 2> /dev/null | grep $XBIG) - if [ "$NEW" != "$ORIG" ]; then - log "orig: $ORIG" - log "new: $NEW" - error "$XBIG different after saving $XSML" - fi + touch $file + + local value="$(generate_string $xsize)" + + local xbig=trusted.big + log "save $xbig on $file" + setfattr -n $xbig -v $value $file || + error "saving $xbig on $file failed" + + local orig=$(get_xattr_value $xbig $file) + [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig" + + local xsml=trusted.sml + log "save $xsml on $file" + setfattr -n $xsml -v val $file || error "saving $xsml on $file failed" + + local new=$(get_xattr_value $xbig $file) + [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml" + + log "grow $xsml on $file" + setfattr -n $xsml -v "$value" $file || + error "growing $xsml on $file failed" + + new=$(get_xattr_value $xbig $file) + [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml" + log "$xbig still valid after growing $xsml" - log "grow $XSML on $DIR/$tfile" - setfattr -n $XSML -v "$VALUE" $DIR/$tfile || - error "growing $XSML on $DIR/$tfile failed" - NEW=$(getfattr -n $XBIG $DIR/$tfile 2> /dev/null | grep $XBIG) - if [ "$NEW" != "$ORIG" ]; then - log "orig: $ORIG" - log "new: $NEW" - error "$XBIG different after growing $XSML" - fi - log "$XBIG still valid after growing $XSML" rm -f $file } + +test_102h() { # bug 15777 + grow_xattr 1024 +} run_test 102h "grow xattr from inside inode to external block" +test_102ha() { + large_xattr_enabled || { skip "large_xattr disabled" && return; } + grow_xattr $(max_xattr_size) +} +run_test 102ha "grow xattr from inside inode to external inode" + test_102i() { # bug 17038 touch $DIR/$tfile ln -s $DIR/$tfile $DIR/${tfile}link @@ -5086,10 +5162,13 @@ test_104a() { lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed" lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed" - OSC=`lctl get_param -n devices | awk '/-osc-/ {print $4}' | head -n 1` + OSC=`lctl dl |grep OST0000-osc-[^M] |awk '{print $4}'` lctl --device %$OSC deactivate lfs df || error "lfs df with deactivated OSC failed" - lctl --device %$OSC recover + lctl --device %$OSC activate + # wait the osc back to normal + wait_osc_import_state client ost FULL + lfs df || error "lfs df with reactivated OSC failed" rm -f $DIR/$tfile } @@ -5713,6 +5792,15 @@ test_118k() } run_test 118k "bio alloc -ENOMEM and IO TERM handling =========" +test_118l() +{ + # LU-646 + mkdir -p $DIR/$tdir + multiop $DIR/$tdir Dy || error "fsync dir failed" + rm -rf $DIR/$tdir +} +run_test 118l "fsync dir =========" + [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT test_119a() # bug 11737 @@ -6141,7 +6229,7 @@ test_124a() { done echo "" lctl set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF - local LRU_SIZE_A=`lctl get_param -n $NSDIR/lru_size` + local LRU_SIZE_A=`lctl get_param -n $NSDIR.lru_size` [ $LRU_SIZE_B -gt $LRU_SIZE_A ] || { error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A" @@ -6258,7 +6346,7 @@ test_126() { # bug 12829/13455 } run_test 126 "check that the fsgid provided by the client is taken into account" -test_127() { # bug 15521 +test_127a() { # bug 15521 $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed" $LCTL set_param osc.*.stats=0 FSIZE=$((2048 * 1024)) @@ -6294,7 +6382,47 @@ test_127() { # bug 15521 [ "$read_bytes" != 0 ] || error "no read done" [ "$write_bytes" != 0 ] || error "no write done" } -run_test 127 "verify the client stats are sane" +run_test 127a "verify the client stats are sane" + +test_127b() { # bug LU-333 + $LCTL set_param llite.*.stats=0 + FSIZE=65536 # sized fixed to match PAGE_SIZE for most clients + # perform 2 reads and writes so MAX is different from SUM. + dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1 + dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1 + cancel_lru_locks osc + dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1 + dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1 + + $LCTL get_param llite.*.stats | grep samples > $TMP/${tfile}.tmp + while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do + echo "got $COUNT $NAME" + eval $NAME=$COUNT || error "Wrong proc format" + + case $NAME in + read_bytes) + [ $COUNT -ne 2 ] && error "count is not 2: $COUNT" + [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN" + [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX" + [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM" + ;; + write_bytes) + [ $COUNT -ne 2 ] && error "count is not 2: $COUNT" + [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN" + [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX" + [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM" + ;; + *) ;; + esac + done < $TMP/${tfile}.tmp + + #check that we actually got some stats + [ "$read_bytes" ] || error "Missing read_bytes stats" + [ "$write_bytes" ] || error "Missing write_bytes stats" + [ "$read_bytes" != 0 ] || error "no read done" + [ "$write_bytes" != 0 ] || error "no write done" +} +run_test 127b "verify the llite client stats are sane" test_128() { # bug 15212 touch $DIR/$tfile @@ -6687,6 +6815,7 @@ som_mode_switch() { } test_132() { #1028, SOM + remote_mds_nodsh && skip "remote MDS with nodsh" && return local num=$(get_mds_dir $DIR) local mymds=mds${num} local MOUNTOPT_SAVE=$MOUNTOPT @@ -6725,6 +6854,216 @@ test_132() { #1028, SOM } run_test 132 "som avoids glimpse rpc" +check_stats() { + local res + local count + case $1 in + $SINGLEMDS) res=`do_facet $SINGLEMDS $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$2"` + ;; + ost) res=`do_facet ost1 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$2"` + ;; + *) error "Wrong argument $1" ;; + esac + echo $res + count=`echo $res | awk '{print $2}'` + [ -z "$res" ] && error "The counter for $2 on $1 was not incremented" + # if the argument $3 is zero, it means any stat increment is ok. + if [ $3 -gt 0 ] ; then + [ $count -ne $3 ] && error "The $2 counter on $1 is wrong - expected $3" + fi +} + +test_133a() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p $DIR/${tdir} + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost1 $LCTL set_param obdfilter.*.stats=clear + + # verify mdt stats first. + mkdir ${testdir} || error "mkdir failed" + check_stats $SINGLEMDS "mkdir" 1 + touch ${testdir}/${tfile} || "touch failed" + check_stats $SINGLEMDS "open" 1 + check_stats $SINGLEMDS "close" 1 + mknod ${testdir}/${tfile}-pipe p || "mknod failed" + check_stats $SINGLEMDS "mknod" 1 + rm -f ${testdir}/${tfile}-pipe || "pipe remove failed" + check_stats $SINGLEMDS "unlink" 1 + rm -f ${testdir}/${tfile} || error "file remove failed" + check_stats $SINGLEMDS "unlink" 2 + + # remove working dir and check mdt stats again. + rmdir ${testdir} || error "rmdir failed" + check_stats $SINGLEMDS "rmdir" 1 + + local testdir1=$DIR/${tdir}/stats_testdir1 + mkdir -p ${testdir} + mkdir -p ${testdir1} + touch ${testdir1}/test1 + mv ${testdir1}/test1 ${testdir} || error "file crossdir rename" + check_stats $SINGLEMDS "crossdir_rename" 1 + + mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename" + check_stats $SINGLEMDS "samedir_rename" 1 + + rm -rf $DIR/${tdir} +} +run_test 133a "Verifying MDT stats ========================================" + +test_133b() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p ${testdir} || error "mkdir failed" + touch ${testdir}/${tfile} || "touch failed" + cancel_lru_locks mdc + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost1 $LCTL set_param obdfilter.*.stats=clear + + # extra mdt stats verification. + chmod 444 ${testdir}/${tfile} || error "chmod failed" + check_stats $SINGLEMDS "setattr" 1 + $LFS df || error "lfs failed" + check_stats $SINGLEMDS "statfs" 1 + + rm -rf $DIR/${tdir} +} +run_test 133b "Verifying extra MDT stats ==================================" + +test_133c() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p ${testdir} || error "mkdir failed" + + # verify obdfilter stats. + $LFS setstripe -c 1 -o 0 ${testdir}/${tfile} + sync + cancel_lru_locks osc + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost1 $LCTL set_param obdfilter.*.stats=clear + + dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=512k count=1 || error "dd failed" + sync + cancel_lru_locks osc + check_stats ost "write" 1 + + dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed" + check_stats ost "read" 1 + + > ${testdir}/${tfile} || error "truncate failed" + check_stats ost "punch" 1 + + rm -f ${testdir}/${tfile} || error "file remove failed" + check_stats ost "destroy" 1 + + rm -rf $DIR/${tdir} +} +run_test 133c "Verifying OST stats ========================================" + +order_2() { + local value=$1 + local orig=$value + local order=1 + + while [ $value -ge 2 ]; do + order=$((order*2)) + value=$((value/2)) + done + + if [ $orig -gt $order ]; then + order=$((order*2)) + fi + echo $order +} + +size_in_KMGT() { + local value=$1 + local size=('K' 'M' 'G' 'T'); + local i=0 + local size_string=$value + + while [ $value -ge 1024 ]; do + if [ $i -gt 3 ]; then + #T is the biggest unit we get here, if that is bigger, + #just return XXXT + size_string=${value}T + break + fi + value=$((value >> 10)) + if [ $value -lt 1024 ]; then + size_string=${value}${size[$i]} + break + fi + i=$((i + 1)) + done + + echo $size_string +} + +get_rename_size() { + local size=$1 + local sample=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \ + awk '/ '${size}'/ {print $4}' | sed -e "s/,//g") + echo $sample +} + +test_133d() { + remote_ost_nodsh && skip "remote OST with nodsh" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return + local testdir1=$DIR/${tdir}/stats_testdir1 + local testdir2=$DIR/${tdir}/stats_testdir2 + + do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear + + mkdir -p ${testdir1} || error "mkdir failed" + mkdir -p ${testdir2} || error "mkdir failed" + + createmany -o $testdir1/test 512 || error "createmany failed" + local testdir1_size=$(ls -l $DIR/${tdir} | \ + awk '/stats_testdir1/ {print $5}') + local testdir2_size=$(ls -l $DIR/${tdir} | \ + awk '/stats_testdir2/ {print $5}') + + testdir1_size=$(order_2 $testdir1_size) + testdir2_size=$(order_2 $testdir2_size) + + testdir1_size=$(size_in_KMGT $testdir1_size) + testdir2_size=$(size_in_KMGT $testdir2_size) + + # check samedir rename size + mv ${testdir1}/test0 ${testdir1}/test_0 + local samedir=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \ + grep 'same_dir') + local same_sample=$(get_rename_size $testdir1_size) + [ -z "$samedir" ] && error "samedir_rename_size count error" + [ $same_sample -eq 1 ] || error "samedir_rename_size count error" + echo "Check same dir rename stats success" + + # check crossdir rename size + do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear + mv ${testdir1}/test_0 ${testdir2}/test_0 + local crossdir=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \ + grep 'crossdir') + local src_sample=$(get_rename_size $testdir1_size) + local tgt_sample=$(get_rename_size $testdir2_size) + [ -z "$crossdir" ] && error "crossdir_rename_size count error" + [ $src_sample -eq 1 ] || error "crossdir_rename_size count error" + [ $tgt_sample -eq 1 ] || error "crossdir_rename_size count error" + echo "Check cross dir rename stats success" + + rm -rf $DIR/${tdir} +} +run_test 133d "Verifying rename_stats ========================================" + test_140() { #bug-17379 mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir" cd $DIR/$tdir || error "Changing to $DIR/$tdir" @@ -6924,6 +7263,7 @@ test_155_small_load() { } test_155_big_load() { + remote_ost_nodsh && skip "remote OST with nodsh" && return local temp=$TMP/$tfile local file=$DIR/$tfile @@ -7154,10 +7494,24 @@ err17935 () { error $* fi } + +changelog_chmask() +{ + MASK=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_mask |\ + grep -c $1) + + if [ $MASK -eq 1 ]; then + do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="-$1" + else + do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="+$1" + fi +} + test_160() { - USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n) + remote_mds_nodsh && skip "remote MDS with nodsh" && return + USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n) echo "Registered as changelog user $USER" - do_facet $SINGLEMDS lctl get_param -n mdd.$MDT0.changelog_users | \ + do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \ grep -q $USER || error "User $USER not found in changelog_users" # change something @@ -7172,12 +7526,23 @@ test_160() { $LFS changelog $MDT0 | tail -5 echo "verifying changelog mask" - do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="-mkdir" - mkdir -p $DIR/$tdir/pics/2009/sofia - do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="+mkdir" - mkdir $DIR/$tdir/pics/2009/zachary - DIRS=$($LFS changelog $MDT0 | tail -5 | grep -c MKDIR) - [ $DIRS -eq 1 ] || err17935 "changelog mask count $DIRS != 1" + changelog_chmask "MKDIR" + changelog_chmask "CLOSE" + + mkdir -p $DIR/$tdir/pics/zach/sofia + echo "zzzzzz" > $DIR/$tdir/pics/zach/file + + changelog_chmask "MKDIR" + changelog_chmask "CLOSE" + + mkdir -p $DIR/$tdir/pics/2008/sofia + echo "zzzzzz" > $DIR/$tdir/pics/zach/file + + $LFS changelog $MDT0 + MKDIRS=$($LFS changelog $MDT0 | tail -5 | grep -c "MKDIR") + CLOSES=$($LFS changelog $MDT0 | tail -5 | grep -c "CLOSE") + [ $MKDIRS -eq 1 ] || err17935 "MKDIR changelog mask count $DIRS != 1" + [ $CLOSES -eq 1 ] || err17935 "CLOSE changelog mask count $DIRS != 1" # verify contents echo "verifying target fid" @@ -7193,16 +7558,16 @@ test_160() { [ "$fidc" == "p=$fidf" ] || \ err17935 "pfid in changelog $fidc != dir fid $fidf" - USER_REC1=$(do_facet $SINGLEMDS lctl get_param -n \ + USER_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \ mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}') $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5)) - USER_REC2=$(do_facet $SINGLEMDS lctl get_param -n \ + USER_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \ mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}') echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2" [ $USER_REC2 == $(($USER_REC1 + 5)) ] || \ err17935 "user index should be $(($USER_REC1 + 5)); is $USER_REC2" - MIN_REC=$(do_facet $SINGLEMDS lctl get_param mdd.$MDT0.changelog_users | \ + MIN_REC=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_users | \ awk 'min == "" || $2 < min {min = $2}; END {print min}') FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}') echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC" @@ -7210,17 +7575,17 @@ test_160() { err17935 "first index should be $(($MIN_REC + 1)); is $FIRST_REC" echo "verifying user deregister" - do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $USER - do_facet $SINGLEMDS lctl get_param -n mdd.$MDT0.changelog_users | \ + do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER + do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \ grep -q $USER && error "User $USER still found in changelog_users" - USERS=$(( $(do_facet $SINGLEMDS lctl get_param -n \ + USERS=$(( $(do_facet $SINGLEMDS $LCTL get_param -n \ mdd.$MDT0.changelog_users | wc -l) - 2 )) if [ $USERS -eq 0 ]; then - LAST_REC1=$(do_facet $SINGLEMDS lctl get_param -n \ + LAST_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \ mdd.$MDT0.changelog_users | head -1 | awk '{print $3}') touch $DIR/$tdir/chloe - LAST_REC2=$(do_facet $SINGLEMDS lctl get_param -n \ + LAST_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \ mdd.$MDT0.changelog_users | head -1 | awk '{print $3}') echo "verify changelogs are off if we were the only user: $LAST_REC1 == $LAST_REC2" [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off" @@ -7480,6 +7845,7 @@ obdecho_create_test() { } test_180a() { + remote_ost_nodsh && skip "remote OST with nodsh" && return local rc=0 local rmmod_local=0 @@ -7489,8 +7855,10 @@ test_180a() { fi local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}') - local host=$(awk '/current_connection:/ {print $2}' /proc/fs/lustre/osc/$osc/import) - local target=$(awk '/target:/ {print $2}' /proc/fs/lustre/osc/$osc/import) + local host=$(lctl get_param -n osc.$osc.import | + awk '/current_connection:/ {print $2}' ) + local target=$(lctl get_param -n osc.$osc.import | + awk '/target:/ {print $2}' ) target=${target%_UUID} [[ -n $target ]] && { setup_obdecho_osc $host $target || rc=1; } || rc=1 @@ -7502,15 +7870,16 @@ test_180a() { run_test 180a "test obdecho on osc" test_180b() { + remote_ost_nodsh && skip "remote OST with nodsh" && return local rc=0 local rmmod_remote=0 - do_facet ost "lsmod | grep -q obdecho || " \ - "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \ - "modprobe obdecho; }" && rmmod_remote=1 - target=$(do_facet ost $LCTL dl | awk '/obdfilter/ {print $4;exit}') - [[ -n $target ]] && { obdecho_create_test $target ost || rc=1; } - [ $rmmod_remote -eq 1 ] && do_facet ost "rmmod obdecho" + do_facet ost1 "lsmod | grep -q obdecho || " \ + "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \ + "modprobe obdecho; }" && rmmod_remote=1 + target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4;exit}') + [[ -n $target ]] && { obdecho_create_test $target ost1 || rc=1; } + [ $rmmod_remote -eq 1 ] && do_facet ost1 "rmmod obdecho" return $rc } run_test 180b "test obdecho directly on obdfilter" @@ -8012,6 +8381,7 @@ test_215() { # for bugs 18102, 21079, 21517 run_test 215 "/proc/sys/lnet exists and has proper content - bugs 18102, 21079, 21517" test_216() { # bug 20317 + remote_ost_nodsh && skip "remote OST with nodsh" && return local node local p="$TMP/sanityN-$TESTNAME.parameters" save_lustre_params $HOSTNAME "osc.*.contention_seconds" > $p @@ -8049,12 +8419,15 @@ run_test 216 "check lockless direct write works and updates file size and kms co test_217() { # bug 22430 local node + local nid + for node in $(nodes_list); do - if [[ $node = *-* ]] ; then - echo "lctl ping $node@$NETTYPE" - lctl ping $node@$NETTYPE + nid=$(host_nids_address $node $NETTYPE) + if [[ $nid = *-* ]] ; then + echo "lctl ping $nid@$NETTYPE" + lctl ping $nid@$NETTYPE else - echo "skipping $node (no hiphen detected)" + echo "skipping $node (no hyphen detected)" fi done } @@ -8092,6 +8465,115 @@ test_219() { } run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND" +test_220() { #LU-325 + remote_ost_nodsh && skip "remote OST with nodsh" && return + local OSTIDX=0 + + mkdir -p $DIR/$tdir + local OST=$(lfs osts | grep ${OSTIDX}": " | \ + awk '{print $2}' | sed -e 's/_UUID$//') + + # on the mdt's osc + local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST) + local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_last_id) + local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_next_id) + + $LFS df -i + + do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1 + #define OBD_FAIL_OST_ENOINO 0x229 + do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229 + do_facet mgs $LCTL pool_new $FSNAME.$TESTNAME || return 1 + do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2 + + $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME + + MDSOBJS=$((last_id - next_id)) + echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)" + + blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }') + echo "OST still has $count kbytes free" + + echo "create $MDSOBJS files @next_id..." + createmany -o $DIR/$tdir/f $MDSOBJS || return 3 + + local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_last_id) + local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_next_id) + + echo "after creation, last_id=$last_id2, next_id=$next_id2" + $LFS df -i + + echo "cleanup..." + + do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0 + do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0 + + do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4 + do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5 + echo "unlink $MDSOBJS files @$next_id..." + unlinkmany $DIR/$tdir/f $MDSOBJS || return 6 +} +run_test 220 "preallocated MDS objects still used if ENOSPC from OST" + +test_221() { + cp `which date` $MOUNT + + #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401 + $LCTL set_param fail_loc=0x80001401 + + $MOUNT/date > /dev/null + rm -f $MOUNT/date +} +run_test 221 "make sure fault and truncate race to not cause OOM" + +test_222a () { + rm -rf $DIR/$tdir + mkdir -p $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir + createmany -o $DIR/$tdir/$tfile 10 + cancel_lru_locks mdc + cancel_lru_locks osc + #define OBD_FAIL_LDLM_AGL_DELAY 0x31a + $LCTL set_param fail_loc=0x31a + ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed" + $LCTL set_param fail_loc=0 + rm -r $DIR/$tdir +} +run_test 222a "AGL for ls should not trigger CLIO lock failure ================" + +test_222b () { + rm -rf $DIR/$tdir + mkdir -p $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir + createmany -o $DIR/$tdir/$tfile 10 + cancel_lru_locks mdc + cancel_lru_locks osc + #define OBD_FAIL_LDLM_AGL_DELAY 0x31a + $LCTL set_param fail_loc=0x31a + rm -r $DIR/$tdir || "AGL for rmdir failed" + $LCTL set_param fail_loc=0 +} +run_test 222b "AGL for rmdir should not trigger CLIO lock failure =============" + +test_223 () { + rm -rf $DIR/$tdir + mkdir -p $DIR/$tdir + $LFS setstripe -c 1 -i 0 $DIR/$tdir + createmany -o $DIR/$tdir/$tfile 10 + cancel_lru_locks mdc + cancel_lru_locks osc + #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b + $LCTL set_param fail_loc=0x31b + ls -l $DIR/$tdir > /dev/null || error "reenqueue failed" + $LCTL set_param fail_loc=0 + rm -r $DIR/$tdir +} +run_test 223 "osc reenqueue if without AGL lock granted =======================" + # # tests that do cleanup/setup should be run at the end #