X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=aa53e3c122e27b5bad08da0b1da81f5dd802d78d;hb=0517160dd68ac026513ad1b8e3e6f7abd4acfdef;hp=d93a55bfa4d93989e1f3550841a6ec99c4192139;hpb=cd290a0eaf0f31722b26cadd8959c3aca0545d25;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index d93a55b..aa53e3c 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 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"} +# 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 @@ -20,9 +18,6 @@ CPU=`awk '/model/ {print $4}' /proc/cpuinfo` # buffer i/o errs sock spc runas [ "$CPU" = "UML" ] && EXCEPT="$EXCEPT 27m 27n 27o 27p 27q 27r 31d 54a 64b 99a 99b 99c 99d 99e 99f 101" -# test76 is not valid with FIDs because inode numbers are not reused -ALWAYS_EXCEPT="$ALWAYS_EXCEPT 76" - case `uname -r` in 2.4*) FSTYPE=${FSTYPE:-ext3} ;; 2.6*) FSTYPE=${FSTYPE:-ldiskfs} ;; @@ -47,12 +42,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} @@ -76,7 +68,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() { @@ -107,8 +98,6 @@ if [ "$ONLY" == "cleanup" ]; then exit 0 fi -[ "$SANITYLOG" ] && rm -f $SANITYLOG || true - check_and_setup_lustre DIR=${DIR:-$MOUNT} @@ -130,7 +119,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_ID $RUNAS +check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS build_test_filter @@ -304,16 +293,16 @@ test_6g() { $RUNAS mkdir $DIR/d6g/d || error chmod g+s $DIR/d6g/d || error mkdir $DIR/d6g/d/subdir - $CHECKSTAT -g \#$RUNAS_ID $DIR/d6g/d/subdir || error + $CHECKSTAT -g \#$RUNAS_GID $DIR/d6g/d/subdir || error } run_test 6g "Is new dir in sgid dir inheriting group?" test_6h() { # bug 7331 [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return touch $DIR/f6h || error "touch failed" - chown $RUNAS_ID:$RUNAS_ID $DIR/f6h || error "initial chown failed" - $RUNAS -G$RUNAS_ID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked" - $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_ID $DIR/f6h || error + chown $RUNAS_ID:$RUNAS_GID $DIR/f6h || error "initial chown failed" + $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked" + $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/f6h || error } run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)" @@ -480,7 +469,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" @@ -490,12 +479,23 @@ 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=0x80000144 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000143 ls -l $foo && error "error not detected" return 0 } run_test 17i "don't panic on short symlink" +test_17k() { #bug 22301 + rsync --help | grep -q xattr || + skip_env "$(rsync --version| head -1) does not support xattrs" + mkdir -p $DIR/{$tdir,$tdir.new} + touch $DIR/$tdir/$tfile + ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk + rsync -av -X $DIR/$tdir/ $DIR/$tdir.new || + error "rsync failed with xattrs enabled" +} +run_test 17k "symlinks: rsync with xattrs enabled =========================" + test_18() { touch $DIR/f ls $DIR || error @@ -554,13 +554,13 @@ run_test 21 "write to dangling link ============================" test_22() { WDIR=$DIR/$tdir mkdir -p $WDIR - chown $RUNAS_ID $WDIR + chown $RUNAS_ID:$RUNAS_GID $WDIR (cd $WDIR || error "cd $WDIR failed"; $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \ $RUNAS tar xf -) ls -lR $WDIR/etc || error "ls -lR $WDIR/etc failed" $CHECKSTAT -t dir $WDIR/etc || error "checkstat -t dir failed" - $CHECKSTAT -u \#$RUNAS_ID $WDIR/etc || error "checkstat -u failed" + $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $WDIR/etc || error "checkstat -u failed" } run_test 22 "unpack tar archive as non-root user ===============" @@ -782,6 +782,10 @@ test_24u() { # bug12192 } run_test 24u "create stripe file" +page_size() { + getconf PAGE_SIZE +} + test_24v() { local NRFILES=100000 local FREE_INODES=`lfs df -i|grep "filesystem summary" | awk '{print $5}'` @@ -791,12 +795,41 @@ test_24v() { mkdir -p $DIR/d24v createmany -m $DIR/d24v/$tfile $NRFILES + + cancel_lru_locks mdc + lctl set_param mdc.*.stats clear + ls $DIR/d24v >/dev/null || error "error in listing large dir" + # LU-5 large readdir + # DIRENT_SIZE = 32 bytes for sizeof(struct lu_dirent) + + # 8 bytes for name(filename is mostly 5 in this test) + + # 8 bytes for luda_type + # take into account of overhead in lu_dirpage header and end mark in + # each page, plus one in RPC_NUM calculation. + DIRENT_SIZE=48 + RPC_SIZE=$(($(lctl get_param -n mdc.*.max_pages_per_rpc)*$(page_size))) + RPC_NUM=$(((NRFILES * DIRENT_SIZE + RPC_SIZE - 1) / RPC_SIZE + 1)) + mds_readpage=`lctl get_param mdc.*.stats | \ + awk '/^mds_readpage/ {print $2}'` + [ $mds_readpage -gt $RPC_NUM ] && \ + error "large readdir doesn't take effect" + rm $DIR/d24v -rf } run_test 24v "list directory with large files (handle hash collision, bug: 17560)" +test_24w() { # bug21506 + SZ1=234852 + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1 + dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2 + dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3 + SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'` + [ "$SZ1" = "$SZ2" ] || \ + error "Error reading at the end of the file $tfile" +} +run_test 24w "Reading a file larger than 4Gb" + test_25a() { echo '== symlink sanity =============================================' @@ -985,7 +1018,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 } @@ -1016,19 +1049,23 @@ exhaust_precreations() { sed -e 's/_UUID$//;s/^.*-//') # on the mdt's osc - 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) + local mdtosc_proc1=$(get_mdtosc_proc_path mds${MDSIDX} $OST) + local last_id=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_last_id) + local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \ + osc.$mdtosc_proc1.prealloc_next_id) - do_facet mds${MDSIDX} lctl get_param osc.*OST*-osc-${MDT_INDEX}.prealloc* + local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX}) + do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc* - mkdir -p $DIR/d27/${OST} + mkdir -p $DIR/$tdir/${OST} $SETSTRIPE $DIR/$tdir/${OST} -i $OSTIDX -c 1 #define OBD_FAIL_OST_ENOSPC 0x215 do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=$FAILIDX do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x215 echo "Creating to objid $last_id on ost $OST..." createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2)) - do_facet mds${MDSIDX} lctl get_param osc.*OST*-osc-${MDT_INDEX}.prealloc* + do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc* do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=$FAILLOC sleep_maxage } @@ -1170,9 +1207,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 @@ -1191,9 +1228,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 =================" @@ -1203,6 +1241,8 @@ test_27w() { # bug 10997 $LSTRIPE $DIR/$tdir/f0 -s 65536 || error "lstripe failed" size=`$GETSTRIPE $DIR/$tdir/f0 -s` [ $size -ne 65536 ] && error "stripe size $size != 65536" || true + gsdir=$($LFS getstripe -d $DIR/$tdir) + [ $(echo $gsdir | grep -c stripe_count) -ne 1 ] && error "$LFS getstripe -d $DIR/$tdir failed" [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping multiple stripe count/offset test" && return for i in `seq 1 $OSTCOUNT`; do @@ -1239,13 +1279,16 @@ test_27y() { [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return remote_mds_nodsh && skip "remote MDS with nodsh" && return - local last_id=$(do_facet $SINGLEMDS lctl get_param -n osc.*0000-osc-MDT0000.prealloc_last_id) - local next_id=$(do_facet $SINGLEMDS lctl get_param -n osc.*0000-osc-MDT0000.prealloc_next_id) + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) + local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_last_id) + local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ + osc.$mdtosc.prealloc_next_id) local fcount=$((last_id - next_id)) [ $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 @@ -1253,7 +1296,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 @@ -1273,12 +1316,98 @@ 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 } run_test 27y "create files while OST0 is degraded and the rest inactive" +check_seq_oid() +{ + echo check file $1 + local old_ifs="$IFS" + IFS=$'\t\n :' + lmm=($($GETSTRIPE -v $1)) + + IFS=$'[:]' + fid=($($LFS path2fid $1)) + IFS="$old_ifs" + + # compare lmm_seq and lu_fid->f_seq + [ ${lmm[4]} = ${fid[1]} ] || { error "SEQ mismatch"; return 1; } + # compare lmm_object_id and lu_fid->oid + [ ${lmm[6]} = ${fid[2]} ] || { error "OID mismatch"; return 2; } + + echo -e "\tseq ${fid[1]}, oid ${fid[2]} ver ${fid[3]}\n\tstripe count: ${lmm[8]}" + + [ "$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 + 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) + + stop ost$devnum + do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS || + { error "mounting $dev as $FSTYPE failed"; return 3; } + + obj_filename=$(do_facet ost$devnum find $dir/O/$group -name $objid) + local ff=$(do_facet ost$devnum $LL_DECODE_FILTER_FID $obj_filename) + IFS=$'/= [:]' + ff=($(echo $ff)) + IFS="$old_ifs" + + # compare lmm_seq and filter_fid->ff_parent.f_seq + [ ${ff[11]} = ${lmm[4]} ] || { error "parent SEQ mismatch"; return 4; } + # compare lmm_object_id and filter_fid->ff_parent.f_oid + [ ${ff[12]} = ${lmm[6]} ] || { error "parent OID mismatch"; return 5; } + let stripe=${ff[13]} + [ $stripe -eq $i ] || { error "stripe mismatch"; return 6; } + + echo -e "\t\tost $obdidx, objid $objid, group $group" + do_facet ost$devnum umount -d $mntpt + start ost$devnum $dev $OST_MOUNT_OPTS + done +} + +test_27z() { + mkdir -p $DIR/$tdir + $SETSTRIPE $DIR/$tdir/$tfile-1 -c 1 -o 0 -s 1m || + { 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; } + dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT || + { error "dd $OSTCOUNT mb failed"; return 4; } + sync + + check_seq_oid $DIR/$tdir/$tfile-1 || return 5 + check_seq_oid $DIR/$tdir/$tfile-2 || return 6 +} +run_test 27z "check SEQ/OID on the MDT and OST filesystems" + +test_27A() { # b=19102 + local restore_size=`$GETSTRIPE -s $MOUNT` + local restore_count=`$GETSTRIPE -c $MOUNT` + local restore_offset=`$GETSTRIPE -o $MOUNT` + $SETSTRIPE -c 0 -o -1 -s 0 $MOUNT + local default_size=`$GETSTRIPE -s $MOUNT` + local default_count=`$GETSTRIPE -c $MOUNT` + local default_offset=`$GETSTRIPE -o $MOUNT` + local dsize=$((1024 * 1024)) + [ $default_size -eq $dsize ] || error "stripe size $default_size != $dsize" + [ $default_count -eq 1 ] || error "stripe count $default_count != 1" + [ $default_offset -eq -1 ] || error "stripe offset $default_offset != -1" + $SETSTRIPE -c $restore_count -o $restore_offset -s $restore_size $MOUNT +} +run_test 27A "check filesystem-wide default LOV EA values" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -1335,12 +1464,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 @@ -1394,7 +1541,7 @@ test_31f() { # bug 4554 $SETSTRIPE $DIR/d31f -s 1048576 -c 1 cp /etc/hosts $DIR/d31f ls -l $DIR/d31f - $DIR/d31f/hosts + $GETSTRIPE $DIR/d31f/hosts multiop_bg_pause $DIR/d31f D_c || return 1 MULTIPID2=$! @@ -1724,6 +1871,70 @@ test_33b() { } run_test 33b "test open file with malformed flags (No panic and return error)" +test_33c() { + local ostnum + local ostname + local write_bytes + local all_zeros + + all_zeros=: + rm -fr $DIR/d33 + mkdir -p $DIR/d33 + # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0 + + sync + for ostnum in $(seq $OSTCOUNT); do + # test-framework's OST numbering is one-based, while Lustre's + # is zero-based + 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. + write_bytes=$(do_facet ost$ostnum lctl get_param -n \ + obdfilter/$ostname/stats | + awk '/^write_bytes/ {print $7}' ) + echo "baseline_write_bytes@$OSTnum/$ostname=$write_bytes" + if (( ${write_bytes:-0} > 0 )) + then + all_zeros=false + break; + fi + done + + $all_zeros || return 0 + + # Write four bytes + echo foo > $DIR/d33/bar + # Really write them + sync + + # Total up write_bytes after writing. We'd better find non-zeros. + for ostnum in $(seq $OSTCOUNT); do + 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}' ) + echo "write_bytes@$OSTnum/$ostname=$write_bytes" + if (( ${write_bytes:-0} > 0 )) + then + all_zeros=false + break; + fi + done + + if $all_zeros + then + for ostnum in $(seq $OSTCOUNT); do + 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 + done + error "OST not keeping write_bytes stats (b22312)" + fi +} +run_test 33c "test llobdstat and write_bytes" + TEST_34_SIZE=${TEST_34_SIZE:-2000000000000} test_34a() { rm -f $DIR/f34 @@ -1785,6 +1996,23 @@ test_34f() { # bug 6242, 6243 } run_test 34f "read from a file with no objects until EOF =======" +test_34g() { + dd if=/dev/zero of=$DIR/$tfile bs=1 count=100 seek=$TEST_34_SIZE || error + $TRUNCATE $DIR/$tfile $((TEST_34_SIZE / 2))|| error + $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile || error "truncate failed" + cancel_lru_locks osc + $CHECKSTAT -s $((TEST_34_SIZE / 2)) $DIR/$tfile || \ + error "wrong size after lock cancel" + + $TRUNCATE $DIR/$tfile $TEST_34_SIZE || error + $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile || \ + error "expanding truncate failed" + cancel_lru_locks osc + $CHECKSTAT -s $TEST_34_SIZE $DIR/$tfile || \ + error "wrong expanded size after lock cancel" +} +run_test 34g "truncate long file ===============================" + test_35a() { cp /bin/sh $DIR/f35a chmod 444 $DIR/f35a @@ -1865,15 +2093,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 =====================" @@ -1915,16 +2154,330 @@ 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 } run_test 39 "mtime changed on create ===========================" +test_39b() { + mkdir -p $DIR/$tdir + cp -p /etc/passwd $DIR/$tdir/fopen + cp -p /etc/passwd $DIR/$tdir/flink + cp -p /etc/passwd $DIR/$tdir/funlink + cp -p /etc/passwd $DIR/$tdir/frename + ln $DIR/$tdir/funlink $DIR/$tdir/funlink2 + + sleep 1 + echo "aaaaaa" >> $DIR/$tdir/fopen + echo "aaaaaa" >> $DIR/$tdir/flink + echo "aaaaaa" >> $DIR/$tdir/funlink + echo "aaaaaa" >> $DIR/$tdir/frename + + local open_new=`stat -c %Y $DIR/$tdir/fopen` + local link_new=`stat -c %Y $DIR/$tdir/flink` + local unlink_new=`stat -c %Y $DIR/$tdir/funlink` + local rename_new=`stat -c %Y $DIR/$tdir/frename` + + cat $DIR/$tdir/fopen > /dev/null + ln $DIR/$tdir/flink $DIR/$tdir/flink2 + rm -f $DIR/$tdir/funlink2 + mv -f $DIR/$tdir/frename $DIR/$tdir/frename2 + + for (( i=0; i < 2; i++ )) ; do + local open_new2=`stat -c %Y $DIR/$tdir/fopen` + local link_new2=`stat -c %Y $DIR/$tdir/flink` + local unlink_new2=`stat -c %Y $DIR/$tdir/funlink` + local rename_new2=`stat -c %Y $DIR/$tdir/frename2` + + [ $open_new2 -eq $open_new ] || error "open file reverses mtime" + [ $link_new2 -eq $link_new ] || error "link file reverses mtime" + [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime" + [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39b "mtime change on open, link, unlink, rename ======" + +# this should be set to past +TEST_39_MTIME=`date -d "1 year ago" +%s` + +# bug 11063 +test_39c() { + touch $DIR1/$tfile + sleep 2 + local mtime0=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + [ "$mtime1" = $TEST_39_MTIME ] || \ + error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME" + + local d1=`date +%s` + echo hello >> $DIR1/$tfile + local d2=`date +%s` + local mtime2=`stat -c %Y $DIR1/$tfile` + [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \ + error "mtime is not updated on write: $d1 <= $mtime2 <= $d2" + + mv $DIR1/$tfile $DIR1/$tfile-1 + + for (( i=0; i < 2; i++ )) ; do + local mtime3=`stat -c %Y $DIR1/$tfile-1` + [ "$mtime2" = "$mtime3" ] || \ + error "mtime ($mtime2) changed (to $mtime3) on rename" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39c "mtime change on rename ===========================" + +# bug 21114 +test_39d() { + touch $DIR1/$tfile + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime=`stat -c %Y $DIR1/$tfile` + [ $mtime = $TEST_39_MTIME ] || \ + error "mtime($mtime) is not set to $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39d "create, utime, stat ==============================" + +# bug 21114 +test_39e() { + touch $DIR1/$tfile + 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 ] || \ + error "mtime($mtime2) is not set to $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39e "create, stat, utime, stat ========================" + +# bug 21114 +test_39f() { + touch $DIR1/$tfile + mtime1=`stat -c %Y $DIR1/$tfile` + + sleep 2 + 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 ] || \ + error "mtime($mtime2) is not set to $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39f "create, stat, sleep, utime, stat =================" + +# bug 11063 +test_39g() { + echo hello >> $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + sleep 2 + chmod o+r $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + [ "$mtime1" = "$mtime2" ] || \ + error "lost mtime: $mtime2, should be $mtime1" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39g "write, chmod, stat ===============================" + +# bug 11063 +test_39h() { + touch $DIR1/$tfile + sleep 1 + + local d1=`date` + echo hello >> $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + local d2=`date` + if [ "$d1" != "$d2" ]; then + echo "write and touch not within one second" + else + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + [ "$mtime2" = $TEST_39_MTIME ] || \ + error "lost mtime: $mtime2, should be $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done + fi +} +run_test 39h "write, utime within one second, stat =============" + +test_39i() { + touch $DIR1/$tfile + sleep 1 + + echo hello >> $DIR1/$tfile + local mtime1=`stat -c %Y $DIR1/$tfile` + + mv $DIR1/$tfile $DIR1/$tfile-1 + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile-1` + + [ "$mtime1" = "$mtime2" ] || \ + error "lost mtime: $mtime2, should be $mtime1" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39i "write, rename, stat ==============================" + +test_39j() { + touch $DIR1/$tfile + sleep 1 + + multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed" + local multipid=$! + local mtime1=`stat -c %Y $DIR1/$tfile` + + mv $DIR1/$tfile $DIR1/$tfile-1 + + kill -USR1 $multipid + wait $multipid || error "multiop close failed" + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile-1` + [ "$mtime1" = "$mtime2" ] || \ + error "mtime is lost on close: $mtime2, should be $mtime1" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39j "write, rename, close, stat =======================" + +test_39k() { + touch $DIR1/$tfile + sleep 1 + + multiop_bg_pause $DIR1/$tfile oO_RDWR:w2097152_c || error "multiop failed" + local multipid=$! + local mtime1=`stat -c %Y $DIR1/$tfile` + + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + kill -USR1 $multipid + wait $multipid || error "multiop close failed" + + for (( i=0; i < 2; i++ )) ; do + local mtime2=`stat -c %Y $DIR1/$tfile` + + [ "$mtime2" = $TEST_39_MTIME ] || \ + error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39k "write, utime, close, stat ========================" + +# this should be set to future +TEST_39_ATIME=`date -d "1 year" +%s` + +test_39l() { + local atime_diff=$(do_facet $SINGLEMDS lctl get_param -n mdd.*.atime_diff) + + mkdir -p $DIR/$tdir + + # test setting directory atime to future + touch -a -d @$TEST_39_ATIME $DIR/$tdir + local atime=$(stat -c %X $DIR/$tdir) + [ "$atime" = $TEST_39_ATIME ] || \ + error "atime is not set to future: $atime, should be $TEST_39_ATIME" + + # test setting directory atime from future to now + local d1=$(date +%s) + ls $DIR/$tdir + local d2=$(date +%s) + + cancel_lru_locks mdc + atime=$(stat -c %X $DIR/$tdir) + [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \ + error "atime is not updated from future: $atime, should be $d1 dir atime + atime_diff + d1=$(date +%s) + ls $DIR/$tdir + d2=$(date +%s) + cancel_lru_locks mdc + atime=$(stat -c %X $DIR/$tdir) + [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \ + error "atime is not updated : $atime, should be $d2" + + do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=60 + sleep 3 + + # test not setting directory atime when now < dir atime + atime_diff + ls $DIR/$tdir + cancel_lru_locks mdc + atime=$(stat -c %X $DIR/$tdir) + [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \ + error "atime is updated to $atime, should remain $d1/dev/null + done + $LCTL get_param $proc_osc0/cur_dirty_bytes + $LCTL get_param $proc_osc0/cur_grant_bytes + + # perform the real test + $LCTL set_param $proc_osc0/rpc_stats 0 + for ((;i<$files; i++)); do + [ $($LFS getstripe -i $TDIR/f$i) -eq 0 ] || continue + dd if=/dev/zero of=$TDIR/f$i bs=$pagesz count=$pages 2>/dev/null + done + sync + $LCTL get_param $proc_osc0/rpc_stats + + $LCTL get_param $proc_osc0/rpc_stats | + while read PPR RRPC RPCT RCUM BAR WRPC WPCT WCUM; do + [ "$PPR" != "16:" ] && continue + [ $WPCT -lt 85 ] && error "$pages-page write RPCs only $WPCT% < 85%" + break # we only want the "pages per rpc" stat + done + rm -rf $TDIR +} +run_test 42e "verify sub-RPC writes are not done synchronously" + test_43() { mkdir -p $DIR/$tdir cp -p /bin/ls $DIR/$tdir/$tfile @@ -2114,7 +2728,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 @@ -2209,10 +2823,6 @@ test_45() { } run_test 45 "osc io page accounting ============================" -page_size() { - getconf PAGE_SIZE -} - # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this # test tickles a bug where re-dirtying a page was failing to be mapped to the # objects offset and an assert hit when an rpc was built with 1023's mapped @@ -2482,7 +3092,7 @@ test_52a() { link $DIR/d52a/foo $DIR/d52a/foo_link 2>/dev/null && error "link worked" echo foo >> $DIR/d52a/foo || error "append foo failed" mrename $DIR/d52a/foo $DIR/d52a/foo_ren && error "rename worked" - lsattr $DIR/d52a/foo | egrep -q "^-+[ae]-+ $DIR/d52a/foo" || error "lsattr" + lsattr $DIR/d52a/foo | egrep -q "^-+a[-e]+ $DIR/d52a/foo" || error "lsattr" chattr -a $DIR/d52a/foo || error "chattr -a failed" cp -r $DIR/d52a /tmp/ rm -fr $DIR/d52a || error "cleanup rm failed" @@ -2502,7 +3112,7 @@ test_52b() { mrename $DIR/d52b/foo $DIR/d52b/foo_ren && error "rename worked" [ -f $DIR/d52b/foo ] || error [ -f $DIR/d52b/foo_ren ] && error - lsattr $DIR/d52b/foo | egrep -q "^-+[ie]-+ $DIR/d52b/foo" || error "lsattr" + lsattr $DIR/d52b/foo | egrep -q "^-+i[-e]+ $DIR/d52b/foo" || error "lsattr" chattr -i $DIR/d52b/foo || error "chattr failed" rm -fr $DIR/d52b || error @@ -2520,7 +3130,8 @@ test_53() { local ostnum # only test MDT0000 - for value in $(do_facet $SINGLEMDS lctl get_param osc.*-osc-MDT0000.prealloc_last_id) ; do + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) + for value in $(do_facet $SINGLEMDS lctl get_param osc.$mdtosc.prealloc_last_id) ; do param=`echo ${value[0]} | cut -d "=" -f1` ostname=`echo $param | cut -d "." -f2 | cut -d - -f 1-2` mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param) @@ -2604,30 +3215,8 @@ test_54e() { } run_test 54e "console/tty device works in lustre ======================" -check_fstype() { - grep -q $FSTYPE /proc/filesystems && return 1 - modprobe $FSTYPE - grep -q $FSTYPE /proc/filesystems && return 1 - insmod ../$FSTYPE/$FSTYPE.o - grep -q $FSTYPE /proc/filesystems && return 1 - insmod ../$FSTYPE/$FSTYPE.ko - grep -q $FSTYPE /proc/filesystems && return 1 - return 0 -} - -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 @@ -2756,8 +3345,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 =======" @@ -2860,14 +3449,14 @@ test_56q() { setup_56 $NUMFILES $NUMDIRS - chgrp $RUNAS_ID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed" + chgrp $RUNAS_GID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed" EXPECTED=$NUMFILES - NUMS="`$LFIND -gid $RUNAS_ID $TDIR | wc -l`" + NUMS="`$LFIND -gid $RUNAS_GID $TDIR | wc -l`" [ $NUMS -eq $EXPECTED ] || \ error "lfs find -gid $TDIR wrong: found $NUMS, expected $EXPECTED" EXPECTED=$(( ($NUMFILES+1) * $NUMDIRS + 1)) - NUMS="`$LFIND ! -gid $RUNAS_ID $TDIR | wc -l`" + NUMS="`$LFIND ! -gid $RUNAS_GID $TDIR | wc -l`" [ $NUMS -eq $EXPECTED ] || \ error "lfs find ! -gid $TDIR wrong: found $NUMS, expected $EXPECTED" @@ -2875,11 +3464,43 @@ test_56q() { } 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 ] || \ + error "lfs find $TDIR -size 0 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=0 + NUMS=`$LFIND ! -size 0 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR ! -size 0 wrong: found $NUMS, expected $EXPECTED" + echo "test" > $TDIR/56r && sync + EXPECTED=1 + NUMS=`$LFIND -size 5 -t f $TDIR | wc -l` + [ $NUMS -eq $EXPECTED ] || \ + error "lfs find $TDIR -size 5 wrong: found $NUMS, expected $EXPECTED" + EXPECTED=1 + 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 + 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 + 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_57a() { # note test will not do anything if MDS is not local remote_mds_nodsh && skip "remote MDS with nodsh" && return - - local MNTDEV="osd.*MDT*.mntdev" + local MNTDEV="osd*.*MDT*.mntdev" 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 @@ -2914,7 +3535,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 @@ -2928,7 +3550,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 @@ -2963,7 +3586,7 @@ TEST60_HEAD="test_60 run $RANDOM" test_60a() { [ ! -f run-llog.sh ] && skip_env "missing subtest run-llog.sh" && return log "$TEST60_HEAD - from kernel mode" - sh run-llog.sh + do_facet mgs sh run-llog.sh } run_test 60a "llog sanity tests run from kernel module ==========" @@ -3212,7 +3835,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=$? @@ -3258,7 +3881,7 @@ cleanup_68() { if [ ! -z "$LLITELOOPLOAD" ]; then rmmod llite_lloop unset LLITELOOPLOAD - fi + fi rm -f $DIR/f68* } @@ -3273,6 +3896,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 @@ -3345,7 +3970,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 @@ -3368,12 +3993,12 @@ 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 # Check that testing environment is properly set up. Skip if not - FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || { + FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS || { skip_env "User $RUNAS_ID does not exist - skipping" return 0 } @@ -3391,7 +4016,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() { @@ -3450,14 +4103,34 @@ test_74b() { # bug 13310 } run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)" +test_74c() { +#define OBD_FAIL_LDLM_NEW_LOCK + lctl set_param fail_loc=0x80000319 + touch $DIR/$tfile && error "Touch successful" + true +} +run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)" + num_inodes() { awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo } -test_76() { # bug 1443 - DETH=$(grep deathrow /proc/kallsyms /proc/ksyms 2> /dev/null | wc -l) - [ $DETH -eq 0 ] && skip "No _iget." && return 0 - BEFORE_INODES=`num_inodes` +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" local COUNT=1000 [ "$SLOW" = "no" ] && COUNT=100 @@ -3465,13 +4138,23 @@ test_76() { # bug 1443 touch $DIR/$tfile rm -f $DIR/$tfile done + cancel_lru_locks osc AFTER_INODES=`num_inodes` echo "after inodes: $AFTER_INODES" - [ $AFTER_INODES -gt $((BEFORE_INODES + 32)) ] && \ - error "inode slab grew from $BEFORE_INODES to $AFTER_INODES" - true + local wait=0 + while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do + sleep 2 + AFTER_INODES=`num_inodes` + wait=$((wait+2)) + echo "wait $wait seconds inodes: $AFTER_INODES" + if [ $wait -gt 30 ]; then + error "inode slab grew from $BEFORE_INODES to $AFTER_INODES" + fi + done + set_inode_slab_tunables "$SLAB_SETTINGS" } -run_test 76 "destroy duplicate inodes in client inode cache ====" +run_test 76 "confirm clients recycle inodes properly ====" + export ORIG_CSUM="" set_checksums() @@ -3488,13 +4171,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 @@ -3740,10 +4422,42 @@ test_80() { # bug 10718 error "elapsed for 1M@1T = $DIFF" fi true - rm -f $DIR/$tfile + rm -f $DIR/$tfile } run_test 80 "Page eviction is equally fast at high offsets too ====" +test_81a() { # LU-456 + # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228 + # MUST OR with the OBD_FAIL_ONCE (0x80000000) + do_facet ost0 lctl set_param fail_loc=0x80000228 + + # write should trigger a retry and success + $SETSTRIPE -i 0 -c 1 $DIR/$tfile + multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c + RC=$? + if [ $RC -ne 0 ] ; then + error "write should success, but failed for $RC" + fi +} +run_test 81a "OST should retry write when get -ENOSPC ===============" + +test_81b() { # LU-456 + # 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 + + # write should retry several times and return -ENOSPC finally + $SETSTRIPE -i 0 -c 1 $DIR/$tfile + multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c + RC=$? + ENOSPC=28 + if [ $RC -ne $ENOSPC ] ; then + error "dd should fail for -ENOSPC, but succeed." + fi +} +run_test 81b "OST should return -ENOSPC when retry still fails =======" + + test_99a() { [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && \ return @@ -3889,28 +4603,23 @@ test_101() { } run_test 101 "check read-ahead for random reads ================" -export SETUP_TEST101=no -setup_test101() { - [ "$SETUP_TEST101" = "yes" ] && return +setup_test101b() { mkdir -p $DIR/$tdir STRIPE_SIZE=1048576 STRIPE_COUNT=$OSTCOUNT STRIPE_OFFSET=0 - trap cleanup_test101 EXIT + trap cleanup_test101b EXIT # prepare the read-ahead file $SETSTRIPE $DIR/$tfile -s $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT dd if=/dev/zero of=$DIR/$tfile bs=1024k count=100 2> /dev/null - SETUP_TEST101=yes } -cleanup_test101() { - [ "$SETUP_TEST101" = "yes" ] || return +cleanup_test101b() { trap 0 rm -rf $DIR/$tdir - rm -f $DIR/$tfile - SETUP_TEST101=no + rm -f $DIR/$tfile } calc_total() { @@ -3944,7 +4653,7 @@ test_101b() { local FILE_LENGTH=$((STRIPE_SIZE*100)) local ITERATION=$((FILE_LENGTH/STRIDE_SIZE)) # prepare the read-ahead file - setup_test101 + setup_test101b cancel_lru_locks osc for BIDX in 2 4 8 16 32 64 128 256 do @@ -3958,7 +4667,7 @@ test_101b() { cancel_lru_locks osc ra_check_101 $BSIZE done - cleanup_test101 + cleanup_test101b true } run_test 101b "check stride-io mode read-ahead =================" @@ -4008,9 +4717,7 @@ test_101d() { } run_test 101d "file read with and without read-ahead enabled =================" -export SETUP_TEST102=no setup_test102() { - [ "$SETUP_TEST102" = "yes" ] && return mkdir -p $DIR/$tdir chown $RUNAS_ID $DIR/$tdir STRIPE_SIZE=65536 @@ -4037,14 +4744,12 @@ setup_test102() { cd $DIR $1 $TAR cf $TMP/f102.tar $tdir --xattrs - SETUP_TEST102=yes } cleanup_test102() { trap 0 - [ "$SETUP_TEST102" = "yes" ] || return 0 rm -f $TMP/f102.tar - SETUP_TEST102=no + rm -rf $DIR/d0.sanity/d102 } test_102a() { @@ -4297,6 +5002,28 @@ test_102j() { } run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ===" +test_102k() { + touch $DIR/$tfile + # b22187 just check that does not crash for regular file. + setfattr -n trusted.lov $DIR/$tfile + # b22187 'setfattr -n trusted.lov' should work as remove LOV EA for directories + local test_kdir=$DIR/d102k + mkdir $test_kdir + local default_size=`$GETSTRIPE -s $test_kdir` + local default_count=`$GETSTRIPE -c $test_kdir` + local default_offset=`$GETSTRIPE -o $test_kdir` + $SETSTRIPE -s 65536 -i 1 -c $OSTCOUNT $test_kdir || error 'dir setstripe failed' + setfattr -n trusted.lov $test_kdir + local stripe_size=`$GETSTRIPE -s $test_kdir` + local stripe_count=`$GETSTRIPE -c $test_kdir` + local stripe_offset=`$GETSTRIPE -o $test_kdir` + [ $stripe_size -eq $default_size ] || error "stripe size $stripe_size != $default_size" + [ $stripe_count -eq $default_count ] || error "stripe count $stripe_count != $default_count" + [ $stripe_offset -eq $default_offset ] || error "stripe offset $stripe_offset != $default_offset" + rm -rf $DIR/$tfile $test_kdir +} +run_test 102k "setfattr without parameter of value shouldn't cause a crash" + cleanup_test102 run_acl_subtest() @@ -4350,7 +5077,7 @@ test_103 () { } run_test 103 "acl test =========================================" -test_104() { +test_104a() { touch $DIR/$tfile lfs df || error "lfs df failed" lfs df -ih || error "lfs df -ih failed" @@ -4362,11 +5089,22 @@ test_104() { OSC=`lctl get_param -n devices | awk '/-osc-/ {print $4}' | head -n 1` lctl --device %$OSC deactivate lfs df || error "lfs df with deactivated OSC failed" - lctl --device %$OSC recover + lctl --device %$OSC activate lfs df || error "lfs df with reactivated OSC failed" rm -f $DIR/$tfile } -run_test 104 "lfs df [-ih] [path] test =========================" +run_test 104a "lfs df [-ih] [path] test =========================" + +test_104b() { + [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return + chmod 666 /dev/obd + denied_cnt=$((`$RUNAS $LFS check servers 2>&1 | grep "Permission denied" | wc -l`)) + if [ $denied_cnt -ne 0 ]; + then + error "lfs check servers test failed" + fi +} +run_test 104b "$RUNAS lfs check servers test ====================" test_105a() { # doesn't work on 2.4 kernels @@ -4415,6 +5153,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" @@ -4595,7 +5341,7 @@ test_116() { [ $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} + rm -rf $DIR/$tdir } run_test 116 "stripe QOS: free space balance ===================" @@ -4953,16 +5699,17 @@ test_118k() set_nodes_failloc "$(osts_nodes)" 0x20e mkdir -p $DIR/$tdir - for ((i=0;i<10;i++)); do - (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \ + for ((i=0;i<10;i++)); do + (dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \ error "dd to $DIR/$tdir/$tfile-$i failed" )& - SLEEPPID=$! - sleep 0.500s - kill $SLEEPPID - wait $SLEEPPID - done + SLEEPPID=$! + sleep 0.500s + kill $SLEEPPID + wait $SLEEPPID + done - set_nodes_failloc "$(osts_nodes)" 0 + set_nodes_failloc "$(osts_nodes)" 0 + rm -rf $DIR/$tdir } run_test 118k "bio alloc -ENOMEM and IO TERM handling =========" @@ -5344,6 +6091,7 @@ test_124a() { LRU_SIZE=$(lctl get_param -n $PARAM) if [ $LRU_SIZE -gt $(default_lru_size) ]; then NSDIR=$(echo $PARAM | cut -d "." -f1-3) + log "NSDIR=$NSDIR" log "NS=$(basename $NSDIR)" break fi @@ -5361,6 +6109,7 @@ test_124a() { # for 10h. After that locks begin to be killed by client. local MAX_HRS=10 local LIMIT=`lctl get_param -n $NSDIR.pool.limit` + log "LIMIT=$LIMIT" # Make LVF so higher that sleeping for $SLEEP is enough to _start_ # killing locks. Some time was spent for creating locks. This means @@ -5375,6 +6124,7 @@ test_124a() { local LRU_SIZE_B=$LRU_SIZE log "LVF=$LVF" local OLD_LVF=`lctl get_param -n $NSDIR.pool.lock_volume_factor` + log "OLD_LVF=$OLD_LVF" lctl set_param -n $NSDIR.pool.lock_volume_factor $LVF # Let's make sure that we really have some margin. Client checks @@ -5508,7 +6258,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)) @@ -5544,7 +6294,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 @@ -5560,49 +6350,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 ========================" @@ -5922,9 +6711,11 @@ som_mode_switch() { if [ x$som = x"enabled" ]; then [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected" + MOUNTOPT=`echo $MOUNTOPT | sed 's/som_preview//g'` do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled" else [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected" + MOUNTOPT="$MOUNTOPT,som_preview" do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled" fi @@ -5936,8 +6727,9 @@ som_mode_switch() { } test_132() { #1028, SOM - local num=$(get_mds_dir $DIR) - local mymds=mds${num} + local num=$(get_mds_dir $DIR) + local mymds=mds${num} + local MOUNTOPT_SAVE=$MOUNTOPT dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null cancel_lru_locks osc @@ -5967,11 +6759,111 @@ test_132() { #1028, SOM gl1=$(get_ost_param "ldlm_glimpse_enqueue") stat $DIR/$tfile >/dev/null gl2=$(get_ost_param "ldlm_glimpse_enqueue") - echo "SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" + echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" som_mode_switch $som2 $gl1 $gl2 + MOUNTOPT=$MOUNTOPT_SAVE } 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 ost $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() { + local testdir=$DIR/${tdir}/stats_testdir + mkdir -p $DIR/${tdir} + + # clear stats. + do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear + do_facet ost $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 + + rm -rf $DIR/${tdir} +} +run_test 133a "Verifying MDT stats ========================================" + +test_133b() { + 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 ost $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() { + 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 ost $LCTL set_param obdfilter.*.stats=clear + + dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=1024k 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 ========================================" + test_140() { #bug-17379 mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir" cd $DIR/$tdir || error "Changing to $DIR/$tdir" @@ -6144,14 +7036,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" @@ -6171,44 +7058,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 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 155d "Verification of correctness: read cache:off write_cache:off " +run_test 155h "Verify big file correctness: read cache:off write_cache:off" test_156() { local CPAGES=3 @@ -6454,7 +7391,7 @@ test_161() { rm $DIR/$tdir/$tfile # rename mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie - if [ "$($LFS fid2path $DIR --link 1 $FID)" != "/$tdir/foo2/maggie" ] + if [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] then $LFS fid2path $DIR $FID err17935 "bad link rename" @@ -6488,42 +7425,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" $DIR $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" $DIR $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 "/$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" $DIR $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 } @@ -6531,15 +7473,16 @@ run_test 162 "path lookup sanity" test_163() { remote_mds_nodsh && skip "remote MDS with nodsh" && return - copytool --test || { skip "copytool not runnable: $?" && return; } - copytool & + copytool --test $FSNAME || { skip "copytool not runnable: $?" && return; } + copytool $FSNAME & sleep 1 local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid) # this proc file is temporary and linux-only - do_facet mds lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid || error "lnl send failed" - kill $! + do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\ + error "kernel->userspace send failed" + kill -INT $! } -run_test 163 "LustreNetLink kernelcomms" +run_test 163 "kernel <-> userspace comms" test_169() { # do directio so as not to populate the page cache @@ -6596,7 +7539,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 @@ -6613,9 +7558,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 @@ -6629,6 +7577,10 @@ setup_obdecho_osc () { local rc=0 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 \ @@ -6636,7 +7588,7 @@ setup_obdecho_osc () { return $rc } -cleaup_obdecho_osc () { +cleanup_obdecho_osc () { local obdfilter_name=$1 $LCTL --device ${obdfilter_name}_osc cleanup >/dev/null $LCTL --device ${obdfilter_name}_osc detach >/dev/null @@ -6647,47 +7599,79 @@ obdecho_create_test() { local OBD=$1 local node=$2 local rc=0 + local id do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1 - [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" || \ + [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" || rc=2; } - [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec create 1" || \ - rc=3; } - [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 0 w 1" ||\ + if [ $rc -eq 0 ]; then + id=$(do_facet $node "$LCTL --device ec create 1" | awk '/object id/ {print $6}') + [ ${PIPESTATUS[0]} -eq 0 -a -n "$id" ] || rc=3 + fi + echo "New object id is $id" + [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 10 w v 64 $id" || rc=4; } [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ "cleanup" || rc=5; } [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \ "detach" || rc=6; } + [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" return $rc } -test_180() { +test_180a() { local rc=0 local rmmod_local=0 - local rmmod_remote=0 - lsmod | grep -q obdecho || \ - { load_module obdecho/obdecho && rmmod_local=1; } - OBD=$($LCTL dl | grep -v mdt | grep osc | awk '{print $4;exit}') - HOST=$($LCTL dl -t | grep -v mdt | grep osc | awk '{print $7;exit}') - OBD=`echo $OBD | sed 's/-osc-.*$//'` - [ "x$OBD" != "x" ] && { setup_obdecho_osc $HOST $OBD || rc=1; } || rc=1 - [ $rc -eq 0 ] && { obdecho_create_test ${OBD}_osc client || rc=2; } - [ "x$OBD" != "x" ] && cleaup_obdecho_osc $OBD + if ! module_loaded obdecho; then + 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 [ $rmmod_local -eq 1 ] && rmmod obdecho - [ $rc -eq 0 ] || return $rc + return $rc +} +run_test 180a "test obdecho on osc" + +test_180b() { + local rc=0 + local rmmod_remote=0 do_facet ost "lsmod | grep -q obdecho || " \ "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \ "modprobe obdecho; }" && rmmod_remote=1 - OBD=$(do_facet ost $LCTL dl | awk '/obdfilter/ {print $4;exit}') - [ "x$OBD" != "x" ] && { obdecho_create_test $OBD ost || rc=3; } + 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" - [ $rc -eq 0 ] || return $rc + return $rc +} +run_test 180b "test obdecho directly on obdfilter" - true +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 180 "test obdecho ============================================" +run_test 181 "Test open-unlinked dir ========================" # OST pools tests POOL=${POOL:-cea1} @@ -6697,7 +7681,8 @@ TGTPOOL_MAX=$(($TGT_COUNT - 1)) TGTPOOL_STEP=2 TGTPOOL_LIST=`seq $TGTPOOL_FIRST $TGTPOOL_STEP $TGTPOOL_MAX` POOL_ROOT=${POOL_ROOT:-$DIR/d200.pools} -POOL_DIR=$POOL_ROOT/dir_tst +POOL_DIR_NAME=dir_tst +POOL_DIR=$POOL_ROOT/$POOL_DIR_NAME POOL_FILE=$POOL_ROOT/file_tst check_file_in_pool() @@ -6747,13 +7732,25 @@ test_200c() { mkdir -p $POOL_DIR $SETSTRIPE -c 2 -p $POOL $POOL_DIR [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR" + # b-19919 test relative path works well + mkdir -p $POOL_DIR/$POOL_DIR_NAME + cd $POOL_DIR + $SETSTRIPE -c 2 -p $POOL $POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/$POOL_DIR_NAME" + $SETSTRIPE -c 2 -p $POOL ./$POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/./$POOL_DIR_NAME" + $SETSTRIPE -c 2 -p $POOL ../$POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/../$POOL_DIR_NAME" + $SETSTRIPE -c 2 -p $POOL ../$POOL_DIR_NAME/$POOL_DIR_NAME + [ $? = 0 ] || error "Cannot set pool $POOL to $POOL_DIR/../$POOL_DIR_NAME/$POOL_DIR_NAME" + rm -rf $POOL_DIR_NAME; cd - } 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 ===============================" @@ -6800,6 +7797,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) @@ -6829,8 +7838,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 @@ -6849,6 +7858,136 @@ run_test 201c "Remove a pool ============================================" cleanup_pools $FSNAME +# usage: default_attr +default_attr() { + $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1} +} + +# usage: trim +# Trims leading and trailing whitespace from the parameter string +trim() { + echo $@ +} + +# usage: check_default_stripe_attr +check_default_stripe_attr() { + # $GETSTRIPE returns trailing whitespace which needs to be trimmed off + ACTUAL=$(trim $($GETSTRIPE --$1 $DIR/$tdir)) + if [ $1 = "count" -o $1 = "size" ]; then + EXPECTED=`default_attr $1`; + else + # the 'stripeoffset' parameter prints as an unsigned int, so + # until this is fixed we hard-code -1 here + EXPECTED=-1; + fi + [ "x$ACTUAL" != "x$EXPECTED" ] && + error "$DIR/$tdir has stripe $1 '$ACTUAL', not '$EXPECTED'" +} + +# usage: check_raw_stripe_attr +check_raw_stripe_attr() { + # $GETSTRIPE returns trailing whitespace which needs to be trimmed off + ACTUAL=$(trim $($GETSTRIPE --raw --$1 $DIR/$tdir)) + if [ $1 = "count" -o $1 = "size" ]; then + EXPECTED=0; + else + EXPECTED=-1; + fi + [ "x$ACTUAL" != "x$EXPECTED" ] && + error "$DIR/$tdir has raw stripe $1 '$ACTUAL', not '$EXPECTED'" +} + + +test_204a() { + mkdir -p $DIR/$tdir + $SETSTRIPE --count 0 --size 0 --offset -1 $DIR/$tdir + + check_default_stripe_attr count + check_default_stripe_attr size + check_default_stripe_attr offset + + return 0 +} +run_test 204a "Print default stripe attributes =================" + +test_204b() { + mkdir -p $DIR/$tdir + $SETSTRIPE --count 1 $DIR/$tdir + + check_default_stripe_attr size + check_default_stripe_attr offset + + return 0 +} +run_test 204b "Print default stripe size and offset ===========" + +test_204c() { + mkdir -p $DIR/$tdir + $SETSTRIPE --size 65536 $DIR/$tdir + + check_default_stripe_attr count + check_default_stripe_attr offset + + return 0 +} +run_test 204c "Print default stripe count and offset ===========" + +test_204d() { + mkdir -p $DIR/$tdir + $SETSTRIPE --offset 0 $DIR/$tdir + + check_default_stripe_attr count + check_default_stripe_attr size + + return 0 +} +run_test 204d "Print default stripe count and size =============" + +test_204e() { + mkdir -p $DIR/$tdir + $SETSTRIPE -d $DIR/$tdir + + check_raw_stripe_attr count + check_raw_stripe_attr size + check_raw_stripe_attr offset + + return 0 +} +run_test 204e "Print raw stripe attributes =================" + +test_204f() { + mkdir -p $DIR/$tdir + $SETSTRIPE --count 1 $DIR/$tdir + + check_raw_stripe_attr size + check_raw_stripe_attr offset + + return 0 +} +run_test 204f "Print raw stripe size and offset ===========" + +test_204g() { + mkdir -p $DIR/$tdir + $SETSTRIPE --size 65536 $DIR/$tdir + + check_raw_stripe_attr count + check_raw_stripe_attr offset + + return 0 +} +run_test 204g "Print raw stripe count and offset ===========" + +test_204h() { + mkdir -p $DIR/$tdir + $SETSTRIPE --offset 0 $DIR/$tdir + + check_raw_stripe_attr count + check_raw_stripe_attr size + + return 0 +} +run_test 204h "Print raw stripe count and size =============" + test_212() { size=`date +%s` size=$((size % 8192 + 1)) @@ -6972,12 +8111,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" @@ -7047,6 +8186,99 @@ test_216() { # bug 20317 } run_test 216 "check lockless direct write works and updates file size and kms correctly" +test_217() { # bug 22430 + local node + for node in $(nodes_list); do + if [[ $node = *-* ]] ; then + echo "lctl ping $node@$NETTYPE" + lctl ping $node@$NETTYPE + else + echo "skipping $node (no hiphen detected)" + fi + done +} +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 =======================" + +test_219() { + # write one partial page + dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 + # set no grant so vvp_io_commit_write will do sync write + $LCTL set_param fail_loc=0x411 + # write a full page at the end of file + dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc + + $LCTL set_param fail_loc=0 + dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3 + $LCTL set_param fail_loc=0x411 + dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc +} +run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND" + +test_220() { #LU-325 + 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 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 + + echo "preallocated objects in MDS is $((last_id - next_id))" \ + "($last_id - $next_id)" + + count=$($LFS df -i $MOUNT | grep ^$OST | awk '{print $4}') + echo "OST still has $count objects" + + free=$((count + last_id - next_id)) + echo "create $((free - next_id)) files @next_id..." + createmany -o $DIR/$tdir/f $next_id $free || 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 mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4 + do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5 + echo "unlink $((free - next_id)) files @ $next_id..." + unlinkmany $DIR/$tdir/f $next_id $free || return 3 +} +run_test 220 "the preallocated objects in MDS still can be used if ENOSPC is returned by OST with enough disk space" + # # tests that do cleanup/setup should be run at the end # @@ -7064,12 +8296,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