X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=d400b2651b0e9f55ab2ae8d4994fa145148f0163;hp=c036325164126714bafa84136b5a3db13ae466cb;hb=f3332b47e33c4f928190c05dd2d806c0d225bef8;hpb=fba763e904b8130f6ad8b156ee4c48ef5e304514 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh old mode 100755 new mode 100644 index c036325..d400b26 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -9,7 +9,7 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742 +# 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"} @@ -44,12 +44,9 @@ MCREATE=${MCREATE:-mcreate} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} READS=${READS:-"reads"} -TRUNCATE=${TRUNCATE:-truncate} MUNLINK=${MUNLINK:-munlink} SOCKETSERVER=${SOCKETSERVER:-socketserver} SOCKETCLIENT=${SOCKETCLIENT:-socketclient} -IOPENTEST1=${IOPENTEST1:-iopentest1} -IOPENTEST2=${IOPENTEST2:-iopentest2} MEMHOG=${MEMHOG:-memhog} DIRECTIO=${DIRECTIO:-directio} ACCEPTOR_PORT=${ACCEPTOR_PORT:-988} @@ -73,7 +70,6 @@ init_logging [ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24v 27m 36f 36g 36h 51b 51c 60c 63 64b 68 71 73 77f 78 101 103 115 120g 124b" -SANITYLOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log} FAIL_ON_ERROR=false cleanup() { @@ -104,8 +100,6 @@ if [ "$ONLY" == "cleanup" ]; then exit 0 fi -[ "$SANITYLOG" ] && rm -f $SANITYLOG || true - check_and_setup_lustre DIR=${DIR:-$MOUNT} @@ -477,7 +471,7 @@ test_17h() { #bug 17378 mkdir -p $DIR/$tdir $SETSTRIPE $DIR/$tdir -c -1 #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 - do_facet mds lctl set_param fail_loc=0x80000141 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000141 touch $DIR/$tdir/$tfile || true } run_test 17h "create objects: lov_free_memmd() doesn't lbug" @@ -487,7 +481,7 @@ test_17i() { #bug 20018 local foo=$DIR/$tdir/$tfile ln -s $foo $foo || error "create symlink failed" #define OBD_FAIL_MDS_READLINK_EPROTO 0x143 - do_facet mds lctl set_param fail_loc=0x80000143 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000143 ls -l $foo && error "error not detected" return 0 } @@ -1004,7 +998,7 @@ test_27m() { run_test 27m "create file while OST0 was full ==================" sleep_maxage() { - local DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}') + local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}') sleep $DELAY } @@ -1273,7 +1267,7 @@ test_27y() { [ $fcount -eq 0 ] && skip "not enough space on OST0" && return [ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT - MDS_OSCS=`do_facet mds lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'` + MDS_OSCS=`do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'` OFFSET=$(($OSTCOUNT-1)) OST=-1 for OSC in $MDS_OSCS; do @@ -1281,7 +1275,7 @@ test_27y() { OST=`osc_to_ost $OSC` } else { echo $OSC "is Deactivate:" - do_facet mds lctl --device %$OSC deactivate + do_facet $SINGLEMDS lctl --device %$OSC deactivate } fi done @@ -1301,7 +1295,7 @@ test_27y() { for OSC in $MDS_OSCS; do [ `osc_to_ost $OSC` != $OST ] && { echo $OSC "is activate" - do_facet mds lctl --device %$OSC activate + do_facet $SINGLEMDS lctl --device %$OSC activate } done } @@ -1335,6 +1329,9 @@ check_seq_oid() local group=${lmm[$((j+3))]} local dev=$(ostdevname $devnum) local dir=${MOUNT%/*}/ost$devnum + local mntpt=$(facet_mntpt ost$devnum) + + stop ost$devnum do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS || { error "mounting $dev as $FSTYPE failed"; return 3; } @@ -1352,7 +1349,8 @@ 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 $dev + do_facet ost$devnum umount -d $mntpt + start ost$devnum $dev $OST_MOUNT_OPTS done } @@ -1445,12 +1443,30 @@ test_29() { } run_test 29 "IT_GETATTR regression ============================" -test_30() { +test_30a() { # was test_30 + cp `which ls` $DIR || cp /bin/ls $DIR + $DIR/ls / || error + rm $DIR/ls +} +run_test 30a "execute binary from Lustre (execve) ==============" + +test_30b() { cp `which ls` $DIR || cp /bin/ls $DIR - $DIR/ls / + chmod go+rx $DIR/ls + $RUNAS $DIR/ls / || error rm $DIR/ls } -run_test 30 "run binary from Lustre (execve) ===================" +run_test 30b "execute binary from Lustre as non-root ===========" + +test_30c() { # b=22376 + cp `which ls` $DIR || cp /bin/ls $DIR + chmod a-rw $DIR/ls + cancel_lru_locks mdc + cancel_lru_locks osc + $RUNAS $DIR/ls / || error + rm -f $DIR/ls +} +run_test 30c "execute binary from Lustre without read perms ====" test_31a() { $OPENUNLINK $DIR/f31 $DIR/f31 || error @@ -2056,15 +2072,26 @@ run_test 36f "utime on file racing with OST BRW write ==========" test_36g() { remote_ost_nodsh && skip "remote OST with nodsh" && return + local fmd_max_age + local fmd_before + local fmd_after mkdir -p $DIR/$tdir - export FMD_MAX_AGE=`do_facet ost1 lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | head -n 1` - FMD_BEFORE="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`" + fmd_max_age=$(do_facet ost1 \ + "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \ + head -n 1") + + fmd_before=$(do_facet ost1 \ + "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo") touch $DIR/$tdir/$tfile - sleep $((FMD_MAX_AGE + 12)) - FMD_AFTER="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`" - [ "$FMD_AFTER" -gt "$FMD_BEFORE" ] && \ - echo "AFTER : $FMD_AFTER > BEFORE $FMD_BEFORE" && \ + sleep $((fmd_max_age + 12)) + fmd_after=$(do_facet ost1 \ + "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo") + + echo "fmd_before: $fmd_before" + echo "fmd_after: $fmd_after" + [ "$fmd_after" -gt "$fmd_before" ] && \ + echo "AFTER: $fmd_after > BEFORE: $fmd_before" && \ error "fmd didn't expire after ping" || true } run_test 36g "filter mod data cache expiry =====================" @@ -2106,11 +2133,11 @@ test_39() { $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2 if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then echo "mtime" - ls -l $DIR/$tfile $DIR/${tfile}2 + ls -l --full-time $DIR/$tfile $DIR/${tfile}2 echo "atime" - ls -lu $DIR/$tfile $DIR/${tfile}2 + ls -lu --full-time $DIR/$tfile $DIR/${tfile}2 echo "ctime" - ls -lc $DIR/$tfile $DIR/${tfile}2 + ls -lc --full-time $DIR/$tfile $DIR/${tfile}2 error "O_TRUNC didn't change timestamps" fi } @@ -2214,7 +2241,7 @@ test_39e() { local mtime1=`stat -c %Y $DIR1/$tfile` touch -m -d @$TEST_39_MTIME $DIR1/$tfile - + for (( i=0; i < 2; i++ )) ; do local mtime2=`stat -c %Y $DIR1/$tfile` [ $mtime2 = $TEST_39_MTIME ] || \ @@ -2252,7 +2279,7 @@ test_39g() { sleep 2 chmod o+r $DIR1/$tfile - + for (( i=0; i < 2; i++ )) ; do local mtime2=`stat -c %Y $DIR1/$tfile` [ "$mtime1" = "$mtime2" ] || \ @@ -2347,7 +2374,7 @@ test_39k() { kill -USR1 $multipid wait $multipid || error "multiop close failed" - + for (( i=0; i < 2; i++ )) ; do local mtime2=`stat -c %Y $DIR1/$tfile` @@ -2410,6 +2437,26 @@ test_39l() { } run_test 39l "directory atime update ===========================" +test_39m() { + touch $DIR1/$tfile + sleep 2 + local far_past_mtime=$(date -d "May 29 1953" +%s) + local far_past_atime=$(date -d "Dec 17 1903" +%s) + + touch -m -d @$far_past_mtime $DIR1/$tfile + touch -a -d @$far_past_atime $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local timestamps=$(stat -c "%X %Y" $DIR1/$tfile) + [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \ + error "atime or mtime set incorrectly" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39m "test atime and mtime before 1970" + test_40() { dd if=/dev/zero of=$DIR/f40 bs=4096 count=1 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error @@ -2664,7 +2711,7 @@ test_43b() { cp -p `which multiop` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop MULTIOP_PROG=$DIR/d43/multiop multiop_bg_pause $TMP/test43.junk O_c || return 1 MULTIOP_PID=$! - truncate $DIR/d43/multiop 0 && error "expected error, got success" + $TRUNCATE $DIR/d43/multiop 0 && error "expected error, got success" kill -USR1 $MULTIOP_PID || return 2 wait $MULTIOP_PID || return 3 rm $TMP/test43.junk @@ -3151,19 +3198,8 @@ test_54e() { } run_test 54e "console/tty device works in lustre ======================" -test_55() { - rm -rf $DIR/d55 - mkdir $DIR/d55 - client_only && skip "Not a server" && return - mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting" - touch $DIR/d55/foo - $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1" - $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2" - echo "check for $EXT2_DEV. Please wait..." - rm -rf $DIR/d55/* - $UMOUNT $DIR/d55 || error "unmounting" -} -run_test 55 "check iopen_connect_dentry() ======================" +#The test_55 used to be iopen test and it was removed by bz#24037. +#run_test 55 "check iopen_connect_dentry() ======================" test_56a() { # was test_56 rm -rf $DIR/d56 @@ -3292,8 +3328,8 @@ run_test 56h "check lfs find ! -name =============================" test_56i() { tdir=${tdir}i mkdir -p $DIR/$tdir - UUID=`$LFS osts | awk '/0: / { print $2 }'` - OUT="`$LFIND -ost $UUID $DIR/$tdir`" + UUID=$(ostuuid_from_index 0 $DIR/$tdir) + OUT=$($LFIND -obd $UUID $DIR/$tdir) [ "$OUT" ] && error "$LFIND returned directory '$OUT'" || true } run_test 56i "check 'lfs find -ost UUID' skips directories =======" @@ -3414,7 +3450,7 @@ run_test 56q "check lfs find -gid and ! -gid ===============================" test_56r() { setup_56 $NUMFILES $NUMDIRS TDIR=$DIR/${tdir}g - + EXPECTED=12 NUMS=`$LFIND -size 0 -t f $TDIR | wc -l` [ $NUMS -eq $EXPECTED ] || \ @@ -3482,7 +3518,8 @@ test_57b() { 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 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" local FILE @@ -3496,7 +3533,8 @@ test_57b() { 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 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 @@ -3780,7 +3818,7 @@ test_65k() { # bug11679 STRIPE_INDEX=`do_facet $SINGLEMDS lctl get_param -n lov.*md*.target_obd | grep $STRIPE_OST | awk -F: '{print $1}' | head -n 1` - [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue + [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue echo "$SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1" do_facet client $SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1 RC=$? @@ -3826,7 +3864,7 @@ cleanup_68() { if [ ! -z "$LLITELOOPLOAD" ]; then rmmod llite_lloop unset LLITELOOPLOAD - fi + fi rm -f $DIR/f68* } @@ -3913,7 +3951,7 @@ test_69() { $DIRECTIO write ${f}.2 0 1 || error "directio write error" do_facet ost1 lctl set_param fail_loc=0x217 - truncate $f 1 # vmtruncate() will ignore truncate() error. + $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error. $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT" do_facet ost1 lctl set_param fail_loc=0 @@ -3936,7 +3974,7 @@ test_71() { } run_test 71 "Running dbench on lustre (don't segment fault) ====" -test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly +test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly check_kernel_version 43 || return 0 [ "$RUNAS_ID" = "$UID" ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return @@ -3959,7 +3997,35 @@ test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly true rm -f $DIR/f72 } -run_test 72 "Test that remove suid works properly (bug5695) ====" +run_test 72a "Test that remove suid works properly (bug5695) ====" + +test_72b() { # bug 24226 -- keep mode setting when size is not changing + local perm + + [ "$RUNAS_ID" = "$UID" ] && \ + skip_env "RUNAS_ID = UID = $UID -- skipping" && return + [ "$RUNAS_ID" -eq 0 ] && \ + skip_env "RUNAS_ID = 0 -- skipping" && return + + # Check that testing environment is properly set up. Skip if not + FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || { + skip_env "User $RUNAS_ID does not exist - skipping" + return 0 + } + touch $DIR/${tfile}-f{g,u} + mkdir $DIR/${tfile}-d{g,u} + chmod 770 $DIR/${tfile}-{f,d}{g,u} + chmod g+s $DIR/${tfile}-{f,d}g + chmod u+s $DIR/${tfile}-{f,d}u + for perm in 777 2777 4777; do + $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm" + $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm" + $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm" + $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm" + done + true +} +run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)" # bug 3462 - multiple simultaneous MDC requests test_73() { @@ -4030,7 +4096,20 @@ num_inodes() { awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo } +get_inode_slab_tunables() { + awk '/lustre_inode_cache/ {print $9," ",$10," ",$11; exit}' /proc/slabinfo +} + +set_inode_slab_tunables() { + echo "lustre_inode_cache $1" > /proc/slabinfo +} + test_76() { # Now for bug 20433, added originally in bug 1443 + local SLAB_SETTINGS=`get_inode_slab_tunables` + local CPUS=`getconf _NPROCESSORS_ONLN` + # we cannot set limit below 1 which means 1 inode in each + # per-cpu cache is still allowed + set_inode_slab_tunables "1 1 0" cancel_lru_locks osc BEFORE_INODES=`num_inodes` echo "before inodes: $BEFORE_INODES" @@ -4044,7 +4123,7 @@ test_76() { # Now for bug 20433, added originally in bug 1443 AFTER_INODES=`num_inodes` echo "after inodes: $AFTER_INODES" local wait=0 - while [ $AFTER_INODES -gt $BEFORE_INODES ]; do + while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do sleep 2 AFTER_INODES=`num_inodes` wait=$((wait+2)) @@ -4053,6 +4132,7 @@ test_76() { # Now for bug 20433, added originally in bug 1443 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES" fi done + set_inode_slab_tunables "$SLAB_SETTINGS" } run_test 76 "confirm clients recycle inodes properly ====" @@ -5023,6 +5103,14 @@ test_105d() { # bug 15924 } run_test 105d "flock race (should not freeze) ========" +test_105e() { # bug 22660 && 22040 + [ -z "`mount | grep \"$DIR.*flock\" | grep -v noflock`" ] && \ + skip "mount w/o flock enabled" && return + touch $DIR/$tfile + flocks_test 3 $DIR/$tfile +} +run_test 105e "Two conflicting flocks from same process =======" + test_106() { #bug 10921 mkdir -p $DIR/$tdir $DIR/$tdir && error "exec $DIR/$tdir succeeded" @@ -6169,49 +6257,48 @@ test_128() { # bug 15212 run_test 128 "interactive lfs for 2 consecutive find's" set_dir_limits () { - local mntdev - local node + local mntdev + local canondev + local node local LDPROC=/proc/fs/ldiskfs - for node in $(mdts_nodes); do - devs=$(do_node $node "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }') - for dev in $devs; do - mntdev=$(do_node $node "lctl get_param -n osd*.$dev.mntdev") - do_node $node "echo $1 >$LDPROC/\\\$(basename $mntdev)/max_dir_size" - done + for facet in $(get_facets MDS); do + canondev=$(ldiskfs_canon *.$(convert_facet2label $facet).mntdev $facet) + do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" || LDPROC=/sys/fs/ldiskfs + do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size" done } test_129() { - [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0 - remote_mds_nodsh && skip "remote MDS with nodsh" && return + [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0 + remote_mds_nodsh && skip "remote MDS with nodsh" && return - EFBIG=27 - MAX=16384 + EFBIG=27 + MAX=16384 - set_dir_limits $MAX + set_dir_limits $MAX - mkdir -p $DIR/$tdir + mkdir -p $DIR/$tdir - I=0 - J=0 - while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do - multiop $DIR/$tdir/$J Oc - rc=$? - if [ $rc -eq $EFBIG ]; then - set_dir_limits 0 - echo "return code $rc received as expected" - return 0 - elif [ $rc -ne 0 ]; then - set_dir_limits 0 - error_exit "return code $rc received instead of expected $EFBIG" - fi - J=$((J+1)) - I=$(stat -c%s "$DIR/$tdir") - done + I=0 + J=0 + while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do + multiop $DIR/$tdir/$J Oc + rc=$? + if [ $rc -eq $EFBIG ]; then + set_dir_limits 0 + echo "return code $rc received as expected" + return 0 + elif [ $rc -ne 0 ]; then + set_dir_limits 0 + error_exit "return code $rc received instead of expected $EFBIG" + fi + J=$((J+1)) + I=$(stat -c%s "$DIR/$tdir") + done - error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes" - do_facet $SINGLEMDS "echo 0 >$LDPROC" + set_dir_limits 0 + error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes" } run_test 129 "test directory size limit ========================" @@ -6757,14 +6844,9 @@ test_154() { } run_test 154 "Opening a file by FID" -test_155_load() { +test_155_small_load() { local temp=$TMP/$tfile local file=$DIR/$tfile - local list=$(comma_list $(osts_nodes)) - local big=$(do_nodes $list grep "cache" /proc/cpuinfo | \ - awk '{sum+=$4} END{print sum}') - - log big is $big K dd if=/dev/urandom of=$temp bs=6096 count=1 || \ error "dd of=$temp bs=6096 count=1 failed" @@ -6784,44 +6866,94 @@ test_155_load() { echo "12345" >>$file cmp $temp $file || error "$temp $file differ (append2)" - dd if=/dev/urandom of=$temp bs=$((big*2)) count=1k || \ - error "dd of=$temp bs=$((big*2)) count=1k failed" + rm -f $temp $file + true +} + +test_155_big_load() { + local temp=$TMP/$tfile + local file=$DIR/$tfile + + free_min_max + local cache_size=$(do_facet ost$((MAXI+1)) \ + "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo") + local large_file_size=$((cache_size * 2)) + + echo "OSS cache size: $cache_size KB" + echo "Large file size: $large_file_size KB" + + [ $MAXV -le $large_file_size ] && \ + skip_env "max available OST size needs > $large_file_size KB" && \ + return 0 + + $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed" + + dd if=/dev/urandom of=$temp bs=$large_file_size count=1k || \ + error "dd of=$temp bs=$large_file_size count=1k failed" cp $temp $file ls -lh $temp $file cancel_lru_locks osc cmp $temp $file || error "$temp $file differ" - rm -f $temp + rm -f $temp $file true } test_155a() { set_cache read on set_cache writethrough on - test_155_load + test_155_small_load } -run_test 155a "Verification of correctness: read cache:on write_cache:on" +run_test 155a "Verify small file correctness: read cache:on write_cache:on" test_155b() { set_cache read on set_cache writethrough off - test_155_load + test_155_small_load } -run_test 155b "Verification of correctness: read cache:on write_cache:off" +run_test 155b "Verify small file correctness: read cache:on write_cache:off" test_155c() { set_cache read off set_cache writethrough on - test_155_load + test_155_small_load } -run_test 155c "Verification of correctness: read cache:off write_cache:on" +run_test 155c "Verify small file correctness: read cache:off write_cache:on" test_155d() { set_cache read off set_cache writethrough off - test_155_load + test_155_small_load +} +run_test 155d "Verify small file correctness: read cache:off write_cache:off" + +test_155e() { + set_cache read on + set_cache writethrough on + test_155_big_load } -run_test 155d "Verification of correctness: read cache:off write_cache:off " +run_test 155e "Verify big file correctness: read cache:on write_cache:on" + +test_155f() { + set_cache read on + set_cache writethrough off + test_155_big_load +} +run_test 155f "Verify big file correctness: read cache:on write_cache:off" + +test_155g() { + set_cache read off + set_cache writethrough on + test_155_big_load +} +run_test 155g "Verify big file correctness: read cache:off write_cache:on" + +test_155h() { + set_cache read off + set_cache writethrough off + test_155_big_load +} +run_test 155h "Verify big file correctness: read cache:off write_cache:off" test_156() { local CPAGES=3 @@ -7101,42 +7233,47 @@ check_path() { err17935 "path looked up \"${path}\" instead of \"${expected}\"" return 2 fi - echo "fid $fid resolves to path $path" + echo "fid $fid resolves to path $path (expected $expected)" } test_162() { - # 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 + # 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 # regular file - FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[') - check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 + FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]') + check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 # softlink - ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink - FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[') - check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink + FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]') + check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + + # softlink to wrong file + ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong + FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]') + check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 # hardlink - 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 | tr -d '[') - # fid2path dir/fsname should both work - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 - check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 - - # hardlink count: check that there are 2 links - # Doesnt work with CMD yet: 17935 + 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 | tr -d '[]') + # fid2path dir/fsname should both work + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 + check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 + + # hardlink count: check that there are 2 links + # Doesnt work with CMD yet: 17935 ${LFS} fid2path $DIR $FID | wc -l | grep -q 2 || \ err17935 "expected 2 links" # hardlink indexing: remove the first link - rm $DIR/$tdir/d2/p/q/r/hlink - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 + rm $DIR/$tdir/d2/p/q/r/hlink + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 return 0 } @@ -7149,7 +7286,7 @@ test_163() { sleep 1 local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid) # this proc file is temporary and linux-only - do_facet mds lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\ + do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\ error "kernel->userspace send failed" kill -INT $! } @@ -7210,7 +7347,9 @@ test_170() { local expected_good=$((good_line1 + good_line2*2)) rm -f $TMP/${tfile}* - if [ $bad_line -ne $bad_line_new ]; then + # LU-231, short malformed line may not be counted into bad lines + if [ $bad_line -ne $bad_line_new ] && + [ $bad_line -ne $((bad_line_new - 1)) ]; then error "expected $bad_line bad lines, but got $bad_line_new" return 1 fi @@ -7227,9 +7366,12 @@ test_171() { # bug20592 #define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e $LCTL set_param fail_loc=0x50e $LCTL set_param fail_val=3000 - multiop_bg_pause $DIR/$tfile Os || true + multiop_bg_pause $DIR/$tfile O_s || true + local MULTIPID=$! + kill -USR1 $MULTIPID # cause log dump sleep 3 + wait $MULTIPID if dmesg | grep "recursive fault"; then error "caught a recursive fault" fi @@ -7244,6 +7386,9 @@ setup_obdecho_osc () { local ost_nid=$1 local obdfilter_name=$2 echo "Creating new osc for $obdfilter_name on $ost_nid" + # make sure we can find loopback nid + $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1 + [ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \ ${obdfilter_name}_osc_UUID || rc=2; } [ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \ @@ -7286,15 +7431,15 @@ test_180a() { local rmmod_local=0 if ! module_loaded obdecho; then - load_module obdecho/obdecho - rmmod_local=1 + load_module obdecho/obdecho + rmmod_local=1 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) target=${target%_UUID} - + [[ -n $target ]] && { setup_obdecho_osc $host $target || rc=1; } || rc=1 [ $rc -eq 0 ] && { obdecho_create_test ${target}_osc client || rc=2; } [[ -n $target ]] && cleanup_obdecho_osc $target @@ -7317,6 +7462,25 @@ test_180b() { } run_test 180b "test obdecho directly on obdfilter" +test_181() { # bug 22177 + mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir" + # create enough files to index the directory + createmany -o $DIR/$tdir/foobar 4000 + # print attributes for debug purpose + lsattr -d . + # open dir + multiop_bg_pause $DIR/$tdir D_Sc || return 1 + MULTIPID=$! + # remove the files & current working dir + unlinkmany $DIR/$tdir/foobar 4000 + rmdir $DIR/$tdir + kill -USR1 $MULTIPID + wait $MULTIPID + stat $DIR/$tdir && error "open-unlinked dir was not removed!" + return 0 +} +run_test 181 "Test open-unlinked dir ========================" + # OST pools tests POOL=${POOL:-cea1} TGT_COUNT=$OSTCOUNT @@ -7393,8 +7557,8 @@ run_test 200c "Set pool on a directory =================================" test_200d() { remote_mgs_nodsh && skip "remote MGS with nodsh" && return - res=$($GETSTRIPE --pool $POOL_DIR | awk '/^pool:/ {print $2}') - [ "$res" = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL" + res=$($GETSTRIPE --pool $POOL_DIR) + [ $res = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL" } run_test 200d "Check pool on a directory ===============================" @@ -7441,6 +7605,18 @@ test_200g() { } run_test 200g "lfs df a pool ============================================" +test_200h() { # b=24039 + mkdir -p $POOL_DIR || error "unable to create $POOL_DIR" + + local file="/..$POOL_DIR/$tfile-1" + $SETSTRIPE -p $POOL $file || error "unable to create $file" + + cd $POOL_DIR + $SETSTRIPE -p $POOL $tfile-2 || \ + error "unable to create $tfile-2 in $POOL_DIR" +} +run_test 200h "Create files in a pool with relative pathname ============" + test_201a() { remote_mgs_nodsh && skip "remote MGS with nodsh" && return TGT=$($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | head -1) @@ -7470,8 +7646,8 @@ run_test 201b "Remove all targets from a pool ==========================" test_201c() { remote_mgs_nodsh && skip "remote MGS with nodsh" && return do_facet mgs $LCTL pool_destroy $FSNAME.$POOL - - sleep 2 + + sleep 2 # striping on an empty/nonexistant pool should fall back to "pool of everything" touch ${POOL_DIR}/$tfile || error "failed to use fallback striping for missing pool" # setstripe on an empty pool should fail @@ -7613,12 +7789,12 @@ test_215() { # for bugs 18102, 21079, 21517 remove_lnet_proc_files "routers" # /proc/sys/lnet/peers should look like this: - # nid refs state max rtr min tx min queue + # nid refs state last max rtr min tx min queue # where nid is a string like 192.168.1.1@tcp2, refs > 0, - # state is up/down/NA, max >= 0. rtr, min, tx, min are + # state is up/down/NA, max >= 0. last, rtr, min, tx, min are # numeric (0 or >0 or <0), queue >= 0. - L1="^nid +refs +state +max +rtr +min +tx +min +queue$" - BR="^$NID +$P +(up|down|NA) +$N +$I +$I +$I +$I +$N$" + L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$" + BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$" create_lnet_proc_files "peers" check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1" check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1" @@ -7701,6 +7877,23 @@ test_217() { # bug 22430 } run_test 217 "check lctl ping for hostnames with hiphen ('-')" +test_218() { + # do directio so as not to populate the page cache + log "creating a 10 Mb file" + multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file" + log "starting reads" + dd if=$DIR/$tfile of=/dev/null bs=4096 & + log "truncating the file" + multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file" + log "killing dd" + kill %+ || true # reads might have finished + echo "wait until dd is finished" + wait + log "removing the temporary file" + rm -rf $DIR/$tfile || error "tmp file removal failed" +} +run_test 218 "parallel read and truncate should not deadlock =======================" + # # tests that do cleanup/setup should be run at the end # @@ -7718,12 +7911,9 @@ test_900() { } run_test 900 "umount should not race with any mgc requeue thread" -log "cleanup: ======================================================" +complete $(basename $0) $SECONDS check_and_cleanup_lustre if [ "$I_MOUNTED" != "yes" ]; then lctl set_param debug="$OLDDEBUG" 2> /dev/null || true fi - -echo '=========================== finished ===============================' -[ -f "$SANITYLOG" ] && cat $SANITYLOG && grep -q FAIL $SANITYLOG && exit 1 || true -echo "$0: completed" +exit_status