X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=157b568ca1cfa68541f8348317ffa793b4eddf42;hp=737e16d8a13f471b6525719b09da3fcbfd268a5c;hb=3e1f8d30cb0209b35410e85e502e2cae40f1b58c;hpb=3e0d994fbf4c4f2e5c51b2be5669ad97aa02f840;ds=sidebyside diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 737e16d..157b568 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -1586,7 +1586,7 @@ test_27cb() { # Strip getstripe output to a space separated list of OSTs local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ - awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + awk '{print $1}' | tr '\n' ' ' | sed -e 's/[[:space:]]*$//') [ "$getstripe_osts" = "${osts//,/ }" ] || error "stripes not on specified OSTs" @@ -1607,7 +1607,7 @@ test_27cc() { # Strip getstripe output to a space separated list of OSTs local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ - awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + awk '{print $1}' | tr '\n' ' ' | sed -e 's/[[:space:]]*$//') [ "$getstripe_osts" = "${osts//,/ }" ] || error "stripes not on specified OSTs" @@ -1627,7 +1627,7 @@ test_27cd() { # Strip getstripe output to a space separated list of OSTs local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ - awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + awk '{print $1}' | tr '\n' ' ' | sed -e 's/[[:space:]]*$//') [ "$getstripe_osts" = "${osts//,/ }" ] || error "stripes not on specified OSTs" @@ -1659,7 +1659,7 @@ test_27ce() { # Strip getstripe output to a space separated list of OSTs local getstripe_osts=$(echo "$getstripe" | sed -e '1,/obdidx/d' |\ - awk '{print $1}' | tr '\n' '\ ' | sed -e 's/[[:space:]]*$//') + awk '{print $1}' | tr '\n' ' ' | sed -e 's/[[:space:]]*$//') [ "$getstripe_osts" = "${osts//,/ }" ] || error "stripes not on specified OSTs" @@ -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 @@ -6259,9 +6290,9 @@ test_newerXY_base() { if [ $y == "t" ]; then if [ $x == "b" ]; then - ref="\"$(do_facet mds1 date +"%Y-%m-%d\ %H:%M:%S")\"" + ref=\"$(do_facet mds1 date +"%Y-%m-%d\ %H:%M:%S")\" else - ref="\"$(date +"%Y-%m-%d %H:%M:%S")\"" + ref=\"$(date +"%Y-%m-%d %H:%M:%S")\" fi else ref=$DIR/$tfile.newer.$x$y @@ -6274,9 +6305,9 @@ test_newerXY_base() { sleep 2 if [ $y == "t" ]; then if [ $x == "b" ]; then - negref="\"$(do_facet mds1 date +"%Y-%m-%d\ %H:%M:%S")\"" + negref=\"$(do_facet mds1 date +"%Y-%m-%d\ %H:%M:%S")\" else - negref="\"$(date +"%Y-%m-%d %H:%M:%S")\"" + negref=\"$(date +"%Y-%m-%d %H:%M:%S")\" fi else negref=$DIR/$tfile.negnewer.$x$y @@ -9885,6 +9916,8 @@ test_101e() { dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null done + $LCTL get_param llite.*.max_cached_mb + $LCTL get_param llite.*.read_ahead_stats local miss=$($LCTL get_param -n llite.*.read_ahead_stats | get_named_value 'misses' | calc_total) @@ -10805,20 +10838,82 @@ test_103c() { run_test 103c "'cp -rp' won't set empty acl" test_103e() { - (( $MDS1_VERSION >= $(version_code 2.13.59) )) || - skip "MDS needs to be at least 2.13.59" + local numacl + local fileacl + local saved_debug=$($LCTL get_param -n debug) + + (( $MDS1_VERSION >= $(version_code 2.14.0) )) || + skip "MDS needs to be at least 2.14.0" + + large_xattr_enabled || skip_env "ea_inode feature disabled" mkdir -p $DIR/$tdir - # one default ACL will be created for the file owner - for U in {2..256}; do - setfacl -m default:user:$U:rwx $DIR/$tdir - numacl=$(getfacl $DIR/$tdir |& grep -c "default:user") - touch $DIR/$tdir/$tfile.$U || - error "failed to create $tfile.$U with $numacl ACLs" + # add big LOV EA to cause reply buffer overflow earlier + $LFS setstripe -C 1000 $DIR/$tdir + lctl set_param mdc.*-mdc*.stats=clear + + $LCTL set_param debug=0 + stack_trap "$LCTL set_param debug=\"$saved_debug\"" EXIT + stack_trap "$LCTL get_param mdc.*-mdc*.stats" EXIT + + # add a large number of default ACLs (expect 8000+ for 2.13+) + for U in {2..7000}; do + setfacl -d -m user:$U:rwx $DIR/$tdir || + error "Able to add just $U default ACLs" done + numacl=$(getfacl $DIR/$tdir |& grep -c "default:user") + echo "$numacl default ACLs created" + + stat $DIR/$tdir || error "Cannot stat directory" + # check file creation + touch $DIR/$tdir/$tfile || + error "failed to create $tfile with $numacl default ACLs" + stat $DIR/$tdir/$tfile || error "Cannot stat file" + fileacl=$(getfacl $DIR/$tdir/$tfile |& grep -c "user:") + echo "$fileacl ACLs were inherited" + (( $fileacl == $numacl )) || + error "Not all default ACLs were inherited: $numacl != $fileacl" + # check that new ACLs creation adds new ACLs to inherited ACLs + setfacl -m user:19000:rwx $DIR/$tdir/$tfile || + error "Cannot set new ACL" + numacl=$((numacl + 1)) + fileacl=$(getfacl $DIR/$tdir/$tfile |& grep -c "user:") + (( $fileacl == $numacl )) || + error "failed to add new ACL: $fileacl != $numacl as expected" + # adds more ACLs to a file to reach their maximum at 8000+ + numacl=0 + for U in {20000..25000}; do + setfacl -m user:$U:rwx $DIR/$tdir/$tfile || break + numacl=$((numacl + 1)) + done + echo "Added $numacl more ACLs to the file" + fileacl=$(getfacl $DIR/$tdir/$tfile |& grep -c "user:") + echo "Total $fileacl ACLs in file" + stat $DIR/$tdir/$tfile > /dev/null || error "Cannot stat file" + rm -f $DIR/$tdir/$tfile || error "Cannot remove file" + rmdir $DIR/$tdir || error "Cannot remove directory" } run_test 103e "inheritance of big amount of default ACLs" +test_103f() { + (( $MDS1_VERSION >= $(version_code 2.14.51) )) || + skip "MDS needs to be at least 2.14.51" + + large_xattr_enabled || skip_env "ea_inode feature disabled" + + # enable changelog to consume more internal MDD buffers + changelog_register + + mkdir -p $DIR/$tdir + # add big LOV EA + $LFS setstripe -C 1000 $DIR/$tdir + setfacl -d -m user:$U:rwx $DIR/$tdir || error "Cannot add default ACLs" + mkdir $DIR/$tdir/inherited || error "failed to create subdirectory" + rmdir $DIR/$tdir/inherited || error "Cannot remove subdirectory" + rmdir $DIR/$tdir || error "Cannot remove directory" +} +run_test 103f "changelog doesn't interfere with default ACLs buffers" + test_104a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -10855,6 +10950,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 @@ -15756,6 +15951,48 @@ test_160l() { } run_test 160l "Verify that MTIME changelog records contain the parent FID" +test_160m() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + [[ $MDS1_VERSION -ge $(version_code 2.14.51) ]] || + skip "Need MDS version at least 2.14.51" + local cl_users + local cl_user1 + local cl_user2 + local pid1 + + # Create a user + changelog_register || error "first changelog_register failed" + changelog_register || error "second changelog_register failed" + + cl_users=(${CL_USERS[mds1]}) + cl_user1="${cl_users[0]}" + cl_user2="${cl_users[1]}" + # generate some changelog records to accumulate on MDT0 + test_mkdir -p -i0 -c1 $DIR/$tdir || error "test_mkdir $tdir failed" + createmany -m $DIR/$tdir/$tfile 50 || + error "create $DIR/$tdir/$tfile failed" + unlinkmany $DIR/$tdir/$tfile 50 || error "unlinkmany failed" + rm -f $DIR/$tdir + + # check changelogs have been generated + local nbcl=$(changelog_dump | wc -l) + [[ $nbcl -eq 0 ]] && error "no changelogs found" + +#define OBD_FAIL_MDS_CHANGELOG_RACE 0x15f + do_facet mds1 $LCTL set_param fail_loc=0x8000015f fail_val=0 + + __changelog_clear mds1 $cl_user1 +10 + __changelog_clear mds1 $cl_user2 0 & + pid1=$! + sleep 2 + __changelog_clear mds1 $cl_user1 0 || + error "fail to cancel record for $cl_user1" + wait $pid1 + [[ $? -eq 0 ]] || error "fail to cancel record for $cl_user2" +} +run_test 160m "Changelog clear race" + + test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -19226,6 +19463,22 @@ test_230s() { } run_test 230s "lfs mkdir should return -EEXIST if target exists" +test_230t() +{ + [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -ge $(version_code 2.14.50) ]] || + skip "Need MDS version at least 2.14.50" + + test_mkdir $DIR/$tdir || error "mkdir $tdir failed" + test_mkdir $DIR/$tdir/subdir || error "mkdir subdir failed" + $LFS project -p 1 -s $DIR/$tdir || + error "set $tdir project id failed" + $LFS project -p 2 -s $DIR/$tdir/subdir || + error "set subdir project id failed" + $LFS migrate -m 1 -c $MDSCOUNT $DIR/$tdir || error "migrate failed" +} +run_test 230t "migrate directory with project ID set" + test_231a() { # For simplicity this test assumes that max_pages_per_rpc @@ -22958,7 +23211,7 @@ test_398b() { # LU-4198 --filename=$DIR/$tfile || true wait $bg_pid - rm -rf $DIR/$tfile + rm -f $DIR/$tfile } run_test 398b "DIO and buffer IO race" @@ -23018,27 +23271,28 @@ test_398c() { # LU-4198 --filename=$DIR/$tfile [ $? -eq 0 ] || error "fio large block size failed" - rm -rf $DIR/$tfile + rm -f $DIR/$tfile $LCTL set_param debug="$saved_debug" } run_test 398c "run fio to test AIO" test_398d() { # LU-13846 - test -f aiocp || skip_env "no aiocp installed" - local aio_file=$DIR/aio_file + which aiocp || skip_env "no aiocp installed" + local aio_file=$DIR/$tfile.aio $LFS setstripe -c -1 -S 1M $DIR/$tfile $aio_file dd if=/dev/urandom of=$DIR/$tfile bs=1M count=64 aiocp -a $PAGE_SIZE -b 64M -s 64M -f O_DIRECT $DIR/$tfile $aio_file + stack_trap "rm -f $DIR/$tfile $aio_file" - diff $DIR/$tfile $aio_file || "file diff after aiocp" + diff $DIR/$tfile $aio_file || error "file diff after aiocp" # make sure we don't crash and fail properly aiocp -a 512 -b 64M -s 64M -f O_DIRECT $DIR/$tfile $aio_file && error "aio not aligned with PAGE SIZE should fail" - rm -rf $DIR/$tfile $aio_file + rm -f $DIR/$tfile $aio_file } run_test 398d "run aiocp to verify block size > stripe size" @@ -23049,6 +23303,26 @@ test_398e() { } run_test 398e "O_Direct open cleared by fcntl doesn't cause hang" +test_398f() { # LU-14687 + which aiocp || skip_env "no aiocp installed" + local aio_file=$DIR/$tfile.aio + + $LFS setstripe -c -1 -S 1M $DIR/$tfile $aio_file + + dd if=/dev/zero of=$DIR/$tfile bs=1M count=64 + stack_trap "rm -f $DIR/$tfile $aio_file" + + #define OBD_FAIL_LLITE_PAGE_ALLOC 0x1418 + $LCTL set_param fail_loc=0x1418 + # make sure we don't crash and fail properly + aiocp -b 64M -s 64M -f O_DIRECT $DIR/$tfile $aio_file && + error "aio with page allocation failure succeeded" + $LCTL set_param fail_loc=0 + diff $DIR/$tfile $aio_file + [[ $? != 0 ]] || error "no diff after failed aiocp" +} +run_test 398f "verify aio handles ll_direct_rw_pages errors correctly" + test_fake_rw() { local read_write=$1 if [ "$read_write" = "write" ]; then @@ -23652,14 +23926,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" @@ -23669,15 +23955,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 @@ -23717,10 +24012,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 @@ -23732,20 +24027,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)) @@ -23794,7 +24083,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 @@ -23803,7 +24092,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 } @@ -23833,23 +24122,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 @@ -24484,6 +24814,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 @@ -25253,11 +25629,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) @@ -25267,9 +25641,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" } @@ -25558,6 +25935,28 @@ test_812b() { # LU-12378 } run_test 812b "do not drop no resend request for idle connect" +test_812c() { + local old + + old=$($LCTL get_param -n osc.*.idle_timeout | head -n 1) + + $LFS setstripe -c 1 -o 0 $DIR/$tfile + $LFS getstripe $DIR/$tfile + $LCTL set_param osc.*.idle_timeout=10 + stack_trap "$LCTL set_param osc.*.idle_timeout=$old" EXIT + # 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 + +#define OBD_FAIL_PTLRPC_IDLE_RACE 0x533 + $LCTL set_param fail_loc=0x80000533 + sleep 15 + dd if=/dev/zero of=$DIR/$tfile count=1 conv=sync || error "dd failed" +} +run_test 812c "idle import vs lock enqueue race" + test_813() { local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null) [ -z "$file_heat_sav" ] && skip "no file heat support"