X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=dc731af9fe2322e53b2c6296b5cf99e1bb9cd0d9;hp=cd00e6939db71ac56921d9a72d0ce526419d089c;hb=cd4caef54f63b6a0d26a90d879f378b7fe3d4862;hpb=5e7e9240d27a4b74127ea7a26d910ae41a6e1cb1 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index cd00e69..dc731af 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -3319,6 +3319,37 @@ test_27P() { } run_test 27P "basic ops on foreign dir of foreign_symlink type" +test_27Q() { + rm -f $TMP/$tfile $TMP/$tfile.loop $TMP/$tfile.none $TMP/$tfile.broken + + test_mkdir $DIR/$tdir-1 + test_mkdir $DIR/$tdir-2 + + echo 'It is what it is' > $DIR/$tdir-1/$tfile + lov_getstripe_old $DIR/$tdir-1/$tfile || error "$DIR/$tdir-1/$tfile: rc = $?" + + ln -s $DIR/$tdir-1/$tfile $DIR/$tdir-2/$tfile + lov_getstripe_old $DIR/$tdir-2/$tfile || error "$DIR/$tdir-2/$tfile: rc = $?" + + ln -s $DIR/$tdir-1/$tfile $TMP/$tfile + lov_getstripe_old $TMP/$tfile || error "$TMP/$tfile: rc = $?" + + # Create some bad symlinks and ensure that we don't loop + # forever or something. These should return ELOOP (40) and + # ENOENT (2) but I don't want to test for that because there's + # always some weirdo architecture that needs to ruin + # everything by defining these error numbers differently. + + ln -s $TMP/$tfile.loop $TMP/$tfile.loop + lov_getstripe_old $TMP/$tfile.loop && error "$TMP/$tfile.loop: rc = $?" + + ln -s $TMP/$tfile.none $TMP/$tfile.broken + lov_getstripe_old $TMP/$tfile.broken && error "$TMP/$tfile.broken: rc = $?" + + return 0 +} +run_test 27Q "llapi_file_get_stripe() works on symlinks" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -10900,6 +10931,106 @@ test_104b() { } run_test 104b "$RUNAS lfs check servers test ====================" +# +# Verify $1 is within range of $2. +# Success when $1 is within range. That is, when $1 is >= 2% of $2 and +# $1 is <= 2% of $2. Else Fail. +# +value_in_range() { + # Strip all units (M, G, T) + actual=$(echo $1 | tr -d A-Z) + expect=$(echo $2 | tr -d A-Z) + + expect_lo=$(($expect * 98 / 100)) # 2% below + expect_hi=$(($expect * 102 / 100)) # 2% above + + # permit 2% drift above and below + (( $actual >= $expect_lo && $actual <= $expect_hi )) +} + +test_104c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + [ "$ost1_FSTYPE" == "zfs" ] || skip "zfs only test" + + local ost_param="osd-zfs.$FSNAME-OST0000." + local mdt_param="osd-zfs.$FSNAME-MDT0000." + local ofacets=$(get_facets OST) + local mfacets=$(get_facets MDS) + local saved_ost_blocks= + local saved_mdt_blocks= + + echo "Before recordsize change" + lfs_df=($($LFS df -h | grep "filesystem_summary:")) + df=($(df -h | grep "/mnt/lustre"$)) + + # For checking. + echo "lfs output : ${lfs_df[*]}" + echo "df output : ${df[*]}" + + for facet in ${ofacets//,/ }; do + if [ -z $saved_ost_blocks ]; then + saved_ost_blocks=$(do_facet $facet \ + lctl get_param -n $ost_param.blocksize) + echo "OST Blocksize: $saved_ost_blocks" + fi + ost=$(do_facet $facet lctl get_param -n $ost_param.mntdev) + do_facet $facet zfs set recordsize=32768 $ost + done + + # BS too small. Sufficient for functional testing. + for facet in ${mfacets//,/ }; do + if [ -z $saved_mdt_blocks ]; then + saved_mdt_blocks=$(do_facet $facet \ + lctl get_param -n $mdt_param.blocksize) + echo "MDT Blocksize: $saved_mdt_blocks" + fi + mdt=$(do_facet $facet lctl get_param -n $mdt_param.mntdev) + do_facet $facet zfs set recordsize=32768 $mdt + done + + # Give new values chance to reflect change + sleep 2 + + echo "After recordsize change" + lfs_df_after=($($LFS df -h | grep "filesystem_summary:")) + df_after=($(df -h | grep "/mnt/lustre"$)) + + # For checking. + echo "lfs output : ${lfs_df_after[*]}" + echo "df output : ${df_after[*]}" + + # Verify lfs df + value_in_range ${lfs_df_after[1]%.*} ${lfs_df[1]%.*} || + error "lfs_df bytes: ${lfs_df_after[1]%.*} != ${lfs_df[1]%.*}" + value_in_range ${lfs_df_after[2]%.*} ${lfs_df[2]%.*} || + error "lfs_df used: ${lfs_df_after[2]%.*} != ${lfs_df[2]%.*}" + value_in_range ${lfs_df_after[3]%.*} ${lfs_df[3]%.*} || + error "lfs_df avail: ${lfs_df_after[3]%.*} != ${lfs_df[3]%.*}" + + # Verify df + value_in_range ${df_after[1]%.*} ${df[1]%.*} || + error "df bytes: ${df_after[1]%.*} != ${df[1]%.*}" + value_in_range ${df_after[2]%.*} ${df[2]%.*} || + error "df used: ${df_after[2]%.*} != ${df[2]%.*}" + value_in_range ${df_after[3]%.*} ${df[3]%.*} || + error "df avail: ${df_after[3]%.*} != ${df[3]%.*}" + + # Restore MDT recordize back to original + for facet in ${mfacets//,/ }; do + mdt=$(do_facet $facet lctl get_param -n $mdt_param.mntdev) + do_facet $facet zfs set recordsize=$saved_mdt_blocks $mdt + done + + # Restore OST recordize back to original + for facet in ${ofacets//,/ }; do + ost=$(do_facet $facet lctl get_param -n $ost_param.mntdev) + do_facet $facet zfs set recordsize=$saved_ost_blocks $ost + done + + return 0 +} +run_test 104c "Verify df vs lfs_df stays same after recordsize change" + test_105a() { # doesn't work on 2.4 kernels touch $DIR/$tfile @@ -23755,14 +23886,26 @@ test_qos_mkdir() { 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 testdir=$DIR/$tdir-s$stripe_count/rr + local stripe_index=$($LFS getstripe -m $testdir) + local test_mkdir_rr=true + + getfattr -d -m dmv $testdir | grep dmv + if [ $? -eq 0 ] && [ $MDS1_VERSION -ge $(version_code 2.14.51) ]; then + local inherit_rr=$($LFS getdirstripe -D --max-inherit-rr $testdir) + + (( $inherit_rr == 0 )) && test_mkdir_rr=false + fi + + echo + $test_mkdir_rr && + echo "Mkdir (stripe_count $stripe_count) roundrobin:" || + echo "Mkdir (stripe_count $stripe_count) on stripe $stripe_index" + for i in $(seq $((100 * MDSCOUNT))); do eval $mkdir_cmd $testdir/subdir$i || error "$mkdir_cmd subdir$i failed" @@ -23772,15 +23915,24 @@ test_qos_mkdir() { 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 $test_mkdir_rr; then + (( $count == 100 )) || + error "subdirs are not evenly distributed" + elif [ $((i - 1)) -eq $stripe_index ]; then + (( $count == 100 * MDSCOUNT )) || + error "$count subdirs created on MDT$((i - 1))" + else + (( $count == 0 )) || + error "$count subdirs created on MDT$((i - 1))" + fi - if [ $stripe_count -gt 1 ]; then + if $test_mkdir_rr && [ $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)) ] && + (( $count < 95 * stripe_count )) || + (( $count > 105 * stripe_count)) && error "stripes are not evenly distributed" fi done @@ -23820,10 +23972,10 @@ test_qos_mkdir() { fi done - [ ${ffree[min_index]} -eq 0 ] && + (( ${ffree[min_index]} == 0 )) && skip "no free files in MDT$min_index" - [ ${ffree[min_index]} -gt 100000000 ] && - skip "too much free files in MDT$min_index" + (( ${ffree[min_index]} > 100000000 )) && + skip "too many free files in MDT$min_index" # Check if we need to generate uneven MDTs local threshold=50 @@ -23835,20 +23987,14 @@ test_qos_mkdir() { echo -n "weight diff=$diff% must be > $threshold% ..." count=$((${ffree[min_index]} / 10)) # 50 sec per 10000 files in vm - [ $count -gt 40000 ] && [ "$SLOW" = "no" ] && + (( $count < 100000 )) || [ "$SLOW" != "no" ] || skip "$count files to create" echo "Fill MDT$min_index with $count files" [ -d $DIR/$tdir-MDT$min_index ] || $LFS mkdir -i $min_index $DIR/$tdir-MDT$min_index || 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$j_$i > /dev/null || - error "create f$j_$i failed" - setfattr -n user.413b -v $value \ - $DIR/$tdir-MDT$min_index/f$j_$i || - error "setfattr f$j_$i failed" - done + createmany -d $DIR/$tdir-MDT$min_index/d $count || + error "create d$count failed" ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-*.filesfree)) bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-*.kbytesavail)) @@ -23897,7 +24043,7 @@ test_qos_mkdir() { min=$($LFS getdirstripe -i $testdir/* | grep ^$min_index$ | wc -l) # D-value should > 10% of averge - [ $((max - min)) -lt 10 ] && + (( $max - $min < 10 )) && error "subdirs shouldn't be evenly distributed" # ditto @@ -23906,7 +24052,7 @@ test_qos_mkdir() { 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)) ] && + (( $max - $min < 10 * $stripe_count )) && error "stripes shouldn't be evenly distributed"|| true fi } @@ -23936,23 +24082,64 @@ test_413b() { [ $MDS1_VERSION -lt $(version_code 2.12.52) ] && skip "Need server version at least 2.12.52" + local testdir 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 || + testdir=$DIR/$tdir-s$stripe_count + mkdir $testdir || error "mkdir $testdir failed" + mkdir $testdir/rr || error "mkdir rr failed" + mkdir $testdir/qos || error "mkdir qos failed" + $LFS setdirstripe -D -c $stripe_count --max-inherit-rr 2 \ + $testdir/rr || error "setdirstripe rr failed" + $LFS setdirstripe -D -c $stripe_count $testdir/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_413c() { + [ $MDSCOUNT -ge 2 ] || + skip "We need at least 2 MDTs for this test" + + [ $MDS1_VERSION -ge $(version_code 2.14.51) ] || + skip "Need server version at least 2.14.50" + + local testdir + local inherit + local inherit_rr + + testdir=$DIR/${tdir}-s1 + mkdir $testdir || error "mkdir $testdir failed" + mkdir $testdir/rr || error "mkdir rr failed" + mkdir $testdir/qos || error "mkdir qos failed" + # default max_inherit is -1, default max_inherit_rr is 0 + $LFS setdirstripe -D -c 1 $testdir/rr || + error "setdirstripe rr failed" + $LFS setdirstripe -D -c 1 -X 2 --max-inherit-rr 1 $testdir/qos || + error "setdirstripe qos failed" + test_qos_mkdir "mkdir" 1 + + mkdir $testdir/rr/level1 || error "mkdir rr/level1 failed" + inherit=$($LFS getdirstripe -D -X $testdir/rr/level1) + (( $inherit == -1 )) || error "rr/level1 inherit $inherit != -1" + inherit_rr=$($LFS getdirstripe -D --max-inherit-rr $testdir/rr/level1) + (( $inherit_rr == 0 )) || + error "rr/level1 inherit-rr $inherit_rr != 0" + + mkdir $testdir/qos/level1 || error "mkdir qos/level1 failed" + inherit=$($LFS getdirstripe -D -X $testdir/qos/level1) + (( $inherit == 1 )) || error "qos/level1 inherit $inherit != 1" + inherit_rr=$($LFS getdirstripe -D --max-inherit-rr $testdir/qos/level1) + (( $inherit_rr == 0 )) || + error "qos/level1 inherit-rr $inherit_rr !=0" + mkdir $testdir/qos/level1/level2 || error "mkdir level2 failed" + getfattr -d -m dmv $testdir/qos/level1/level2 | grep dmv && + error "level2 shouldn't have default LMV" || true +} +run_test 413c "mkdir with default LMV max inherit rr" + test_414() { #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521 $LCTL set_param fail_loc=0x80000521 @@ -24587,6 +24774,52 @@ test_428() { } run_test 428 "large block size IO should not hang" +test_429() { # LU-7915 / LU-10948 + local ll_opencache_threshold_count="llite.*.opencache_threshold_count" + local testfile=$DIR/$tfile + local mdc_rpcstats="mdc.$FSNAME-MDT0000-*.stats" + local new_flag=1 + local first_rpc + local second_rpc + local third_rpc + + $LCTL get_param $ll_opencache_threshold_count || + skip "client does not have opencache parameter" + + set_opencache $new_flag + stack_trap "restore_opencache" + [ $($LCTL get_param -n $ll_opencache_threshold_count) == $new_flag ] || + error "enable opencache failed" + touch $testfile + # drop MDC DLM locks + cancel_lru_locks mdc + # clear MDC RPC stats counters + $LCTL set_param $mdc_rpcstats=clear + + # According to the current implementation, we need to run 3 times + # open & close file to verify if opencache is enabled correctly. + # 1st, RPCs are sent for lookup/open and open handle is released on + # close finally. + # 2nd, RPC is sent for open, MDS_OPEN_LOCK is fetched automatically, + # so open handle won't be released thereafter. + # 3rd, No RPC is sent out. + $MULTIOP $testfile oc || error "multiop failed" + first_rpc=$(calc_stats $mdc_rpcstats ldlm_ibits_enqueue) + echo "1st: $first_rpc RPCs in flight" + + $MULTIOP $testfile oc || error "multiop failed" + second_rpc=$(calc_stats $mdc_rpcstats ldlm_ibits_enqueue) + echo "2nd: $second_rpc RPCs in flight" + + $MULTIOP $testfile oc || error "multiop failed" + third_rpc=$(calc_stats $mdc_rpcstats ldlm_ibits_enqueue) + echo "3rd: $third_rpc RPCs in flight" + + #verify no MDC RPC is sent + [[ $second_rpc == $third_rpc ]] || error "MDC RPC is still sent" +} +run_test 429 "verify if opencache flag on client side does work" + lseek_test_430() { local offset local file=$1 @@ -25356,11 +25589,9 @@ run_test 805 "ZFS can remove from full fs" check_lsom_data() { local file=$1 - local size=$($LFS getsom -s $file) local expect=$(stat -c %s $file) - [[ $size == $expect ]] || - error "$file expected size: $expect, got: $size" + check_lsom_size $1 $expect local blocks=$($LFS getsom -b $file) expect=$(stat -c %b $file) @@ -25370,9 +25601,12 @@ check_lsom_data() check_lsom_size() { - local size=$($LFS getsom -s $1) + local size local expect=$2 + cancel_lru_locks mdc + + size=$($LFS getsom -s $1) [[ $size == $expect ]] || error "$file expected size: $expect, got: $size" }