X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=6aadd4f7da555f1337eb1b992ca629f307519852;hb=e99b9dfa326292514eae0dbf4a96b3fb3855dceb;hp=4ad3f1435f89cb7b91a25d499761565092de6b74;hpb=b924164398e939986e20506ab5d004e64f0b004e;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 4ad3f14..6aadd4f 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -8,7 +8,7 @@ set -e ONLY=${ONLY:-"$*"} # bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 10764 16260 -ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68 75 119d $SANITY_EXCEPT" +ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b 75 119d $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"} # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! @@ -46,7 +46,6 @@ MCREATE=${MCREATE:-mcreate} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} READS=${READS:-"reads"} -TOEXCL=${TOEXCL:-toexcl} TRUNCATE=${TRUNCATE:-truncate} MUNLINK=${MUNLINK:-munlink} SOCKETSERVER=${SOCKETSERVER:-socketserver} @@ -126,7 +125,7 @@ rm -rf $DIR/[Rdfs][0-9]* # $RUNAS_ID may get set incorrectly somewhere else [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!" -check_runas_id $RUNAS_ID $RUNAS +check_runas_id $RUNAS_ID $RUNAS_ID $RUNAS build_test_filter @@ -541,9 +540,12 @@ test_22() { run_test 22 "unpack tar archive as non-root user ===============" test_23() { - mkdir $DIR/d23 - $TOEXCL $DIR/d23/f23 - $TOEXCL -e $DIR/d23/f23 || error + mkdir -p $DIR/$tdir + local file=$DIR/$tdir/$tfile + + openfile -f O_CREAT:O_EXCL $file || error "$file create failed" + openfile -f O_CREAT:O_EXCL $file && + error "$file recreate succeeded" || true } run_test 23 "O_CREAT|O_EXCL in subdir ==========================" @@ -937,21 +939,28 @@ reset_enospc() { } exhaust_precreations() { - OSTIDX=$1 + local OSTIDX=$1 + local MDSIDX=$(get_mds_dir "$DIR/d27") + echo OSTIDX=$OSTIDX MDSIDX=$MDSIDX + + local OST=$(lfs osts | grep ${OSTIDX}": " | awk '{print $2}' | sed -e 's/_UUID$//') + local MDT_INDEX=$(lfs df | grep "\[MDT:$((MDSIDX - 1))\]" | awk '{print $1}' | \ + sed -e 's/_UUID$//;s/^.*-//') - OST=$(lfs osts | grep ${OSTIDX}": " | \ - awk '{print $2}' | sed -e 's/_UUID$//') # on the mdt's osc - last_id=$(do_facet $SINGLEMDS lctl get_param -n osc.*${OST}-osc-MDT0000.prealloc_last_id) - next_id=$(do_facet $SINGLEMDS lctl get_param -n osc.*${OST}-osc-MDT0000.prealloc_next_id) + local last_id=$(do_facet mds${MDSIDX} lctl get_param -n osc.*${OST}-osc-${MDT_INDEX}.prealloc_last_id) + local next_id=$(do_facet mds${MDSIDX} lctl get_param -n osc.*${OST}-osc-${MDT_INDEX}.prealloc_next_id) - mkdir -p $DIR/d27/${OST} - $SETSTRIPE $DIR/d27/${OST} -i $OSTIDX -c 1 + echo ${OST}-osc-${MDT_INDEX}.prealloc_last_id=$last_id + echo ${OST}-osc-${MDT_INDEX}.prealloc_next_id=$next_id + + mkdir -p $DIR/d27 + $SETSTRIPE $DIR/d27 -i $OSTIDX -c 1 #define OBD_FAIL_OST_ENOSPC 0x215 do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x215 echo "Creating to objid $last_id on ost $OST..." - createmany -o $DIR/d27/${OST}/f $next_id $((last_id - next_id + 2)) - do_facet $SINGLEMDS lctl get_param -n osc.*${OST}-osc-MDT0000.prealloc* | grep '[0-9]' + createmany -o $DIR/d27/${OST}-f $next_id $((last_id - next_id + 2)) + do_facet mds${MDSIDX} lctl get_param osc.*${OST}-osc-${MDT_INDEX}.prealloc* | grep '[0-9]' reset_enospc $2 } @@ -1072,9 +1081,8 @@ test_27u() { # bug 4900 [ "$OSTCOUNT" -lt "2" ] && skip "too few OSTs" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - #define OBD_FAIL_MDS_OSC_PRECREATE 0x13d - - do_facet $SINGLEMDS lctl set_param fail_loc=0x13d +#define OBD_FAIL_MDS_OSC_PRECREATE 0x139 + do_facet $SINGLEMDS lctl set_param fail_loc=0x139 mkdir -p $DIR/d27u createmany -o $DIR/d27u/t- 1000 do_facet $SINGLEMDS lctl set_param fail_loc=0 @@ -1134,7 +1142,9 @@ test_27w() { # bug 10997 } run_test 27w "check lfs setstripe -c -s -i options =============" -test_28() { +# createtest also checks that device nodes are created and +# then visible correctly (#2091) +test_28() { # bug 2091 mkdir $DIR/d28 $CREATETEST $DIR/d28/ct || error } @@ -1733,9 +1743,15 @@ test_37() { run_test 37 "ls a mounted file system to check old content =====" test_38() { - o_directory $DIR/$tfile + local file=$DIR/$tfile + touch $file + openfile -f O_DIRECTORY $file + local RC=$? + local ENOTDIR=20 + [ $RC -eq 0 ] && error "opened file $file with O_DIRECTORY" || true + [ $RC -eq $ENOTDIR ] || error "error $RC should be ENOTDIR ($ENOTDIR)" } -run_test 38 "open a regular file with O_DIRECTORY ==============" +run_test 38 "open a regular file with O_DIRECTORY should return -ENOTDIR ===" test_39() { touch $DIR/$tfile @@ -2062,11 +2078,7 @@ test_46() { } run_test 46 "dirtying a previously written page ================" -# Check that device nodes are created and then visible correctly (#2091) -test_47() { - cmknod $DIR/test_47_node || error -} -run_test 47 "Device nodes check ================================" +# test_47 is removed "Device nodes check" is moved to test_28 test_48a() { # bug 2399 check_kernel_version 34 || return 0 @@ -2650,11 +2662,11 @@ test_56o() { setup_56 $NUMFILES $NUMDIRS TDIR=$DIR/${tdir}g - utime $TDIR/file1 > /dev/null || error - utime $TDIR/file2 > /dev/null || error - utime $TDIR/dir1 > /dev/null || error - utime $TDIR/dir2 > /dev/null || error - utime $TDIR/dir1/file1 > /dev/null || error + 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)" EXPECTED=5 NUMS=`$LFIND -mtime +1 $TDIR | wc -l` @@ -2717,7 +2729,7 @@ test_57a() { DEV=$(do_facet $SINGLEMDS lctl get_param -n $MNTDEV) [ -z "$DEV" ] && error "can't access $MNTDEV" for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do - do_facet $SINGLEMDS dumpe2fs -h $DEV > $TMP/t57a.dump || error "can't access $DEV" + do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump || error "can't access $DEV" DEVISIZE=`awk '/Inode size:/ { print $3 }' $TMP/t57a.dump` [ "$DEVISIZE" -gt 128 ] || error "inode size $DEVISIZE" rm $TMP/t57a.dump @@ -2726,42 +2738,53 @@ test_57a() { run_test 57a "verify MDS filesystem created with large inodes ==" test_57b() { - FILECOUNT=100 - FILE1=$DIR/d57b/f1 - FILEN=$DIR/d57b/f$FILECOUNT - rm -rf $DIR/d57b || error "removing $DIR/d57b" - mkdir -p $DIR/d57b || error "creating $DIR/d57b" + local dir=$DIR/d57b + + local FILECOUNT=100 + local FILE1=$dir/f1 + local FILEN=$dir/f$FILECOUNT + + rm -rf $dir || error "removing $dir" + mkdir -p $dir || error "creating $dir" + local num=$(get_mds_dir $dir) + local mymds=mds$num + echo "mcreating $FILECOUNT files" - createmany -m $DIR/d57b/f 1 $FILECOUNT || \ - error "creating files in $DIR/d57b" + createmany -m $dir/f 1 $FILECOUNT || \ + error "creating files in $dir" # verify that files do not have EAs yet $GETSTRIPE $FILE1 2>&1 | grep -q "no stripe" || error "$FILE1 has an EA" $GETSTRIPE $FILEN 2>&1 | grep -q "no stripe" || error "$FILEN has an EA" - MDSFREE="`lctl get_param -n osd.*MDT0000.kbytesfree 2> /dev/null`" - MDCFREE="`lctl get_param -n mdc.*.kbytesfree | head -n 1`" + sync + sleep 1 + df $dir #make sure we get new statfs data + local MDSFREE=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree) + local MDCFREE=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) echo "opening files to create objects/EAs" - for FILE in `seq -f $DIR/d57b/f%g 1 $FILECOUNT`; do - $OPENFILE -f O_RDWR $FILE > /dev/null || error "opening $FILE" + local FILE + for FILE in `seq -f $dir/f%g 1 $FILECOUNT`; do + $OPENFILE -f O_RDWR $FILE > /dev/null 2>&1 || error "opening $FILE" done # verify that files have EAs now $GETSTRIPE $FILE1 | grep -q "obdidx" || error "$FILE1 missing EA" $GETSTRIPE $FILEN | grep -q "obdidx" || error "$FILEN missing EA" - sleep 1 # make sure we get new statfs data -# MDSFREE2="`lctl get_param -n mds.*.kbytesfree`" -# MDCFREE2="`lctl get_param -n mdc.*.kbytesfree`" -# if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then -# if [ "$MDSFREE" != "$MDSFREE2" ]; then -# error "MDC before $MDCFREE != after $MDCFREE2" -# else -# echo "MDC before $MDCFREE != after $MDCFREE2" -# echo "unable to confirm if MDS has large inodes" -# fi -# fi - rm -rf $DIR/d57b + sleep 1 #make sure we get new statfs data + df $dir + local MDSFREE2=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree) + local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) + if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then + if [ "$MDSFREE" != "$MDSFREE2" ]; then + error "MDC before $MDCFREE != after $MDCFREE2" + else + echo "MDC before $MDCFREE != after $MDCFREE2" + echo "unable to confirm if MDS has large inodes" + fi + fi + rm -rf $dir } run_test 57b "default LOV EAs are stored inside large inodes ===" @@ -2811,8 +2834,8 @@ run_test 60b "limit repeated messages from CERROR/CWARN ========" test_60c() { echo "create 5000 files" createmany -o $DIR/f60c- 5000 -#define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x13c - lctl set_param fail_loc=0x8000013c +#define OBD_FAIL_MDS_LLOG_CREATE_FAILED 0x137 + lctl set_param fail_loc=0x80000137 unlinkmany $DIR/f60c- 5000 lctl set_param fail_loc=0 } @@ -3069,12 +3092,15 @@ LLOOP= cleanup_68() { trap 0 if [ ! -z "$LLOOP" ]; then - swapoff $LLOOP || error "swapoff failed" + if swapon -s | grep -q $LLOOP; then + swapoff $LLOOP || error "swapoff failed" + fi + $LCTL blockdev_detach $LLOOP || error "detach failed" rm -f $LLOOP unset LLOOP fi - rm -f $DIR/f68 + rm -f $DIR/f68* } meminfo() { @@ -3085,10 +3111,29 @@ swap_used() { swapon -s | awk '($1 == "'$1'") { print $4 }' } +# test case for lloop driver, basic function +test_68a() { + [ "$UID" != 0 ] && skip "must run as root" && return + + grep -q llite_lloop /proc/modules + [ $? -ne 0 ] && skip "can't find module llite_lloop" && return + + LLOOP=$TMP/lloop.`date +%s`.`date +%N` + dd if=/dev/zero of=$DIR/f68a bs=4k count=1024 + $LCTL blockdev_attach $DIR/f68a $LLOOP || error "attach failed" + + trap cleanup_68 EXIT + + directio rdwr $LLOOP 0 1024 4096 || error "direct write failed" + directio rdwr $LLOOP 0 1025 4096 && error "direct write should fail" + + cleanup_68 +} +run_test 68a "lloop driver - basic test ========================" # excercise swapping to lustre by adding a high priority swapfile entry # and then consuming memory until it is used. -test_68() { +test_68b() { # was test_68 [ "$UID" != 0 ] && skip "must run as root" && return lctl get_param -n devices | grep -q obdfilter && \ skip "local OST" && return @@ -3104,10 +3149,10 @@ test_68() { [[ $NR_BLOCKS -le 2048 ]] && NR_BLOCKS=2048 LLOOP=$TMP/lloop.`date +%s`.`date +%N` - dd if=/dev/zero of=$DIR/f68 bs=64k seek=$NR_BLOCKS count=1 - mkswap $DIR/f68 + dd if=/dev/zero of=$DIR/f68b bs=64k seek=$NR_BLOCKS count=1 + mkswap $DIR/f68b - $LCTL blockdev_attach $DIR/f68 $LLOOP || error "attach failed" + $LCTL blockdev_attach $DIR/f68b $LLOOP || error "attach failed" trap cleanup_68 EXIT @@ -3122,7 +3167,7 @@ test_68() { [ $SWAPUSED -eq 0 ] && echo "no swap used???" || true } -run_test 68 "support swapping to Lustre ========================" +run_test 68b "support swapping to Lustre ========================" # bug5265, obdfilter oa2dentry return -ENOENT # #define OBD_FAIL_OST_ENOENT 0x217 @@ -3153,7 +3198,8 @@ test_69() { run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======" test_71() { - sh rundbench -C -D $DIR 2 || error "dbench failed!" + mkdir -p $DIR/$tdir + sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!" } run_test 71 "Running dbench on lustre (don't segment fault) ====" @@ -3162,7 +3208,7 @@ test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly [ "$RUNAS_ID" = "$UID" ] && skip "RUNAS_ID = UID = $UID -- skipping" && return # Check that testing environment is properly set up. Skip if not - FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS || { + FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || { skip "User $RUNAS_ID does not exist - skipping" return 0 } @@ -3403,6 +3449,7 @@ setup_f77() { } test_77a() { # bug 10889 + $GSS && skip "could not run with gss" && return [ ! -f $F77_TMP ] && setup_f77 set_checksums 1 dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error" @@ -3412,6 +3459,7 @@ test_77a() { # bug 10889 run_test 77a "normal checksum read/write operation =============" test_77b() { # bug 10889 + $GSS && skip "could not run with gss" && return [ ! -f $F77_TMP ] && setup_f77 #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409 lctl set_param fail_loc=0x80000409 @@ -3425,6 +3473,7 @@ test_77b() { # bug 10889 run_test 77b "checksum error on client write ====================" test_77c() { # bug 10889 + $GSS && skip "could not run with gss" && return [ ! -f $DIR/f77b ] && skip "requires 77b - skipping" && return set_checksums 1 for algo in $CKSUM_TYPES; do @@ -3441,6 +3490,7 @@ test_77c() { # bug 10889 run_test 77c "checksum error on client read ===================" test_77d() { # bug 10889 + $GSS && skip "could not run with gss" && return #define OBD_FAIL_OSC_CHECKSUM_SEND 0x409 lctl set_param fail_loc=0x80000409 set_checksums 1 @@ -3452,6 +3502,7 @@ test_77d() { # bug 10889 run_test 77d "checksum error on OST direct write ===============" test_77e() { # bug 10889 + $GSS && skip "could not run with gss" && return [ ! -f $DIR/f77 ] && skip "requires 77d - skipping" && return #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408 lctl set_param fail_loc=0x80000408 @@ -3465,6 +3516,7 @@ test_77e() { # bug 10889 run_test 77e "checksum error on OST direct read ================" test_77f() { # bug 10889 + $GSS && skip "could not run with gss" && return set_checksums 1 for algo in $CKSUM_TYPES; do cancel_lru_locks osc @@ -3481,6 +3533,7 @@ test_77f() { # bug 10889 run_test 77f "repeat checksum error on write (expect error) ====" test_77g() { # bug 10889 + $GSS && skip "could not run with gss" && return remote_ost_nodsh && skip "remote OST with nodsh" && return [ ! -f $F77_TMP ] && setup_f77 @@ -3497,6 +3550,7 @@ test_77g() { # bug 10889 run_test 77g "checksum error on OST write ======================" test_77h() { # bug 10889 + $GSS && skip "could not run with gss" && return remote_ost_nodsh && skip "remote OST with nodsh" && return [ ! -f $DIR/f77g ] && skip "requires 77g - skipping" && return @@ -3511,6 +3565,7 @@ test_77h() { # bug 10889 run_test 77h "checksum error on OST read =======================" test_77i() { # bug 13805 + $GSS && skip "could not run with gss" && return #define OBD_FAIL_OSC_CONNECT_CKSUM 0x40b lctl set_param fail_loc=0x40b remount_client $MOUNT @@ -3525,6 +3580,7 @@ test_77i() { # bug 13805 run_test 77i "client not supporting OSD_CONNECT_CKSUM ==========" test_77j() { # bug 13805 + $GSS && skip "could not run with gss" && return #define OBD_FAIL_OSC_CKSUM_ADLER_ONLY 0x40c lctl set_param fail_loc=0x40c remount_client $MOUNT @@ -3616,10 +3672,10 @@ run_test 79 "df report consistency check =======================" test_80() { # bug 10718 dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M sync; sleep 1; sync - BEFORE=`date +%s` + local BEFORE=`date +%s` cancel_lru_locks osc - AFTER=`date +%s` - DIFF=$((AFTER-BEFORE)) + local AFTER=`date +%s` + local DIFF=$((AFTER-BEFORE)) if [ $DIFF -gt 1 ] ; then error "elapsed for 1M@1T = $DIFF" fi @@ -3628,21 +3684,16 @@ test_80() { # bug 10718 } run_test 80 "Page eviction is equally fast at high offsets too ====" -# on the LLNL clusters, runas will still pick up root's $TMP settings, -# which will not be writable for the runas user, and then you get a CVS -# error message with a corrupt path string (CVS bug) and panic. -# We're not using much space, so just stick it in /tmp, which is safe. -OLDTMPDIR=$TMPDIR -OLDTMP=$TMP -TMPDIR=/tmp -TMP=/tmp -OLDHOME=$HOME -[ $RUNAS_ID -ne $UID ] && HOME=/tmp - test_99a() { + [ -z "$(which cvs 2>/dev/null)" ] && skip "could not find cvs" && \ + return mkdir -p $DIR/d99cvsroot chown $RUNAS_ID $DIR/d99cvsroot + local oldPWD=$PWD # bug 13584, use $TMP as working dir + cd $TMP + $RUNAS cvs -d $DIR/d99cvsroot init || error + cd $oldPWD } run_test 99a "cvs init =========================================" @@ -3798,7 +3849,7 @@ cleanup_test101() { [ "$SETUP_TEST101" = "yes" ] || return trap 0 rm -rf $DIR/$tdir - rm -f $DIR/$tfile + rm -f $DIR/$tfile SETUP_TEST101=no } @@ -3856,37 +3907,38 @@ export SETUP_TEST102=no setup_test102() { [ "$SETUP_TEST102" = "yes" ] && return mkdir -p $DIR/$tdir + chown $RUNAS_ID $DIR/$tdir STRIPE_SIZE=65536 - STRIPE_COUNT=4 - STRIPE_OFFSET=2 + STRIPE_OFFSET=1 + STRIPE_COUNT=$OSTCOUNT + [ $OSTCOUNT -gt 4 ] && STRIPE_COUNT=4 trap cleanup_test102 EXIT cd $DIR - $SETSTRIPE $tdir -s $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT + $1 $SETSTRIPE $tdir -s $STRIPE_SIZE -i $STRIPE_OFFSET -c $STRIPE_COUNT cd $DIR/$tdir for num in 1 2 3 4 do - for count in 1 2 3 4 + for count in `seq 1 $STRIPE_COUNT` do - for offset in 0 1 2 3 + for offset in `seq 0 $[$STRIPE_COUNT - 1]` do local stripe_size=`expr $STRIPE_SIZE \* $num` local file=file"$num-$offset-$count" - $SETSTRIPE $file -s $stripe_size -i $offset -c $count + $1 $SETSTRIPE $file -s $stripe_size -i $offset -c $count done done done cd $DIR - star -c f=$TMP/f102.tar $tdir + $1 $TAR cf $TMP/f102.tar $tdir --xattrs SETUP_TEST102=yes } cleanup_test102() { - [ "$SETUP_TEST102" = "yes" ] || return trap 0 + [ "$SETUP_TEST102" = "yes" ] || return 0 rm -f $TMP/f102.tar - rm -rf $DIR/$tdir SETUP_TEST102=no } @@ -3993,21 +4045,21 @@ run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ===========" compare_stripe_info1() { for num in 1 2 3 4 do - for count in 1 2 3 4 + for count in `seq 1 $STRIPE_COUNT` do - for offset in 0 1 2 3 + for offset in `seq 0 $[$STRIPE_COUNT - 1]` do local size=`expr $STRIPE_SIZE \* $num` local file=file"$num-$offset-$count" - get_stripe_info client $file + get_stripe_info client $PWD/$file "$1" if [ $stripe_size -ne $size ]; then - error "$file: different stripe size" && return + error "$file: different stripe size $stripe_size, expected $size" && return fi if [ $stripe_count -ne $count ]; then - error "$file: different stripe count" && return + error "$file: different stripe count $stripe_count, expected $count" && return fi if [ $stripe_index -ne 0 ]; then - error "$file: different stripe offset" && return + error "$file: different stripe offset $stripe_index, expected 0" && return fi done done @@ -4017,85 +4069,57 @@ compare_stripe_info1() { compare_stripe_info2() { for num in 1 2 3 4 do - for count in 1 2 3 4 + for count in `seq 1 $STRIPE_COUNT` do - for offset in 0 1 2 3 + for offset in `seq 0 $[$STRIPE_COUNT - 1]` do local size=`expr $STRIPE_SIZE \* $num` local file=file"$num-$offset-$count" - get_stripe_info client $file + get_stripe_info client $PWD/$file if [ $stripe_size -ne $size ]; then - error "$file: different stripe size" && return + error "$file: different stripe size $stripe_size, expected $size" && return fi if [ $stripe_count -ne $count ]; then - error "$file: different stripe count" && return + error "$file: different stripe count $stripe_count, expected $count" && return fi if [ $stripe_index -ne $offset ]; then - error "$file: different stripe offset" && return + error "$file: different stripe offset $stripe_index, expected $offset" && return fi done done done } +find_lustre_tar() { + [ -n "$(which tar 2>/dev/null)" ] && strings $(which tar) | grep -q lustre && echo tar +} + test_102d() { - # b10930: star test for trusted.lov xattr - star --xhelp 2>&1 | grep -q nolustre - if [ $? -ne 0 ] - then - skip "being skipped because a lustre-aware star is not installed." && return - fi - [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return + # b10930: tar test for trusted.lov xattr + TAR=$(find_lustre_tar) + [ -z "$TAR" ] && skip "lustre-aware tar is not installed" && return + [ "$OSTCOUNT" -lt "2" ] && skip "skipping N-stripe test" && return setup_test102 mkdir -p $DIR/d102d - star -x f=$TMP/f102.tar -C $DIR/d102d + $TAR xf $TMP/f102.tar -C $DIR/d102d --xattrs cd $DIR/d102d/$tdir compare_stripe_info1 - -} -run_test 102d "star restore stripe info from tarfile,not keep osts ===========" - -test_102e() { - # b10930: star test for trusted.lov xattr - star --xhelp 2>&1 | grep -q nolustre - [ $? -ne 0 ] && skip "lustre-aware star is not installed" && return - [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return - setup_test102 - mkdir -p $DIR/d102e - star -x -preserve-osts f=$TMP/f102.tar -C $DIR/d102e - cd $DIR/d102e/$tdir - compare_stripe_info2 } -run_test 102e "star restore stripe info from tarfile, keep osts ===========" +run_test 102d "tar restore stripe info from tarfile,not keep osts ===========" test_102f() { - # b10930: star test for trusted.lov xattr - star --xhelp 2>&1 | grep -q nolustre - [ $? -ne 0 ] && skip "lustre-aware star is not installed" && return - [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return + # b10930: tar test for trusted.lov xattr + TAR=$(find_lustre_tar) + [ -z "$TAR" ] && skip "lustre-aware tar is not installed" && return + [ "$OSTCOUNT" -lt "2" ] && skip "skipping N-stripe test" && return setup_test102 mkdir -p $DIR/d102f cd $DIR - star -copy $tdir $DIR/d102f + $TAR cf - --xattrs $tdir | $TAR xf - --xattrs -C $DIR/d102f cd $DIR/d102f/$tdir compare_stripe_info1 } -run_test 102f "star copy files, not keep osts ===========" - -test_102g() { - # b10930: star test for trusted.lov xattr - star --xhelp 2>&1 | grep -q nolustre - [ $? -ne 0 ] && skip "lustre-aware star is not installed" && return - [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return - setup_test102 - mkdir -p $DIR/d102g - cd $DIR - star -copy -preserve-osts $tdir $DIR/d102g - cd $DIR/d102g/$tdir - compare_stripe_info2 - cleanup_test102 -} -run_test 102g "star copy files, keep osts ===========" +run_test 102f "tar copy files, not keep osts ===========" test_102h() { # bug 15777 [ -z $(lctl get_param -n mdc.*.connect_flags | grep xattr) ] && @@ -4151,6 +4175,21 @@ test_102i() { # bug 17038 } run_test 102i "lgetxattr test on symbolic link ============" +test_102j() { + TAR=$(find_lustre_tar) + [ -z "$TAR" ] && skip "lustre-aware tar is not installed" && return + [ "$OSTCOUNT" -lt "2" ] && skip "skipping N-stripe test" && return + setup_test102 "$RUNAS" + mkdir -p $DIR/d102j + chown $RUNAS_ID $DIR/d102j + $RUNAS $TAR xf $TMP/f102.tar -C $DIR/d102j --xattrs + cd $DIR/d102j/$tdir + compare_stripe_info1 "$RUNAS" +} +run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ===" + +cleanup_test102 + run_acl_subtest() { $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test @@ -4447,6 +4486,8 @@ test_116() { echo "$MAXC files created on larger OST $MAXI1" [ $MINC -gt 0 ] && echo "Wrote $(($MAXC * 100 / $MINC - 100))% more files to larger OST $MAXI1" [ $MAXC -gt $MINC ] || error_ignore "stripe QOS didn't balance free space" + + rm -rf $DIR/$tdir/OST${MINI} } run_test 116 "stripe QOS: free space balance ===================" @@ -4477,7 +4518,7 @@ reset_async() { FILE=$DIR/reset_async # Ensure all OSCs are cleared - $LSTRIPE $FILE 0 -1 -1 + $LSTRIPE -c -1 $FILE dd if=/dev/zero of=$FILE bs=64k count=$OSTCOUNT sync rm $FILE @@ -5082,42 +5123,77 @@ test_123a() { # was test 123, statahead(bug 11401) SLOWOK=1 fi + rm -rf $DIR/$tdir mkdir -p $DIR/$tdir - rm -rf $DIR/$tdir/* - cancel_lru_locks mdc - cancel_lru_locks osc - error=0 NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'` [ $NUMFREE -gt 100000 ] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000)) MULT=10 - for ((i=1, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do + for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do createmany -o $DIR/$tdir/$tfile $j $((i - j)) - lctl get_param -n llite.*.statahead_max | grep '[0-9]' - cancel_lru_locks mdc - cancel_lru_locks osc - stime=`date +%s` - ls -l $DIR/$tdir > /dev/null - etime=`date +%s` - delta_sa=$((etime - stime)) - log "ls $i files with statahead: $delta_sa sec" - lctl get_param -n llite.*.statahead_stats - max=`lctl get_param -n llite.*.statahead_max | head -n 1` lctl set_param -n llite.*.statahead_max 0 lctl get_param llite.*.statahead_max cancel_lru_locks mdc cancel_lru_locks osc stime=`date +%s` - ls -l $DIR/$tdir > /dev/null + time ls -l $DIR/$tdir | wc -l etime=`date +%s` delta=$((etime - stime)) log "ls $i files without statahead: $delta sec" - lctl set_param llite.*.statahead_max=$max - if [ $delta_sa -gt $(($delta + 2)) ]; then - log "ls $i files is slower with statahead!" - error=1 + + swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'` + lctl get_param -n llite.*.statahead_max | grep '[0-9]' + cancel_lru_locks mdc + cancel_lru_locks osc + stime=`date +%s` + time ls -l $DIR/$tdir | wc -l + etime=`date +%s` + delta_sa=$((etime - stime)) + log "ls $i files with statahead: $delta_sa sec" + lctl get_param -n llite.*.statahead_stats + ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'` + + if [ $swrong -lt $ewrong ]; then + log "statahead was stopped, maybe too many locks held!" + fi + + [ $delta -eq 0 ] && continue + + if [ $((delta_sa * 100)) -gt $((delta * 105)) ]; then + if [ $SLOWOK -eq 0 ]; then + error "ls $i files is slower with statahead!" + + max=`lctl get_param -n llite.*.statahead_max | head -n 1` + lctl set_param -n llite.*.statahead_max 0 + lctl get_param llite.*.statahead_max + cancel_lru_locks mdc + cancel_lru_locks osc + $LCTL dk > /dev/null + stime=`date +%s` + time ls -l $DIR/$tdir | wc -l + etime=`date +%s` + $LCTL dk > $TMP/sanity_test_123a_${i}_disable_${etime}.log + delta=$((etime - stime)) + log "ls $i files without statahead: $delta sec, dump to $TMP/sanity_test_123a_${i}_disable_${etime}.log" + lctl set_param llite.*.statahead_max=$max + + lctl get_param -n llite.*.statahead_max | grep '[0-9]' + cancel_lru_locks mdc + cancel_lru_locks osc + $LCTL dk > /dev/null + stime=`date +%s` + time ls -l $DIR/$tdir | wc -l + etime=`date +%s` + $LCTL dk > $TMP/sanity_test_123a_${i}_enable_${etime}.log + delta_sa=$((etime - stime)) + log "ls $i files with statahead: $delta_sa sec, dump to $TMP/sanity_test_123a_${i}_enable_${etime}.log" + lctl get_param -n llite.*.statahead_stats + else + log "ls $i files is slower with statahead!" + fi + break fi [ $delta -gt 20 ] && break @@ -5134,10 +5210,6 @@ test_123a() { # was test 123, statahead(bug 11401) log "rm -r $DIR/$tdir/: $delta seconds" log "rm done" lctl get_param -n llite.*.statahead_stats - # wait for commitment of removal - sleep 2 - [ $error -ne 0 -a $SLOWOK -eq 0 ] && error "statahead is slow!" - return 0 } run_test 123a "verify statahead work" @@ -5204,7 +5276,7 @@ test_124a() { # them (10-100 locks). This depends on how fast ther were created. # Many of them were touched in almost the same moment and thus will # be killed in groups. - local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP)) + local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE)) # Use $LRU_SIZE_B here to take into account real number of locks # created in the case of CMD, LRU_SIZE_B != $NR in most of cases @@ -5442,10 +5514,18 @@ test_129() { } run_test 129 "test directory size limit ========================" +OLDIFS="$IFS" +cleanup_130() { + trap 0 + IFS="$OLDIFS" +} + test_130a() { filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return + trap cleanup_130 EXIT RETURN + local fm_file=$DIR/$tfile lfs setstripe -s 65536 -c 1 $fm_file || error "setstripe failed on $fm_file" dd if=/dev/zero of=$fm_file bs=65536 count=1 || error "dd failed for $fm_file" @@ -5463,6 +5543,7 @@ test_130a() { frag_lun=`echo $line | cut -d: -f5` ext_len=`echo $line | cut -d: -f4` if (( $frag_lun != $lun )); then + cleanup_130 error "FIEMAP on 1-stripe file($fm_file) failed" return fi @@ -5470,9 +5551,13 @@ test_130a() { done if (( lun != frag_lun || start_blk != 0 || tot_len != 64 )); then + cleanup_130 error "FIEMAP on 1-stripe file($fm_file) failed;" return fi + + cleanup_130 + echo "FIEMAP on single striped file succeeded" } run_test 130a "FIEMAP (1-stripe file)" @@ -5483,6 +5568,8 @@ test_130b() { filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return + trap cleanup_130 EXIT RETURN + local fm_file=$DIR/$tfile lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file" dd if=/dev/zero of=$fm_file bs=1M count=2 || error "dd failed on $fm_file" @@ -5501,6 +5588,7 @@ test_130b() { ext_len=`echo $line | cut -d: -f4` if (( $frag_lun != $last_lun )); then if (( tot_len != 1024 )); then + cleanup_130 error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of 256" return else @@ -5512,10 +5600,13 @@ test_130b() { last_lun=$frag_lun done if (( num_luns != 2 || 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 fi + cleanup_130 + echo "FIEMAP on 2-stripe file succeeded" } run_test 130b "FIEMAP (2-stripe file)" @@ -5526,6 +5617,8 @@ test_130c() { filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return + trap cleanup_130 EXIT RETURN + local fm_file=$DIR/$tfile lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file" dd if=/dev/zero of=$fm_file seek=1 bs=1M count=1 || error "dd failed on $fm_file" @@ -5545,10 +5638,12 @@ test_130c() { if (( $frag_lun != $last_lun )); then logical=`echo $line | cut -d: -f2 | cut -d. -f1` if (( logical != 512 )); then + cleanup_130 error "FIEMAP on $fm_file failed; returned logical start for lun $logical instead of 512" return fi if (( tot_len != 512 )); then + cleanup_130 error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of 1024" return else @@ -5560,10 +5655,13 @@ test_130c() { last_lun=$frag_lun done if (( num_luns != 2 || tot_len != 512 )); then + cleanup_130 error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun" return fi + cleanup_130 + echo "FIEMAP on 2-stripe file with hole succeeded" } run_test 130c "FIEMAP (2-stripe file with hole)" @@ -5574,6 +5672,8 @@ test_130d() { filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return + trap cleanup_130 EXIT RETURN + local fm_file=$DIR/$tfile lfs setstripe -s 65536 -c $OSTCOUNT $fm_file || error "setstripe failed on $fm_file" dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file" @@ -5592,6 +5692,7 @@ test_130d() { ext_len=`echo $line | cut -d: -f4` if (( $frag_lun != $last_lun )); then if (( tot_len != 1024 )); then + cleanup_130 error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of 1024" return else @@ -5603,10 +5704,13 @@ test_130d() { last_lun=$frag_lun done if (( num_luns != OSTCOUNT || 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 fi + cleanup_130 + echo "FIEMAP on N-stripe file succeeded" } run_test 130d "FIEMAP (N-stripe file)" @@ -5617,6 +5721,8 @@ test_130e() { filefrag_op=$(filefrag -e 2>&1 | grep "invalid option") [ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return + trap cleanup_130 EXIT RETURN + local fm_file=$DIR/$tfile lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file" NUM_BLKS=512 @@ -5640,6 +5746,7 @@ test_130e() { ext_len=`echo $line | cut -d: -f4` if (( $frag_lun != $last_lun )); then if (( tot_len != $EXPECTED_LEN )); then + cleanup_130 error "FIEMAP on $fm_file failed; returned len $tot_len for OST $last_lun instead of $EXPECTED_LEN" return else @@ -5651,11 +5758,13 @@ test_130e() { last_lun=$frag_lun done if (( num_luns != 2 || tot_len != $EXPECTED_LEN )); then - echo "$num_luns $tot_len" + cleanup_130 error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun" return fi + cleanup_130 + echo "FIEMAP with continuation calls succeeded" } run_test 130e "FIEMAP (test continuation FIEMAP calls)" @@ -5728,24 +5837,11 @@ test_140() { #bug-17379 } done i=`expr $i - 1` - [ $i -eq 5 -o $i -eq 8 ] || error "Invalid symlink depth" echo "The symlink depth = $i" + [ $i -eq 4 -o $i -eq 8 ] || error "Invalid symlink depth" } run_test 140 "Check reasonable stack depth (shouldn't LBUG) ====" -test_141() { - local ls - #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903 - $LCTL set_param fail_loc=0x903 - # cancel_lru_locks mgc - does not work due to lctl set_param syntax - for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do - echo "clear" > $ls - done - FAIL_ON_ERROR=true cleanup - FAIL_ON_ERROR=true setup -} -run_test 141 "umount should not race with any mgc requeue thread" - test_150() { local TF="$TMP/$tfile" @@ -5808,23 +5904,23 @@ test_151() { $LCTL set_param -n obdfilter.*.writethrough_cache_enable 1 # pages should be in the case right after write - dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES || error "dd failed" - BEFORE=`roc_hit` - cancel_lru_locks osc + dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES || error "dd failed" + local BEFORE=`roc_hit` + cancel_lru_locks osc cat $DIR/$tfile >/dev/null - AFTER=`roc_hit` + local AFTER=`roc_hit` if ! let "AFTER - BEFORE == CPAGES"; then error "NOT IN CACHE: before: $BEFORE, after: $AFTER" fi # the following read invalidates the cache - cancel_lru_locks osc + cancel_lru_locks osc $LCTL set_param -n obdfilter.*.read_cache_enable 0 cat $DIR/$tfile >/dev/null # now data shouldn't be found in the cache BEFORE=`roc_hit` - cancel_lru_locks osc + cancel_lru_locks osc cat $DIR/$tfile >/dev/null AFTER=`roc_hit` if let "AFTER - BEFORE != 0"; then @@ -5832,7 +5928,7 @@ test_151() { fi $LCTL set_param -n obdfilter.*.read_cache_enable 1 - rm -f $DIR/$tfile + rm -f $DIR/$tfile } run_test 151 "test cache on oss and controls ===============================" @@ -5859,6 +5955,216 @@ test_152() { } run_test 152 "test read/write with enomem ============================" +test_153() { + multiop $DIR/$tfile Ow4096Ycu || error "multiop failed" +} +run_test 153 "test if fdatasync does not crash =======================" + +err17935 () { + if [ $MDSCOUNT -gt 1 ]; then + error_ignore 17935 $* + else + error $* + fi +} + +test_154() { + cp /etc/hosts $DIR/$tfile + + fid=`$LFS path2fid $DIR/$tfile` + rc=$? + [ $rc -ne 0 ] && error "error: could not get fid for $DIR/$tfile." + + diff $DIR/$tfile $DIR/.lustre/fid/$fid || error "open by fid failed: did not find expected data in file." + + echo "Opening a file by FID succeeded" +} +run_test 154 "Opening a file by FID" + +#Changelogs +test_160() { + remote_mds && skip "remote MDS" && return + lctl set_param -n mdd.*.changelog on + $LFS changelog_clear $FSNAME 0 + + # change something + mkdir -p $DIR/$tdir/pics/2008/zachy + touch $DIR/$tdir/pics/2008/zachy/timestamp + cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg + mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach + ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg + ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg + rm $DIR/$tdir/pics/desktop.jpg + + # verify contents + $LFS changelog $FSNAME + # check target fid + fidc=$($LFS changelog $FSNAME | grep timestamp | grep "CREAT" | tail -1 | \ + awk '{print $5}') + fidf=$($LFS path2fid $DIR/$tdir/pics/zach/timestamp) + [ "$fidc" == "t=$fidf" ] || \ + err17935 "fid in changelog $fidc != file fid $fidf" + # check parent fid + fidc=$($LFS changelog $FSNAME | grep timestamp | grep "CREAT" | tail -1 | \ + awk '{print $6}') + fidf=$($LFS path2fid $DIR/$tdir/pics/zach) + [ "$fidc" == "p=$fidf" ] || \ + err17935 "pfid in changelog $fidc != dir fid $fidf" + + # verify purge + FIRST_REC=$($LFS changelog $FSNAME | head -1 | awk '{print $1}') + $LFS changelog_clear $FSNAME $(($FIRST_REC + 5)) + PURGE_REC=$($LFS changelog $FSNAME | head -1 | awk '{print $1}') + [ $PURGE_REC == $(($FIRST_REC + 6)) ] || \ + err17935 "first rec after purge should be $(($FIRST_REC + 6)); is $PURGE_REC" + # purge all + $LFS changelog_clear $FSNAME 0 + lctl set_param -n mdd.*.changelog off +} +run_test 160 "changelog sanity" + +test_161() { + # need local MDT for fid2path + remote_mds && skip "remote MDS" && return + + mkdir -p $DIR/$tdir + cp /etc/hosts $DIR/$tdir/$tfile + mkdir $DIR/$tdir/foo1 + mkdir $DIR/$tdir/foo2 + ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia + ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary + ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna + ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor + local FID=$($LFS path2fid $DIR/$tdir/$tfile) + if [ "$($LFS fid2path ${mds1_svc} $FID | wc -l)" != "5" ]; then + $LFS fid2path ${mds1_svc} $FID + err17935 "bad link ea" + fi + # middle + rm $DIR/$tdir/foo2/zachary + # last + rm $DIR/$tdir/foo2/thor + # first + rm $DIR/$tdir/$tfile + # rename + mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie + if [ "$($LFS fid2path ${mds1_svc} --link 1 $FID)" != "/$tdir/foo2/maggie" ] + then + $LFS fid2path ${mds1_svc} $FID + err17935 "bad link rename" + fi + rm $DIR/$tdir/foo2/maggie + + # overflow the EA + local longname=filename_avg_len_is_thirty_two_ + createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 || \ + error "failed to hardlink many files" + links=$($LFS fid2path ${mds1_svc} $FID | wc -l) + echo -n "${links}/1000 links in link EA" + [ ${links} -gt 60 ] || err17935 "expected at least 60 links in link EA" + unlinkmany $DIR/$tdir/foo2/$longname 1000 || \ + error "failed to unlink many hardlinks" +} +run_test 161 "link ea sanity" + +check_path() { + local expected=$1 + shift + local fid=$2 + + local path=$(${LFS} fid2path $*) + RC=$? + + if [ $RC -ne 0 ]; then + err17935 "path looked up of $expected failed. Error $RC" + return $RC + elif [ "${path}" != "${expected}" ]; then + err17935 "path looked up \"${path}\" instead of \"${expected}\"" + return 2 + fi + echo "fid $fid resolves to path $path" +} + +test_162() { + # need local MDT for fid2path + remote_mds && skip "remote MDS" && return + + # Make changes to filesystem + mkdir -p $DIR/$tdir/d2 + touch $DIR/$tdir/d2/$tfile + touch $DIR/$tdir/d2/x1 + touch $DIR/$tdir/d2/x2 + mkdir -p $DIR/$tdir/d2/a/b/c + mkdir -p $DIR/$tdir/d2/p/q/r + fid=$($LFS path2fid $DIR/$tdir/d2/$tfile) + check_path "/$tdir/d2/$tfile" ${mds1_svc} $fid --link 0 + ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink + mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file + fid=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file) + check_path "/$tdir/d2/a/b/c/new_file" ${mds1_svc} $fid --link 1 + check_path "/$tdir/d2/p/q/r/hlink" ${mds1_svc} $fid --link 0 + # check that there are 2 links, and that --rec doesnt break anything + ${LFS} fid2path ${mds1_svc} $fid --rec 20 | wc -l | grep -q 2 || \ + err17935 "expected 2 links" + + rm $DIR/$tdir/d2/p/q/r/hlink + check_path "/$tdir/d2/a/b/c/new_file" ${mds1_svc} $fid --link 0 + # Doesnt work with CMD yet: 17935 + return 0 +} +run_test 162 "path lookup sanity" + +test_170() { + $LCTL debug_daemon start $TMP/${tfile}_log_good + touch $DIR/$tfile + $LCTL debug_daemon stop + sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad || + error "sed failed to read log_good" + + $LCTL debug_daemon start $TMP/${tfile}_log_good + rm -rf $DIR/$tfile + $LCTL debug_daemon stop + + $LCTL df $TMP/${tfile}_log_bad 2&> $TMP/${tfile}_log_bad.out || + error "lctl df log_bad failed" + + local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}') + local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}') + + $LCTL df $TMP/${tfile}_log_good 2&>$TMP/${tfile}_log_good.out + local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}') + + [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] || + error "bad_line good_line1 good_line2 are empty" + + cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt + cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt + cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt + + $LCTL df $TMP/${tfile}_logs_corrupt 2&> $TMP/${tfile}_log_bad.out + local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}') + local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}') + + [ "$bad_line_new" ] && [ "$good_line_new" ] || + error "bad_line_new good_line_new are empty" + + local expected_good=$((good_line1 + good_line2*2)) + + rm -rf $TMP/${tfile}* + if [ $bad_line -ne $bad_line_new ]; then + error "expected $bad_line bad lines, but got $bad_line_new" + return 1 + fi + + if [ $expected_good -ne $good_line_new ]; then + error "expected $expected_good good lines, but got $good_line_new" + return 2 + fi + true +} +run_test 170 "test lctl df to handle corrupted log =====================" + +# OST pools tests POOL=${POOL:-cea1} TGT_COUNT=$OSTCOUNT TGTPOOL_FIRST=1 @@ -5888,27 +6194,24 @@ check_file_in_pool() } test_200a() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return do_facet mgs $LCTL pool_new $FSNAME.$POOL - do_facet mgs $LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL - [ $? == 0 ] || error "Pool creation of $POOL failed" + # get param should return err until pool is created + wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL 2>/dev/null || echo foo" "" || error "Pool creation of $POOL failed" } run_test 200a "Create new pool ==========================================" test_200b() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return - TGT=$(seq -f $FSNAME-OST%04g_UUID $TGTPOOL_FIRST $TGTPOOL_STEP \ - $TGTPOOL_MAX | tr '\n' ' ') + remote_mgs_nodsh && skip "remote MGS with nodsh" && return + TGT=$(for i in `seq $TGTPOOL_FIRST $TGTPOOL_STEP $TGTPOOL_MAX`; do printf "$FSNAME-OST%04x_UUID " $i; done) do_facet mgs $LCTL pool_add $FSNAME.$POOL \ - $FSNAME-OST[$TGTPOOL_FIRST-$TGTPOOL_MAX/$TGTPOOL_STEP]_UUID - res=$(do_facet mgs $LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL | sort \ - | tr '\n' ' ') - [ "$res" = "$TGT" ] || error "Pool content ($res) do not match requested ($TGT)" + $FSNAME-OST[$TGTPOOL_FIRST-$TGTPOOL_MAX/$TGTPOOL_STEP] + wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL | sort -u | tr '\n' ' ' " "$TGT" || error "Add to pool failed" } run_test 200b "Add targets to a pool ====================================" test_200c() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return mkdir -p $POOL_DIR $SETSTRIPE -c 2 -p $POOL $POOL_DIR [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR" @@ -5916,14 +6219,14 @@ test_200c() { run_test 200c "Set pool on a directory =================================" test_200d() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return res=$($GETSTRIPE $POOL_DIR | grep pool: | cut -f8 -d " ") [ "$res" = $POOL ] || error "Pool on $POOL_DIR is not $POOL" } run_test 200d "Check pool on a directory ===============================" test_200e() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return failed=0 for i in $(seq -w 1 $(($TGT_COUNT * 3))) do @@ -5940,7 +6243,7 @@ test_200e() { run_test 200e "Check files allocation from directory pool ==============" test_200f() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return mkdir -p $POOL_FILE failed=0 for i in $(seq -w 1 $(($TGT_COUNT * 3))) @@ -5958,30 +6261,30 @@ test_200f() { run_test 200f "Create files in a pool ===================================" test_200g() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return - TGT=$(do_facet mgs $LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL | head -1) + remote_mgs_nodsh && skip "remote MGS with nodsh" && return + TGT=$($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | head -1) do_facet mgs $LCTL pool_remove $FSNAME.$POOL $TGT - res=$(do_facet mgs $LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL | grep $TGT) - [ "$res" = "" ] || error "$TGT not removed from $FSNAME.$POOL" + wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL | grep $TGT" "" || error "$TGT not removed from $FSNAME.$POOL" } run_test 200g "Remove a target from a pool =============================" test_200h() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return - for TGT in $(do_facet mgs $LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL) + remote_mgs_nodsh && skip "remote MGS with nodsh" && return + for TGT in $($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | sort -u) do do_facet mgs $LCTL pool_remove $FSNAME.$POOL $TGT done - res=$(do_facet mgs $LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL) - [ "$res" = "" ] || error "Pool $FSNAME.$POOL cannot be drained" + wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL" ""\ + || error "Pool $FSNAME.$POOL cannot be drained" } run_test 200h "Remove all targets from a pool ==========================" test_200i() { - remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return do_facet mgs $LCTL pool_destroy $FSNAME.$POOL - res=$(do_facet mgs "$LCTL get_param -n lov.$FSNAME-MDT0000-mdtlov.pools.$POOL 2>/dev/null") - [ "$res" = "" ] || error "Pool $FSNAME.$POOL is not destroyed" + # get param should return err once pool is gone + wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL 2>/dev/null || echo foo" "foo" && return 0 + error "Pool $FSNAME.$POOL is not destroyed" } run_test 200i "Remove a pool ============================================" @@ -5994,9 +6297,22 @@ test_212() { } run_test 212 "Sendfile test ============================================" -TMPDIR=$OLDTMPDIR -TMP=$OLDTMP -HOME=$OLDHOME +# +# tests that do cleanup/setup should be run at the end +# + +test_900() { + local ls + #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903 + $LCTL set_param fail_loc=0x903 + # cancel_lru_locks mgc - does not work due to lctl set_param syntax + for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do + echo "clear" > $ls + done + FAIL_ON_ERROR=true cleanup + FAIL_ON_ERROR=true setup +} +run_test 900 "umount should not race with any mgc requeue thread" log "cleanup: ======================================================" check_and_cleanup_lustre