X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=fb48a6727af56420ace035e778558210cc447293;hb=4a8e06fb5af88f93a936ed8ba0718ff5d3554c9f;hp=4453d11d9c552743fc65fd8156057b4dac23c2c4;hpb=9130d05de4e2b610095169b6f49a149c66444ee2;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh old mode 100644 new mode 100755 index 4453d11..fb48a67 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -46,19 +46,37 @@ ALWAYS_EXCEPT+=" 407 312 " if $SHARED_KEY; then # bug number: LU-9795 LU-9795 LU-9795 LU-9795 - ALWAYS_EXCEPT+=" 17n 60a 133g 300f " + ALWAYS_EXCEPT+=" 17n 60a 133g 300f" +fi + +selinux_status=$(getenforce) +if [ "$selinux_status" != "Disabled" ]; then + # bug number: + ALWAYS_EXCEPT+="" fi # skip the grant tests for ARM until they are fixed if [[ $(uname -m) = aarch64 ]]; then # bug number: LU-11596 ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST" - # bug number: LU-11671 LU-11667 LU-4398 - ALWAYS_EXCEPT+=" 45 317 817" + # bug number: LU-11671 LU-11667 + ALWAYS_EXCEPT+=" 45 317" +fi + +# skip nfs tests on kernels >= 4.14.0 until they are fixed +if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then + # bug number: LU-12661 + ALWAYS_EXCEPT+=" 817" +fi +# skip cgroup tests on RHEL8.1 kernels until they are fixed +if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) && + $LINUX_VERSION_CODE < $(version_code 5.4.0) )); then + # bug number: LU-13063 + ALWAYS_EXCEPT+=" 411" fi # 5 12 (min)" -[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o" +[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o" if [ "$mds1_FSTYPE" = "zfs" ]; then # bug number for skipped test: @@ -538,11 +556,6 @@ test_17g() { [ $MDS1_VERSION -le $(version_code 2.3.55) ] && TESTS="4094 4095" - # skip long symlink name for rhel6.5. - # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename)) - grep -q '6.5' /etc/redhat-release &>/dev/null && - TESTS="59 60 61 4062 4063" - for i in $TESTS; do local SYMNAME=$(str_repeat 'x' $i) ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink" @@ -2468,11 +2481,11 @@ test_27D() { [ $MDS1_VERSION -lt $(version_code 2.9.55) ] || [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] && skip27D+=" -s 30,31" - [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && - skip27D+="-s 32" [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping || $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && skip27D+=" -s 32,33" + [[ $MDS_VERSION -lt $(version_code $SEL_VER) ]] && + skip27D+=" -s 34" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D || error "llapi_layout_test failed" @@ -2612,6 +2625,8 @@ run_test 27H "Set specific OSTs stripe" test_27I() { [ $PARALLEL == "yes" ] && skip "skip parallel run" [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + [[ $MDS1_VERSION -gt $(version_code 2.12.52) ]] || + skip "Need MDS version newer than 2.12.52" local pool=$TESTNAME local ostrange="1 1 1" @@ -4266,7 +4281,7 @@ test_39j() { error "mtime is lost on close: $mtime2, " \ "should be $mtime1" - cancel_lru_locks $OSC + cancel_lru_locks if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done lctl set_param fail_loc=0 @@ -4295,7 +4310,7 @@ test_39k() { [ "$mtime2" = $TEST_39_MTIME ] || \ error "mtime is lost on close: $mtime2, should be $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -4973,7 +4988,7 @@ test_49() { # LU-1030 [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_ost_nodsh && skip "remote OST with nodsh" - # get ost1 size - lustre-OST0000 + # get ost1 size - $FSNAME-OST0000 ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} | awk '{ print $4 }') # write 800M at maximum @@ -5493,19 +5508,27 @@ test_56c() { skip_env "OST $ost_name is in $old_status status" do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1 + [[ $OST1_VERSION -ge $(version_code 2.12.55) ]] && do_facet ost1 \ + $LCTL set_param -n obdfilter.$ost_name.no_precreate=1 sleep_maxage local new_status=$(ost_dev_status $ost_idx) - [[ "$new_status" = "D" ]] || - error "OST $ost_name is in status of '$new_status', not 'D'" + [[ "$new_status" =~ "D" ]] || + error "$ost_name status is '$new_status', missing 'D'" + if [[ $OST1_VERSION -ge $(version_code 2.12.55) ]]; then + [[ "$new_status" =~ "N" ]] || + error "$ost_name status is '$new_status', missing 'N'" + fi do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0 + [[ $OST1_VERSION -ge $(version_code 2.12.55) ]] && do_facet ost1 \ + $LCTL set_param -n obdfilter.$ost_name.no_precreate=0 sleep_maxage new_status=$(ost_dev_status $ost_idx) - [[ -z "$new_status" ]] || - error "OST $ost_name is in status of '$new_status', not ''" + [[ ! "$new_status" =~ "D" && ! "$new_status" =~ "N" ]] || + error "$ost_name status is '$new_status', has 'D' and/or 'N'" } run_test 56c "check 'lfs df' showing device status" @@ -5728,6 +5751,65 @@ test_56ob() { } run_test 56ob "check lfs find -atime -mtime -ctime with units" +test_newerXY_base() { + local x=$1 + local y=$2 + local dir=$DIR/$tdir + local ref + local negref + + if [ $y == "t" ]; then + ref="\"$(date +"%Y-%m-%d %H:%M:%S")\"" + else + ref=$DIR/$tfile.newer + touch $ref || error "touch $ref failed" + fi + sleep 2 + setup_56 $dir $NUMFILES $NUMDIRS "-i0 -c1" "-i0 -c1" + sleep 2 + if [ $y == "t" ]; then + negref="\"$(date +"%Y-%m-%d %H:%M:%S")\"" + else + negref=$DIR/$tfile.newerneg + touch $negref || error "touch $negref failed" + fi + + local cmd="$LFS find $dir -newer$x$y $ref" + local nums=$(eval $cmd | wc -l) + local expected=$(((NUMFILES + 2) * NUMDIRS + 1)) + + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find $dir ! -newer$x$y $negref" + nums=$(eval $cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find $dir -newer$x$y $ref ! -newer$x$y $negref" + nums=$(eval $cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + rm -rf $DIR/* +} + +test_56oc() { + test_newerXY_base "a" "a" + test_newerXY_base "a" "m" + test_newerXY_base "a" "c" + test_newerXY_base "m" "a" + test_newerXY_base "m" "m" + test_newerXY_base "m" "c" + test_newerXY_base "c" "a" + test_newerXY_base "c" "m" + test_newerXY_base "c" "c" + test_newerXY_base "a" "t" + test_newerXY_base "m" "t" + test_newerXY_base "c" "t" +} +run_test 56oc "check lfs find -newerXY work" + test_56p() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" @@ -5857,6 +5939,8 @@ test_56r() { run_test 56r "check lfs find -size works" test_56ra() { + [[ $MDS1_VERSION -gt $(version_code 2.12.58) ]] || + skip "MDS < 2.12.58 doesn't return LSOM data" local dir=$DIR/$tdir [[ $OSC == "mdc" ]] && skip "DoM files" && return @@ -6227,7 +6311,7 @@ test_56w() { done # $LFS_MIGRATE will fail if hard link migration is unsupported - if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then + if [[ $MDS1_VERSION -gt $(version_code 2.5.55) ]]; then createmany -l$dir/dir1/file1 $dir/dir1/link 200 || error "creating links to $dir/dir1/file1 failed" fi @@ -6565,6 +6649,7 @@ check_migrate_links() { local file1="$dir/file1" local begin="$2" local count="$3" + local runas="$4" local total_count=$(($begin + $count - 1)) local symlink_count=10 local uniq_count=10 @@ -6609,7 +6694,7 @@ check_migrate_links() { fi echo -n "migrating files..." - local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir) + local migrate_out=$($runas $LFS_MIGRATE -y -S '1m' $dir) local rc=$? [ $rc -eq 0 ] || error "migrate failed rc = $rc" echo "done" @@ -6664,6 +6749,9 @@ test_56xb() { echo "testing rsync mode when all links do not fit within xattrs" LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100 + chown -R $RUNAS_ID $dir + echo "testing non-root lfs migrate mode when not all links are in xattr" + LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100 "$RUNAS" # clean up rm -rf $dir @@ -7794,8 +7882,13 @@ test_65n() { local dir3=$MOUNT/$tdir-3 mkdir $dir3 || error "mkdir $dir3 failed" - ! getfattr -n trusted.lov $dir3 &> /dev/null || - error "$dir3 shouldn't have LOV EA" + # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show + # the root layout, which is the actual default layout that will be used + # when new files are created in $dir3. + local dir3_layout=$(get_layout_param $dir3) + local root_dir_layout=$(get_layout_param $MOUNT) + [[ "$dir3_layout" = "$root_dir_layout" ]] || + error "$dir3 should show the default layout from $MOUNT" # set OST pool on root directory local pool=$TESTNAME @@ -7817,8 +7910,14 @@ test_65n() { local dir4=$MOUNT/$tdir-4 mkdir $dir4 || error "mkdir $dir4 failed" - ! getfattr -n trusted.lov $dir4 &> /dev/null || - error "$dir4 shouldn't have LOV EA" + local dir4_layout=$(get_layout_param $dir4) + root_dir_layout=$(get_layout_param $MOUNT) + echo "$LFS getstripe -d $dir4" + $LFS getstripe -d $dir4 + echo "$LFS getstripe -d $MOUNT" + $LFS getstripe -d $MOUNT + [[ "$dir4_layout" = "$root_dir_layout" ]] || + error "$dir4 should show the default layout from $MOUNT" # new file created in $dir4 should inherit the pool from # the filesystem default @@ -7837,10 +7936,33 @@ test_65n() { local dir5=$dir4/$tdir-5 mkdir $dir5 || error "mkdir $dir5 failed" - local dir4_layout=$(get_layout_param $dir4) + dir4_layout=$(get_layout_param $dir4) local dir5_layout=$(get_layout_param $dir5) [[ "$dir4_layout" = "$dir5_layout" ]] || error "$dir5 should inherit the default layout from $dir4" + + # though subdir under ROOT doesn't inherit default layout, but + # its sub dir/file should be created with default layout. + [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -ge $(version_code 2.12.59) ]] || + skip "Need MDS version at least 2.12.59" + + local default_lmv_count=$($LFS getdirstripe -D -c $MOUNT) + local default_lmv_index=$($LFS getdirstripe -D -i $MOUNT) + local default_lmv_hash=$($LFS getdirstripe -D -H $MOUNT) + + if [ $default_lmv_hash == "none" ]; then + stack_trap "$LFS setdirstripe -D -d $MOUNT" EXIT + else + stack_trap "$LFS setdirstripe -D -i $default_lmv_index \ + -c $default_lmv_count -H $default_lmv_hash $MOUNT" EXIT + fi + + $LFS setdirstripe -D -c 2 $MOUNT || + error "setdirstripe -D -c 2 failed" + mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed" + local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6) + [ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count" } run_test 65n "don't inherit default layout from root for new subdirectories" @@ -8476,31 +8598,35 @@ test_80() { # bug 10718 [ $PARALLEL == "yes" ] && skip "skip parallel run" # relax strong synchronous semantics for slow backends like ZFS - local soc="obdfilter.*.sync_on_lock_cancel" - local soc_old=$(do_facet ost1 lctl get_param -n $soc | head -n1) - local hosts= - if [ "$soc_old" != "never" ] && - [ "$ost1_FSTYPE" != "ldiskfs" ]; then - hosts=$(for host in $(seq -f "ost%g" 1 $OSTCOUNT); do - facet_active_host $host; done | sort -u) - do_nodes $hosts lctl set_param $soc=never - fi + if [ "$ost1_FSTYPE" != "ldiskfs" ]; then + local soc="obdfilter.*.sync_lock_cancel" + local save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1) - dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M - sync; sleep 1; sync - local BEFORE=`date +%s` - cancel_lru_locks osc - local AFTER=`date +%s` - local DIFF=$((AFTER-BEFORE)) - if [ $DIFF -gt 1 ] ; then - error "elapsed for 1M@1T = $DIFF" - fi + # "sync_on_lock_cancel" was broken by v2_11_55_0-26-g7059644e9a + if [ -z "$save" ]; then + soc="obdfilter.*.sync_on_lock_cancel" + save=$(do_facet ost1 $LCTL get_param -n $soc | head -n1) + fi - [ -n "$hosts" ] && do_nodes $hosts lctl set_param $soc=$soc_old + if [ "$save" != "never" ]; then + local hosts=$(comma_list $(osts_nodes)) - rm -f $DIR/$tfile + do_nodes $hosts $LCTL set_param $soc=never + stack_trap "do_nodes $hosts $LCTL set_param $soc=$save" + fi + fi + + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1M + sync; sleep 1; sync + local before=$(date +%s) + cancel_lru_locks osc + local after=$(date +%s) + local diff=$((after - before)) + [ $diff -le 1 ] || error "elapsed for 1M@1T = $diff" + + rm -f $DIR/$tfile } -run_test 80 "Page eviction is equally fast at high offsets too ====" +run_test 80 "Page eviction is equally fast at high offsets too" test_81a() { # LU-456 [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -8644,7 +8770,6 @@ cleanup_101a() { test_101a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" - [ $MDSCOUNT -ge 2 ] && skip_env "needs < 2 MDTs" #LU-4322 local s local discard @@ -8669,9 +8794,12 @@ test_101a() { done cleanup_101a - if [[ $(($discard * 10)) -gt $nreads ]]; then - $LCTL get_param osc.*-osc*.rpc_stats - $LCTL get_param llite.*.read_ahead_stats + $LCTL get_param osc.*-osc*.rpc_stats + $LCTL get_param llite.*.read_ahead_stats + + # Discard is generally zero, but sometimes a few random reads line up + # and trigger larger readahead, which is wasted & leads to discards. + if [[ $(($discard)) -gt $nreads ]]; then error "too many ($discard) discarded pages" fi rm -f $DIR/$tfile || true @@ -11035,6 +11163,27 @@ test_123b () { # statahead(bug 15027) } run_test 123b "not panic with network error in statahead enqueue (bug 15027)" +test_123c() { + [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" + + test_mkdir -i 0 -c 1 $DIR/$tdir.0 + test_mkdir -i 1 -c 1 $DIR/$tdir.1 + touch $DIR/$tdir.1/{1..3} + mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0 + + remount_client $MOUNT + + $MULTIOP $DIR/$tdir.0 Q + + # let statahead to complete + ls -l $DIR/$tdir.0 > /dev/null + + testid=$(echo $TESTNAME | tr '_' ' ') + dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" && + error "statahead warning" || true +} +run_test 123c "Can not initialize inode warning on DNE statahead" + test_124a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize || @@ -11314,41 +11463,52 @@ run_test 126 "check that the fsgid provided by the client is taken into account" test_127a() { # bug 15521 [ $PARALLEL == "yes" ] && skip "skip parallel run" + local name count samp unit min max sum sumsq $LFS setstripe -i 0 -c 1 $DIR/$tfile || error "setstripe failed" + echo "stats before reset" + $LCTL get_param osc.*.stats $LCTL set_param osc.*.stats=0 - FSIZE=$((2048 * 1024)) - dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1 + local fsize=$((2048 * 1024)) + + dd if=/dev/zero of=$DIR/$tfile bs=$fsize count=1 cancel_lru_locks osc - dd if=$DIR/$tfile of=/dev/null bs=$FSIZE - - $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp - while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do - echo "got $COUNT $NAME" - [ ! $MIN ] && error "Missing min value for $NAME proc entry" - eval $NAME=$COUNT || error "Wrong proc format" - - case $NAME in - read_bytes|write_bytes) - [ $MIN -lt 4096 ] && error "min is too small: $MIN" - [ $MIN -gt $FSIZE ] && error "min is too big: $MIN" - [ $MAX -lt 4096 ] && error "max is too small: $MAX" - [ $MAX -gt $FSIZE ] && error "max is too big: $MAX" - [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM" - [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] && - error "sumsquare is too small: $SUMSQ" - [ $SUMSQ -gt $((FSIZE * FSIZE)) ] && - error "sumsquare is too big: $SUMSQ" - ;; - *) ;; - esac - done < $DIR/${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" + dd if=$DIR/$tfile of=/dev/null bs=$fsize + + $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/$tfile.tmp + stack_trap "rm -f $TMP/$tfile.tmp" + while read name count samp unit min max sum sumsq; do + echo "got name=$name count=$count unit=$unit min=$min max=$max" + [ ! $min ] && error "Missing min value for $name proc entry" + eval $name=$count || error "Wrong proc format" + + case $name in + read_bytes|write_bytes) + [[ "$unit" =~ "bytes" ]] || + error "unit is not 'bytes': $unit" + (( $min >= 4096 )) || error "min is too small: $min" + (( $min <= $fsize )) || error "min is too big: $min" + (( $max >= 4096 )) || error "max is too small: $max" + (( $max <= $fsize )) || error "max is too big: $max" + (( $sum == $fsize )) || error "sum is wrong: $sum" + (( $sumsq >= ($fsize / 4096) * (4096 * 4096) )) || + error "sumsquare is too small: $sumsq" + (( $sumsq <= $fsize * $fsize )) || + error "sumsquare is too big: $sumsq" + ;; + ost_read|ost_write) + [[ "$unit" =~ "usec" ]] || + error "unit is not 'usec': $unit" + ;; + *) ;; + esac + done < $DIR/$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 127a "verify the client stats are sane" @@ -11356,6 +11516,8 @@ test_127b() { # bug LU-333 [ $PARALLEL == "yes" ] && skip "skip parallel run" local name count samp unit min max sum sumsq + echo "stats before reset" + $LCTL get_param llite.*.stats $LCTL set_param llite.*.stats=0 # perform 2 reads and writes so MAX is different from SUM. @@ -11366,30 +11528,28 @@ test_127b() { # bug LU-333 dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1 $LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp + stack_trap "rm -f $TMP/$tfile.tmp" while read name count samp unit min max sum sumsq; do - echo "got $count $name" + echo "got name=$name count=$count unit=$unit min=$min max=$max" eval $name=$count || error "Wrong proc format" case $name in - read_bytes) - [ $count -ne 2 ] && error "count is not 2: $count" - [ $min -ne $PAGE_SIZE ] && + read_bytes|write_bytes) + [[ "$unit" =~ "bytes" ]] || + error "unit is not 'bytes': $unit" + (( $count == 2 )) || error "count is not 2: $count" + (( $min == $PAGE_SIZE )) || error "min is not $PAGE_SIZE: $min" - [ $max -ne $PAGE_SIZE ] && - error "max is incorrect: $max" - [ $sum -ne $((PAGE_SIZE * 2)) ] && - error "sum is wrong: $sum" + (( $max == $PAGE_SIZE )) || + error "max is not $PAGE_SIZE: $max" + (( $sum == $PAGE_SIZE * 2 )) || + error "sum is not $((PAGE_SIZE * 2)): $sum" ;; - write_bytes) - [ $count -ne 2 ] && error "count is not 2: $count" - [ $min -ne $PAGE_SIZE ] && - error "min is not $PAGE_SIZE: $min" - [ $max -ne $PAGE_SIZE ] && - error "max is incorrect: $max" - [ $sum -ne $((PAGE_SIZE * 2)) ] && - error "sum is wrong: $sum" + read|write) + [[ "$unit" =~ "usec" ]] || + error "unit is not 'usec': $unit" ;; - *) ;; + *) ;; esac done < $TMP/$tfile.tmp @@ -11398,8 +11558,6 @@ test_127b() { # bug LU-333 [ "$write_bytes" ] || error "Missing write_bytes stats" [ "$read_bytes" != 0 ] || error "no read done" [ "$write_bytes" != 0 ] || error "no write done" - - rm -f $TMP/${tfile}.tmp } run_test 127b "verify the llite client stats are sane" @@ -12336,33 +12494,22 @@ test_133g() { remote_mds_nodsh && skip "remote MDS with nodsh" remote_ost_nodsh && skip "remote OST with nodsh" - # eventually, this can also be replaced with "lctl get_param -R", - # but not until that option is always available on the server local facet for facet in mds1 ost1; do - [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] && - skip_noexit "Too old lustre on $facet" - local facet_proc_dirs=$(do_facet $facet \ - \\\ls -d $proc_regexp 2>/dev/null) - echo "${facet}_proc_dirs='$facet_proc_dirs'" - [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet" - do_facet $facet find $facet_proc_dirs \ - ! -name req_history \ - -exec cat '{}' \\\; &> /dev/null - - do_facet $facet find $facet_proc_dirs \ - ! -name req_history \ - -type f \ - -exec cat '{}' \\\; &> /dev/null || - error "proc file read failed" - - do_facet $facet find $facet_proc_dirs \ - -ignore_readdir_race \ - -type f \ - -not -name force_lbug \ - -not -name changelog_mask \ - -exec badarea_io '{}' \\\; || - error_133 "$facet find $facet_proc_dirs failed" + local facet_ver=$(lustre_version_code $facet) + if [ $facet_ver -ge $(version_code 2.7.65) ]; then + do_facet $facet "$LCTL get_param -R '*'" &> /dev/null + else + log "$facet: too old lustre for get_param -R" + fi + if [ $facet_ver -ge $(version_code 2.5.54) ]; then + do_facet $facet "$LCTL list_param -R '*' | grep '=' | + tr -d= | egrep -v 'force_lbug|changelog_mask' | + xargs badarea_io" || + error_133 "$facet badarea_io failed" + else + skip_noexit "$facet: too old lustre for get_param -R" + fi done # remount the FS in case writes/reads /proc break the FS @@ -12478,6 +12625,73 @@ test_134b() { } run_test 134b "Server rejects lock request when reaching lock_limit_mb" +test_135() { + remote_mds_nodsh && skip "remote MDS with nodsh" + [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] && + skip "Need MDS version at least 2.13.50" + local fname + + mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + +#define OBD_FAIL_PLAIN_RECORDS 0x1319 + #set only one record at plain llog + do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1319 fail_val=1 + + #fill already existed plain llog each 64767 + #wrapping whole catalog + createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1)) + + createmany -o $DIR/$tdir/$tfile_ 64700 + for (( i = 0; i < 64700; i = i + 2 )) + do + rm $DIR/$tdir/$tfile_$i & + rm $DIR/$tdir/$tfile_$((i + 1)) & + local pid=$! + wait $pid + done + + #waiting osp synchronization + wait_delete_completed +} +run_test 135 "Race catalog processing" + +test_136() { + remote_mds_nodsh && skip "remote MDS with nodsh" + [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] && + skip "Need MDS version at least 2.13.50" + local fname + + mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + $SETSTRIPE -c 1 -i 0 $DIR/$tdir || error "failed to set striping" + #set only one record at plain llog +#define OBD_FAIL_CATALOG_FULL_CHECK 0x131a + do_facet $SINGLEMDS $LCTL set_param fail_loc=0x131a fail_val=1 + + #fill already existed 2 plain llogs each 64767 + #wrapping whole catalog + createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1)) + createmany -o -u $DIR/$tdir/$tfile- $((64767 * 3 / 2)) + wait_delete_completed + + createmany -o $DIR/$tdir/$tfile_ 10 + sleep 25 + + do_facet $SINGLEMDS $LCTL set_param fail_val=3 + for (( i = 0; i < 10; i = i + 3 )) + do + rm $DIR/$tdir/$tfile_$i & + rm $DIR/$tdir/$tfile_$((i + 1)) & + local pid=$! + wait $pid + sleep 7 + rm $DIR/$tdir/$tfile_$((i + 2)) & + done + + #waiting osp synchronization + wait_delete_completed +} +run_test 136 "Race catalog processing 2" + test_140() { #bug-17379 [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -12651,8 +12865,9 @@ test_151() { error "NOT IN CACHE: before: $BEFORE, after: $AFTER" fi - # the following read invalidates the cache cancel_lru_locks osc + # invalidates OST cache + do_nodes $list "echo 1 > /proc/sys/vm/drop_caches" set_osd_param $list '' read_cache_enable 0 cat $DIR/$tfile >/dev/null @@ -13297,9 +13512,9 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == CPAGES"; then - error "NOT IN CACHE: before: $BEFORE, after: $AFTER" + error "NOT IN CACHE (2): before: $BEFORE, after: $AFTER" else - log "cache hits:: before: $BEFORE, after: $AFTER" + log "cache hits: before: $BEFORE, after: $AFTER" fi log "Read again; it should be satisfied from the cache." @@ -13308,7 +13523,7 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == CPAGES"; then - error "NOT IN CACHE: before: $BEFORE, after: $AFTER" + error "NOT IN CACHE (3): before: $BEFORE, after: $AFTER" else log "cache hits:: before: $BEFORE, after: $AFTER" fi @@ -13323,20 +13538,23 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == CPAGES"; then - error "NOT IN CACHE: before: $BEFORE, after: $AFTER" + error "NOT IN CACHE (4): before: $BEFORE, after: $AFTER" else log "cache hits:: before: $BEFORE, after: $AFTER" fi - log "Read again; it should not be satisfied from the cache." - BEFORE=$AFTER - cancel_lru_locks osc - cat $file >/dev/null - AFTER=$(roc_hit) - if ! let "AFTER - BEFORE == 0"; then - error "IN CACHE: before: $BEFORE, after: $AFTER" - else - log "cache hits:: before: $BEFORE, after: $AFTER" + if [ $OST1_VERSION -lt $(version_code 2.12.55) ]; then + # > 2.12.56 uses pagecache if cached + log "Read again; it should not be satisfied from the cache." + BEFORE=$AFTER + cancel_lru_locks osc + cat $file >/dev/null + AFTER=$(roc_hit) + if ! let "AFTER - BEFORE == 0"; then + error "IN CACHE (5): before: $BEFORE, after: $AFTER" + else + log "cache hits:: before: $BEFORE, after: $AFTER" + fi fi log "Write data and read it back." @@ -13347,20 +13565,23 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == CPAGES"; then - error "NOT IN CACHE: before: $BEFORE, after: $AFTER" + error "NOT IN CACHE (6): before: $BEFORE, after: $AFTER" else log "cache hits:: before: $BEFORE, after: $AFTER" fi - log "Read again; it should not be satisfied from the cache." - BEFORE=$AFTER - cancel_lru_locks osc - cat $file >/dev/null - AFTER=$(roc_hit) - if ! let "AFTER - BEFORE == 0"; then - error "IN CACHE: before: $BEFORE, after: $AFTER" - else - log "cache hits:: before: $BEFORE, after: $AFTER" + if [ $OST1_VERSION -lt $(version_code 2.12.55) ]; then + # > 2.12.56 uses pagecache if cached + log "Read again; it should not be satisfied from the cache." + BEFORE=$AFTER + cancel_lru_locks osc + cat $file >/dev/null + AFTER=$(roc_hit) + if ! let "AFTER - BEFORE == 0"; then + error "IN CACHE (7): before: $BEFORE, after: $AFTER" + else + log "cache hits:: before: $BEFORE, after: $AFTER" + fi fi log "Turn off read and write cache" @@ -13376,7 +13597,7 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == 0"; then - error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER" + error_ignore bz20762 "IN CACHE (8):before:$BEFORE,after:$AFTER" else log "cache hits:: before: $BEFORE, after: $AFTER" fi @@ -13394,7 +13615,7 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == 0"; then - error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER" + error_ignore bz20762 "IN CACHE (9):before:$BEFORE,after:$AFTER" else log "cache hits:: before: $BEFORE, after: $AFTER" fi @@ -13405,7 +13626,7 @@ test_156() { cat $file >/dev/null AFTER=$(roc_hit) if ! let "AFTER - BEFORE == CPAGES"; then - error "NOT IN CACHE: before: $BEFORE, after: $AFTER" + error "NOT IN CACHE (1): before: $BEFORE, after: $AFTER" else log "cache hits:: before: $BEFORE, after: $AFTER" fi @@ -13655,14 +13876,17 @@ test_160f() { # generate some changelog records to accumulate on each MDT test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed" + log "$(date +%s): creating first files" createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) || error "create $DIR/$tdir/$tfile failed" # check changelogs have been generated + local start=$SECONDS + local idle_time=$((MDSCOUNT * 5 + 5)) local nbcl=$(changelog_dump | wc -l) [[ $nbcl -eq 0 ]] && error "no changelogs found" - for param in "changelog_max_idle_time=10" \ + for param in "changelog_max_idle_time=$idle_time" \ "changelog_gc=1" \ "changelog_min_gc_interval=2" \ "changelog_min_free_cat_entries=3"; do @@ -13674,8 +13898,11 @@ test_160f() { do_nodes $mdts $LCTL set_param mdd.*.$param done - # force cl_user2 to be idle (1st part) - sleep 9 + # force cl_user2 to be idle (1st part), but also cancel the + # cl_user1 records so that it is not evicted later in the test. + local sleep1=$((idle_time / 2)) + echo "$(date +%s): sleep1 $sleep1/${idle_time}s" + sleep $sleep1 # simulate changelog catalog almost full #define OBD_FAIL_CAT_FREE_RECORDS 0x1313 @@ -13711,13 +13938,16 @@ test_160f() { "$user_rec1, but is $user_rec2" done - # force cl_user2 to be idle (2nd part) and to reach - # changelog_max_idle_time - sleep 2 + # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time + local sleep2=$((idle_time - (SECONDS - start) + 1)) + echo "$(date +%s): sleep2 $sleep2/${idle_time}s" + sleep $sleep2 - # generate one more changelog to trigger fail_loc - createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) || - error "create $DIR/$tdir/${tfile}bis failed" + # Generate one more changelog to trigger GC at fail_loc for cl_user2. + # cl_user1 should be OK because it recently processed records. + echo "$(date +%s): creating $((MDSCOUNT * 2)) files" + createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) || + error "create $DIR/$tdir/${tfile}b failed" # ensure gc thread is done for i in $(mdts_nodes); do @@ -15320,7 +15550,7 @@ jobstats_set() { "$FSNAME.sys.jobid_var" $new_jobenv } -test_205() { # Job stats +test_205a() { # Job stats [ $PARALLEL == "yes" ] && skip "skip parallel run" [[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] || skip "Need MDS version with at least 2.7.1" @@ -15422,7 +15652,18 @@ test_205() { # Job stats verify_jobstats "touch $DIR/$tfile" $SINGLEMDS } -run_test 205 "Verify job stats" +run_test 205a "Verify job stats" + +# LU-13117 +test_205b() { + $LCTL set_param jobid_var=USER jobid_name="%e.%u" + env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1 + do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats | + grep job_id: | grep foolish && + error "Unexpected jobid found" + true +} +run_test 205b "Verify job stats jobid parsing" # LU-1480, LU-1773 and LU-1657 test_206() { @@ -16863,6 +17104,61 @@ test_230l() { } run_test 230l "readdir between MDTs won't crash" +test_230m() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.11.56) ] && + skip "Need MDS version at least 2.11.56" + + local MDTIDX=1 + local mig_dir=$DIR/$tdir/migrate_dir + local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + local shortstr="b" + local val + + echo "Creating files and dirs with xattrs" + test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $mig_dir + mkdir $mig_dir/dir + setfattr -n user.attr1 -v $longstr $mig_dir/dir || + error "cannot set xattr attr1 on dir" + setfattr -n user.attr2 -v $shortstr $mig_dir/dir || + error "cannot set xattr attr2 on dir" + touch $mig_dir/dir/f0 + setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 || + error "cannot set xattr attr1 on file" + setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 || + error "cannot set xattr attr2 on file" + sync ; sync ; echo 3 > /proc/sys/vm/drop_caches + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null) + [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null) + [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir" + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $longstr ] || error "xattr attr1 not set properly on file" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file" + + echo "Migrating to MDT1" + $LFS migrate -m $MDTIDX $mig_dir || + error "fails on migrating dir to MDT1" + + sync ; sync ; echo 3 > /proc/sys/vm/drop_caches + echo "Checking xattrs" + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null) + [ "$val" = $longstr ] || + error "expecting xattr1 $longstr on dir, found $val" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null) + [ "$val" = $shortstr ] || + error "expecting xattr2 $shortstr on dir, found $val" + val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $longstr ] || + error "expecting xattr1 $longstr on file, found $val" + val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null) + [ "$val" = $shortstr ] || + error "expecting xattr2 $shortstr on file, found $val" +} +run_test 230m "xattrs not changed after dir migration" + test_231a() { # For simplicity this test assumes that max_pages_per_rpc @@ -17267,21 +17563,6 @@ test_245() { } run_test 245 "check mdc connection flag/data: multiple modify RPCs" -test_246() { # LU-7371 - remote_ost_nodsh && skip "remote OST with nodsh" - [ $OST1_VERSION -lt $(version_code 2.7.62) ] && - skip "Need OST version >= 2.7.62" - - do_facet ost1 $LCTL set_param fail_val=4095 -#define OBD_FAIL_OST_READ_SIZE 0x234 - do_facet ost1 $LCTL set_param fail_loc=0x234 - $LFS setstripe $DIR/$tfile -i 0 -c 1 - dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1 - cancel_lru_locks $FSNAME-OST0000 - dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed" -} -run_test 246 "Read file of size 4095 should return right length" - cleanup_247() { local submount=$1 @@ -17374,7 +17655,7 @@ test_247e() { } run_test 247e "mount .. as fileset" -test_248() { +test_248a() { local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null) [ -z "$fast_read_sav" ] && skip "no fast read support" @@ -17425,7 +17706,89 @@ test_248() { $LCTL set_param -n llite.*.fast_read=$fast_read_sav rm -f $DIR/$tfile } -run_test 248 "fast read verification" +run_test 248a "fast read verification" + +test_248b() { + # Default short_io_bytes=16384, try both smaller and larger sizes. + # Lustre O_DIRECT read and write needs to be a multiple of PAGE_SIZE. + # 6017024 = 2^12*13*113 = 47008*128 = 11752*512 = 4096*1469 = 53248*113 + echo "bs=53248 count=113 normal buffered write" + dd if=/dev/urandom of=$TMP/$tfile.0 bs=53248 count=113 || + error "dd of initial data file failed" + stack_trap "rm -f $DIR/$tfile.[0-3] $TMP/$tfile.[0-3]" EXIT + + echo "bs=47008 count=128 oflag=dsync normal write $tfile.0" + dd if=$TMP/$tfile.0 of=$DIR/$tfile.0 bs=47008 count=128 oflag=dsync || + error "dd with sync normal writes failed" + cmp $TMP/$tfile.0 $DIR/$tfile.0 || error "compare $DIR/$tfile.0 failed" + + echo "bs=11752 count=512 oflag=dsync small write $tfile.1" + dd if=$TMP/$tfile.0 of=$DIR/$tfile.1 bs=11752 count=512 oflag=dsync || + error "dd with sync small writes failed" + cmp $TMP/$tfile.0 $DIR/$tfile.1 || error "compare $DIR/$tfile.1 failed" + + cancel_lru_locks osc + + # calculate the small O_DIRECT size and count for the client PAGE_SIZE + local num=$((13 * 113 / (PAGE_SIZE / 4096))) + echo "bs=$PAGE_SIZE count=$num iflag=direct small read $tfile.1" + dd if=$DIR/$tfile.1 of=$TMP/$tfile.1 bs=$PAGE_SIZE count=$num \ + iflag=direct || error "dd with O_DIRECT small read failed" + # adjust bytes checked to handle larger PAGE_SIZE for ARM/PPC + cmp --bytes=$((PAGE_SIZE * num)) $TMP/$tfile.0 $TMP/$tfile.1 || + error "compare $TMP/$tfile.1 failed" + + local save=$($LCTL get_param -n osc.*OST000*.short_io_bytes | head -n 1) + stack_trap "$LCTL set_param osc.$FSNAME-*.short_io_bytes=$save" EXIT + + # just to see what the maximum tunable value is, and test parsing + echo "test invalid parameter 2MB" + $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=2M && + error "too-large short_io_bytes allowed" + echo "test maximum parameter 512KB" + # if we can set a larger short_io_bytes, run test regardless of version + if ! $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=512K; then + # older clients may not allow setting it this large, that's OK + [ $CLIENT_VERSION -ge $(version_code 2.13.50) ] || + skip "Need at least client version 2.13.50" + error "medium short_io_bytes failed" + fi + $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes + size=$($LCTL get_param -n osc.$FSNAME-OST0000*.short_io_bytes) + + echo "test large parameter 64KB" + $LCTL set_param osc.$FSNAME-*.short_io_bytes=65536 + $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes + + echo "bs=47008 count=128 oflag=dsync large write $tfile.2" + dd if=$TMP/$tfile.0 of=$DIR/$tfile.2 bs=47008 count=128 oflag=dsync || + error "dd with sync large writes failed" + cmp $TMP/$tfile.0 $DIR/$tfile.2 || error "compare $DIR/$tfile.2 failed" + + # calculate the large O_DIRECT size and count for the client PAGE_SIZE + local size=$(((4096 * 13 + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE)) + num=$((113 * 4096 / PAGE_SIZE)) + echo "bs=$size count=$num oflag=direct large write $tfile.3" + dd if=$TMP/$tfile.0 of=$DIR/$tfile.3 bs=$size count=$num oflag=direct || + error "dd with O_DIRECT large writes failed" + cmp --bytes=$((size * num)) $TMP/$tfile.0 $DIR/$tfile.3 || + error "compare $DIR/$tfile.3 failed" + + cancel_lru_locks osc + + echo "bs=$size count=$num iflag=direct large read $tfile.2" + dd if=$DIR/$tfile.2 of=$TMP/$tfile.2 bs=$size count=$num iflag=direct || + error "dd with O_DIRECT large read failed" + cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.2 || + error "compare $TMP/$tfile.2 failed" + + echo "bs=$size count=$num iflag=direct large read $tfile.3" + dd if=$DIR/$tfile.3 of=$TMP/$tfile.3 bs=$size count=$num iflag=direct || + error "dd with O_DIRECT large read failed" + cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.3 || + error "compare $TMP/$tfile.3 failed" +} +run_test 248b "test short_io read and write for both small and large sizes" test_249() { # LU-7890 [ $MDS1_VERSION -lt $(version_code 2.8.53) ] && @@ -18723,7 +19086,7 @@ test_272a() { error "md5sum differ: $old_md5, $new_md5" [ $($LFS getstripe -c $dom) -eq 2 ] || - error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2" + error "bad final stripe count: $($LFS getstripe -c $dom) != 2" } run_test 272a "DoM migration: new layout with the same DOM component" @@ -19513,8 +19876,9 @@ test_300k() { # this test needs a huge transaction local kb - kb=$(do_facet $SINGLEMDS lctl get_param -n osd*.lustre-MDT0000.kbytestotal) - [ $kb -lt $((1024*1024)) ] && skip "too small mds: $kb" + kb=$(do_facet $SINGLEMDS "$LCTL get_param -n \ + osd*.$FSNAME-MDT0000.kbytestotal") + [ $kb -lt $((1024*1024)) ] && skip "MDT0 too small: $kb" local stripe_count local file @@ -20196,7 +20560,7 @@ test_fake_rw() { $LFS setstripe -c 1 -i 0 $DIR/$tfile - # get ost1 size - lustre-OST0000 + # get ost1 size - $FSNAME-OST0000 local ost1_avail_size=$($LFS df | awk /${ost1_svc}/'{ print $4 }') local blocks=$((ost1_avail_size/2/1024)) # half avail space by megabytes [ $blocks -gt 1000 ] && blocks=1000 # 1G in maximum @@ -20709,87 +21073,86 @@ test_412() { } run_test 412 "mkdir on specific MDTs" -test_413a() { - [ $MDSCOUNT -lt 2 ] && - skip "We need at least 2 MDTs for this test" - - if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then - skip "Need server version at least 2.10.55" - fi - - mkdir $DIR/$tdir || error "mkdir failed" - - # find MDT that is the most full - local max=$($LFS df | grep MDT | - awk 'BEGIN { a=0 } - { sub("%", "", $5) - if (0+$5 >= a) - { - a = $5 - b = $6 - } - } - END { split(b, c, ":") - sub("]", "", c[2]) - print c[2] - }') - - for i in $(seq $((MDSCOUNT - 1))); do - $LFS mkdir -c $i $DIR/$tdir/d$i || - error "mkdir d$i failed" - $LFS getdirstripe $DIR/$tdir/d$i - local stripe_index=$($LFS getdirstripe -i $DIR/$tdir/d$i) - [ $stripe_index -ne $max ] || - error "don't expect $max" - done -} -run_test 413a "mkdir on less full MDTs" - -test_413b() { - [ $MDSCOUNT -lt 2 ] && - skip "We need at least 2 MDTs for this test" - - [ $MDS1_VERSION -lt $(version_code 2.12.52) ] && - skip "Need server version at least 2.12.52" - - mkdir $DIR/$tdir || error "mkdir failed" - $LFS setdirstripe -D -i -1 -H space $DIR/$tdir || - error "setdirstripe failed" +test_qos_mkdir() { + local mkdir_cmd=$1 + local stripe_count=$2 + local mdts=$(comma_list $(mdts_nodes)) - local qos_prio_free - local qos_threshold_rr + local testdir + local lmv_qos_prio_free + local lmv_qos_threshold_rr + local lmv_qos_maxage + local lod_qos_prio_free + local lod_qos_threshold_rr + local lod_qos_maxage local count + local i - qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1) - qos_prio_free=${qos_prio_free%%%} - qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr | head -n1) - qos_threshold_rr=${qos_threshold_rr%%%} - qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage) - - stack_trap "$LCTL set_param lmv.*.qos_prio_free=$qos_prio_free" EXIT - stack_trap "$LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr" \ + lmv_qos_prio_free=$($LCTL get_param -n lmv.*.qos_prio_free | head -n1) + lmv_qos_prio_free=${lmv_qos_prio_free%%%} + lmv_qos_threshold_rr=$($LCTL get_param -n lmv.*.qos_threshold_rr | + head -n1) + lmv_qos_threshold_rr=${lmv_qos_threshold_rr%%%} + lmv_qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage) + stack_trap "$LCTL set_param \ + lmv.*.qos_prio_free=$lmv_qos_prio_free > /dev/null" EXIT + stack_trap "$LCTL set_param \ + lmv.*.qos_threshold_rr=$lmv_qos_threshold_rr > /dev/null" EXIT + stack_trap "$LCTL set_param \ + lmv.*.qos_maxage=$lmv_qos_maxage > /dev/null" EXIT + + lod_qos_prio_free=$(do_facet mds1 $LCTL get_param -n \ + lod.$FSNAME-MDT0000-mdtlov.mdt_qos_prio_free | head -n1) + lod_qos_prio_free=${lod_qos_prio_free%%%} + lod_qos_threshold_rr=$(do_facet mds1 $LCTL get_param -n \ + lod.$FSNAME-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1) + lod_qos_threshold_rr=${lod_qos_threshold_rr%%%} + lod_qos_maxage=$(do_facet mds1 $LCTL get_param -n \ + lod.$FSNAME-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }') + stack_trap "do_nodes $mdts $LCTL set_param \ + lod.*.mdt_qos_prio_free=$lod_qos_prio_free > /dev/null" EXIT + stack_trap "do_nodes $mdts $LCTL set_param \ + lod.*.mdt_qos_threshold_rr=$lod_qos_threshold_rr > /dev/null" \ EXIT - stack_trap "$LCTL set_param lmv.*.qos_maxage=$qos_maxage" EXIT + stack_trap "do_nodes $mdts $LCTL set_param \ + lod.*.mdt_qos_maxage=$lod_qos_maxage > /dev/null" EXIT + + echo + echo "Mkdir (stripe_count $stripe_count) roundrobin:" + + $LCTL set_param lmv.*.qos_threshold_rr=100 > /dev/null + do_nodes $mdts $LCTL set_param lod.*.mdt_qos_threshold_rr=100 > /dev/null - echo "mkdir with roundrobin" + testdir=$DIR/$tdir-s$stripe_count/rr - $LCTL set_param lmv.*.qos_threshold_rr=100 for i in $(seq $((100 * MDSCOUNT))); do - mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed" + eval $mkdir_cmd $testdir/subdir$i || + error "$mkdir_cmd subdir$i failed" done + for i in $(seq $MDSCOUNT); do - count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ | - wc -w) + count=$($LFS getdirstripe -i $testdir/* | + grep ^$((i - 1))$ | wc -l) echo "$count directories created on MDT$((i - 1))" [ $count -eq 100 ] || error "subdirs are not evenly distributed" + + if [ $stripe_count -gt 1 ]; then + count=$($LFS getdirstripe $testdir/* | + grep -P "^\s+$((i - 1))\t" | wc -l) + echo "$count stripes created on MDT$((i - 1))" + # deviation should < 5% of average + [ $count -lt $((95 * stripe_count)) ] || + [ $count -gt $((105 * stripe_count)) ] && + error "stripes are not evenly distributed" + fi done - rm -rf $DIR/$tdir/* + $LCTL set_param lmv.*.qos_threshold_rr=$lmv_qos_threshold_rr > /dev/null + do_nodes $mdts $LCTL set_param \ + lod.*.mdt_qos_threshold_rr=$lod_qos_threshold_rr > /dev/null - $LCTL set_param lmv.*.qos_threshold_rr=$qos_threshold_rr - # Shorten statfs result age, so that it can be updated in time - $LCTL set_param lmv.*.qos_maxage=1 - sleep_maxage + echo + echo "Check for uneven MDTs: " local ffree local bavail @@ -20826,9 +21189,8 @@ test_413b() { # Check if we need to generate uneven MDTs local threshold=50 - local diff=$(((max - min ) * 100 / min)) + local diff=$(((max - min) * 100 / min)) local value="$(generate_string 1024)" - local i while [ $diff -lt $threshold ]; do # generate uneven MDTs, create till $threshold% diff @@ -20843,11 +21205,11 @@ test_413b() { error "mkdir $tdir-MDT$min_index failed" for i in $(seq $count); do $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \ - $DIR/$tdir-MDT$min_index/f$i > /dev/null || - error "create f$i failed" + $DIR/$tdir-MDT$min_index/f$j_$i > /dev/null || + error "create f$j_$i failed" setfattr -n user.413b -v $value \ - $DIR/$tdir-MDT$min_index/f$i || - error "setfattr f$i failed" + $DIR/$tdir-MDT$min_index/f$j_$i || + error "setfattr f$j_$i failed" done ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-*.filesfree)) @@ -20863,31 +21225,95 @@ test_413b() { echo "MDT blocks available: ${bavail[@]}" echo "weight diff=$diff%" - echo "mkdir with balanced space usage" - $LCTL set_param lmv.*.qos_prio_free=100 + echo + echo "Mkdir (stripe_count $stripe_count) with balanced space usage:" + + $LCTL set_param lmv.*.qos_prio_free=100 > /dev/null + do_nodes $mdts $LCTL set_param lod.*.mdt_qos_prio_free=100 > /dev/null + # decrease statfs age, so that it can be updated in time + $LCTL set_param lmv.*.qos_maxage=1 > /dev/null + do_nodes $mdts $LCTL set_param lod.*.mdt_qos_maxage=1 > /dev/null + + sleep 1 + + testdir=$DIR/$tdir-s$stripe_count/qos + for i in $(seq $((100 * MDSCOUNT))); do - mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed" + eval $mkdir_cmd $testdir/subdir$i || + error "$mkdir_cmd subdir$i failed" done for i in $(seq $MDSCOUNT); do - count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ | - wc -w) + count=$($LFS getdirstripe -i $testdir/* | grep ^$((i - 1))$ | + wc -l) echo "$count directories created on MDT$((i - 1))" + + if [ $stripe_count -gt 1 ]; then + count=$($LFS getdirstripe $testdir/* | + grep -P "^\s+$((i - 1))\t" | wc -l) + echo "$count stripes created on MDT$((i - 1))" + fi done - max=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$max_index$ | wc -l) - min=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$min_index$ | wc -l) + max=$($LFS getdirstripe -i $testdir/* | grep ^$max_index$ | wc -l) + min=$($LFS getdirstripe -i $testdir/* | grep ^$min_index$ | wc -l) + # D-value should > 10% of averge [ $((max - min)) -lt 10 ] && error "subdirs shouldn't be evenly distributed" - which getfattr > /dev/null 2>&1 || skip_env "no getfattr command" + # ditto + if [ $stripe_count -gt 1 ]; then + max=$($LFS getdirstripe $testdir/* | + grep -P "^\s+$max_index\t" | wc -l) + min=$($LFS getdirstripe $testdir/* | + grep -P "^\s+$min_index\t" | wc -l) + [ $((max - min)) -le $((10 * stripe_count)) ] && + error "stripes shouldn't be evenly distributed"|| true + fi +} - $LFS setdirstripe -D -d $DIR/$tdir || error "setdirstripe -d failed" - getfattr -n trusted.dmv $DIR/$tdir && - error "default dir layout exists" || true +test_413a() { + [ $MDSCOUNT -lt 2 ] && + skip "We need at least 2 MDTs for this test" + + [ $MDS1_VERSION -lt $(version_code 2.12.52) ] && + skip "Need server version at least 2.12.52" + + local stripe_count + + for stripe_count in $(seq 1 $((MDSCOUNT - 1))); do + mkdir $DIR/$tdir-s$stripe_count || error "mkdir failed" + mkdir $DIR/$tdir-s$stripe_count/rr || error "mkdir failed" + mkdir $DIR/$tdir-s$stripe_count/qos || error "mkdir failed" + test_qos_mkdir "$LFS mkdir -c $stripe_count" $stripe_count + done } -run_test 413b "mkdir with balanced space usage" +run_test 413a "QoS mkdir with 'lfs mkdir -i -1'" + +test_413b() { + [ $MDSCOUNT -lt 2 ] && + skip "We need at least 2 MDTs for this test" + + [ $MDS1_VERSION -lt $(version_code 2.12.52) ] && + skip "Need server version at least 2.12.52" + + local stripe_count + + for stripe_count in $(seq 1 $((MDSCOUNT - 1))); do + mkdir $DIR/$tdir-s$stripe_count || error "mkdir failed" + mkdir $DIR/$tdir-s$stripe_count/rr || error "mkdir failed" + mkdir $DIR/$tdir-s$stripe_count/qos || error "mkdir failed" + $LFS setdirstripe -D -c $stripe_count \ + $DIR/$tdir-s$stripe_count/rr || + error "setdirstripe failed" + $LFS setdirstripe -D -c $stripe_count \ + $DIR/$tdir-s$stripe_count/qos || + error "setdirstripe failed" + test_qos_mkdir "mkdir" $stripe_count + done +} +run_test 413b "QoS mkdir under dir whose default LMV starting MDT offset is -1" test_414() { #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521 @@ -21351,6 +21777,50 @@ test_421g() { } run_test 421g "rmfid to return errors properly" +test_422() { + test_mkdir -i 0 -c 1 -p $DIR/$tdir/d1 + test_mkdir -i 0 -c 1 -p $DIR/$tdir/d2 + test_mkdir -i 0 -c 1 -p $DIR/$tdir/d3 + dd if=/dev/zero of=$DIR/$tdir/d1/file1 bs=1k count=1 + dd if=/dev/zero of=$DIR/$tdir/d2/file1 bs=1k count=1 + + local amc=$(at_max_get client) + local amo=$(at_max_get mds1) + local timeout=`lctl get_param -n timeout` + + at_max_set 0 client + at_max_set 0 mds1 + +#define OBD_FAIL_PTLRPC_PAUSE_REQ 0x50a + do_facet mds1 $LCTL set_param fail_loc=0x8000050a \ + fail_val=$(((2*timeout + 10)*1000)) + touch $DIR/$tdir/d3/file & + sleep 2 +#define OBD_FAIL_TGT_REPLY_DATA_RACE 0x722 + do_facet mds1 $LCTL set_param fail_loc=0x80000722 \ + fail_val=$((2*timeout + 5)) + mv $DIR/$tdir/d1/file1 $DIR/$tdir/d1/file2 & + local pid=$! + sleep 1 + kill -9 $pid + sleep $((2 * timeout)) + echo kill $pid + kill -9 $pid + lctl mark touch + touch $DIR/$tdir/d2/file3 + touch $DIR/$tdir/d2/file4 + touch $DIR/$tdir/d2/file5 + + wait + at_max_set $amc client + at_max_set $amo mds1 + + # LU-12838 - verify the ptlrpc thread watchdog is not always throttled + do_facet mds1 "dmesg | grep 'Dumping the stack trace for debugging'" || + error "Watchdog is always throttled" +} +run_test 422 "kill a process with RPC in progress" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -21798,7 +22268,7 @@ cleanup_805() { } test_805() { - local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version) + local zfs_version=$(do_facet mds1 cat /sys/module/zfs/version) [ "$mds1_FSTYPE" != "zfs" ] && skip "ZFS specific test" [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] && skip "netfree not implemented before 0.7" @@ -21810,7 +22280,7 @@ test_805() { local usedkb local old local quota - local pref="osd-zfs.lustre-MDT0000." + local pref="osd-zfs.$FSNAME-MDT0000." # limit available space on MDS dataset to meet nospace issue # quickly. then ZFS 0.7.2 can use reserved space if asked @@ -22075,6 +22545,8 @@ run_test 809 "Verify no SOM xattr store for DoM-only files" test_810() { [ $PARALLEL == "yes" ] && skip "skip parallel run" $GSS && skip_env "could not run with gss" + [[ $OST1_VERSION -gt $(version_code 2.12.58) ]] || + skip "OST < 2.12.58 doesn't align checksum" set_checksums 1 stack_trap "set_checksums $ORIG_CSUM" EXIT @@ -22116,7 +22588,7 @@ test_811() { } run_test 811 "orphan name stub can be cleaned up in startup" -test_812() { +test_812a() { [ $OST1_VERSION -lt $(version_code 2.12.51) ] && skip "OST < 2.12.51 doesn't support this fail_loc" [ "$SHARED_KEY" = true ] && @@ -22137,7 +22609,31 @@ test_812() { stat $DIR/$tfile >/dev/null || error "can't stat file" } -run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)" +run_test 812a "do not drop reqs generated when imp is going to idle (LU-11951)" + +test_812b() { # LU-12378 + [ $OST1_VERSION -lt $(version_code 2.12.51) ] && + skip "OST < 2.12.51 doesn't support this fail_loc" + [ "$SHARED_KEY" = true ] && + skip "OSC connections never go IDLE with Shared-Keys enabled" + + $LFS setstripe -c 1 -i 0 $DIR/$tfile || error "setstripe failed" + # ensure ost1 is connected + stat $DIR/$tfile >/dev/null || error "can't stat" + wait_osc_import_state client ost1 FULL + # no locks, no reqs to let the connection idle + cancel_lru_locks osc + + # delay OST_DISCONNECT on OST1 to put OSC into intermediate state +#define OBD_FAIL_OST_DISCONNECT_DELAY 0x245 + do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8" + wait_osc_import_state client ost1 CONNECTING + do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0" + + $LFS quota -u 0 $DIR/ || error "lfs quota should succeed" + wait_osc_import_state client ost1 IDLE +} +run_test 812b "do not drop no resend request for idle connect" test_813() { local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null) @@ -22425,6 +22921,31 @@ test_900() { } run_test 900 "umount should not race with any mgc requeue thread" +# LUS-6253/LU-11185 +test_901() { + local oldc + local newc + local olds + local news + [ $PARALLEL == "yes" ] && skip "skip parallel run" + + # some get_param have a bug to handle dot in param name + cancel_lru_locks MGC + oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count') + olds=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count') + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + cancel_lru_locks MGC + newc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count') + news=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count') + + [ $oldc -lt $newc ] && error "mgc lock leak ($oldc != $newc)" + [ $olds -lt $news ] && error "mgs lock leak ($olds != $news)" + + return 0 +} +run_test 901 "don't leak a mgc lock on client umount" + complete $SECONDS [ -f $EXT2_DEV ] && rm $EXT2_DEV || true check_and_cleanup_lustre