X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=4f5ff0f9a0006581d390664182f8effd544426a1;hp=22fde7f0e1854f2b058ccbb4bf9be505af114e23;hb=716ac65ef6315f771eb3382b42bb2bb1a22a7391;hpb=8269ae4ad3f9004a90cd2afb3895102fd3c80570 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 22fde7f..4f5ff0f 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -28,72 +28,57 @@ ACCEPTOR_PORT=${ACCEPTOR_PORT:-988} DEF_STRIPE_COUNT=-1 CHECK_GRANT=${CHECK_GRANT:-"yes"} GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""} -export PARALLEL=${PARALLEL:-"no"} TRACE=${TRACE:-""} LUSTRE=${LUSTRE:-$(dirname $0)/..} LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi} . $LUSTRE/tests/test-framework.sh -init_test_env $@ +init_test_env "$@" init_logging ALWAYS_EXCEPT="$SANITY_EXCEPT " -# bug number for skipped test: LU-9693 LU-6493 LU-9693 -ALWAYS_EXCEPT+=" 42a 42b 42c " -# bug number: LU-8411 LU-9054 -ALWAYS_EXCEPT+=" 407 312" +always_except LU-9693 42a 42c +always_except LU-6493 42b +always_except LU-14541 277 +always_except LU-9054 312 +always_except LU-8411 407 if $SHARED_KEY; then - # bug number: LU-14181 LU-14181 - ALWAYS_EXCEPT+=" 64e 64f" -fi - -selinux_status=$(getenforce) -if [ "$selinux_status" != "Disabled" ]; then - # bug number: - ALWAYS_EXCEPT+="" + always_except LU-14181 64e 64f + always_except LU-15910 413g fi # skip the grant tests for ARM until they are fixed if [[ $(uname -m) = aarch64 ]]; then - # bug number: LU-11671 - ALWAYS_EXCEPT+=" 45" - # bug number: LU-14067 LU-14067 - ALWAYS_EXCEPT+=" 400a 400b" + always_except LU-11671 45 fi # skip nfs tests on kernels >= 4.12.0 until they are fixed if [ $LINUX_VERSION_CODE -ge $(version_code 4.12.0) ]; then - # bug number: LU-12661 - ALWAYS_EXCEPT+=" 817" + always_except LU-12661 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" + always_except LU-13063 411 fi #skip ACL tests on RHEL8 and SLES15 until tests changed to use other users if (( $(egrep -cw "^bin|^daemon" /etc/passwd) < 2 )); then - # bug number: LU-15259 LU-15259 - ALWAYS_EXCEPT+=" 103a 125 154a" + always_except LU-15259 103a 125 154a fi # 5 12 8 12 15 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 60i 64b 68 71 115 135 136 230d 300o" if [ "$mds1_FSTYPE" = "zfs" ]; then - # bug number for skipped test: - ALWAYS_EXCEPT+=" " # 13 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b" fi if [ "$ost1_FSTYPE" = "zfs" ]; then - # bug number for skipped test: LU-1941 LU-1941 LU-1941 LU-1941 - ALWAYS_EXCEPT+=" 130a 130b 130c 130d 130e 130f 130g" + always_except LU-1941 130a 130b 130c 130d 130e 130f 130g fi proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/" @@ -116,11 +101,10 @@ sles_version_code() if [ -r /etc/SuSE-release ]; then sles_version=$(sles_version_code) [ $sles_version -lt $(version_code 11.4.0) ] && - # bug number for skipped test: LU-4341 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170" + always_except LU-4341 170 + [ $sles_version -lt $(version_code 12.0.0) ] && - # bug number for skipped test: LU-3703 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234" + always_except LU-3703 234 elif [ -r /etc/os-release ]; then if grep -qi ubuntu /etc/os-release; then ubuntu_version=$(version_code $(sed -n -e 's/"//g' \ @@ -129,9 +113,8 @@ elif [ -r /etc/os-release ]; then awk '{ print $1 }')) if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then - # bug number for skipped test: - # LU-10334 LU-10366 - ALWAYS_EXCEPT+=" 103a 410" + always_except LU-10334 103a + always_except LU-10366 410 fi fi fi @@ -2414,7 +2397,7 @@ test_27Ca() { #LU-2871 # get striping information ost_idx=($($LFS getstripe $tfile$i | tail -n $((OSTCOUNT + 1)) | awk '{print $1}')) - echo ${ost_idx[@]} + echo "OST Index: ${ost_idx[*]}" # check the layout [ ${#ost_idx[@]} -eq $OSTCOUNT ] || @@ -2422,14 +2405,14 @@ test_27Ca() { #LU-2871 for index in $(seq 0 $((OSTCOUNT - 1))); do found=0 - for j in $(echo ${ost_idx[@]}); do + for j in "${ost_idx[@]}"; do if [ $index -eq $j ]; then found=1 break fi done [ $found = 1 ] || - error "Can not find $index in ${ost_idx[@]}" + error "Can not find $index in ${ost_idx[*]}" done done } @@ -5060,7 +5043,7 @@ test_39r() { cancel_lru_locks osc # exceed atime_diff and access file - sleep 6 + sleep 10 dd if=$DIR/$tfile of=/dev/null bs=4k count=1 || error "can't udpate atime" @@ -6021,10 +6004,13 @@ test_54c() { run_test 54c "block device works in lustre =====================" test_54d() { - f="$DIR/f54d" - string="aaaaaa" - mknod $f p - [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string" + local pipe="$DIR/$tfile.pipe" + local string="aaaaaa" + + mknod $pipe p + echo -n "$string" > $pipe & + local result=$(cat $pipe) + [[ "$result" == "$string" ]] || error "$result != $string" } run_test 54d "fifo device works in lustre ======================" @@ -8980,6 +8966,9 @@ test_64g() { run_test 64g "grant shrink on MDT" test_64h() { + (( $OST1_VERSION >= $(version_code 2.14.56) )) || + skip "need OST at least 2.14.56 to avoid grant shrink on read" + local instance=$($LFS getname -i $DIR) local osc_tgt="$FSNAME-OST0000-osc-$instance" local num_exps=$(do_facet ost1 \ @@ -9034,8 +9023,8 @@ test_64h() { run_test 64h "grant shrink on read" test_64i() { - (( $OST1_VERSION >= $(version_code 2.14.55) )) || - skip "need OST at least 2.14.55 to avoid grant shrink on replay" + (( $OST1_VERSION >= $(version_code 2.14.56) )) || + skip "need OST at least 2.14.56 to avoid grant shrink on replay" [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_ost_nodsh && skip "remote OSTs with nodsh" @@ -10433,20 +10422,20 @@ calc_total() { } ra_check_101() { - local READ_SIZE=$1 - local STRIPE_SIZE=$2 - local FILE_LENGTH=$3 - local RA_INC=1048576 - local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE)) - local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \ - (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH))) - DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats | + local read_size=$1 + local stripe_size=$2 + local stride_length=$((stripe_size / read_size)) + local stride_width=$((stride_length * OSTCOUNT)) + local discard_limit=$(( ((stride_length - 1) * 3 / stride_width) * + (stride_width - stride_length) )) + local discard=$($LCTL get_param -n llite.*.read_ahead_stats | get_named_value 'read.but.discarded' | calc_total) - if [[ $DISCARD -gt $discard_limit ]]; then + + if [[ $discard -gt $discard_limit ]]; then $LCTL get_param llite.*.read_ahead_stats - error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})" + error "($discard) discarded pages with size (${read_size})" else - echo "Read-ahead success for size ${READ_SIZE}" + echo "Read-ahead success for size ${read_size}" fi } @@ -11528,8 +11517,8 @@ test_103e() { 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" + (( $MDS1_VERSION >= $(version_code 2.14.52) )) || + skip "MDS needs to be at least 2.14.52" large_xattr_enabled || skip_env "ea_inode feature disabled" @@ -11666,7 +11655,7 @@ test_104c() { echo "Before recordsize change" lfs_df=($($LFS df -h | grep "filesystem_summary:")) - df=($(df -h | grep "/mnt/lustre"$)) + df=($(df -h | grep "$MOUNT"$)) # For checking. echo "lfs output : ${lfs_df[*]}" @@ -11698,7 +11687,7 @@ test_104c() { echo "After recordsize change" lfs_df_after=($($LFS df -h | grep "filesystem_summary:")) - df_after=($(df -h | grep "/mnt/lustre"$)) + df_after=($(df -h | grep "$MOUNT"$)) # For checking. echo "lfs output : ${lfs_df_after[*]}" @@ -11959,29 +11948,6 @@ test_115() { } run_test 115 "verify dynamic thread creation====================" -free_min_max () { - wait_delete_completed - AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail)) - echo "OST kbytes available: ${AVAIL[@]}" - MAXV=${AVAIL[0]} - MAXI=0 - MINV=${AVAIL[0]} - MINI=0 - for ((i = 0; i < ${#AVAIL[@]}; i++)); do - #echo OST $i: ${AVAIL[i]}kb - if [[ ${AVAIL[i]} -gt $MAXV ]]; then - MAXV=${AVAIL[i]} - MAXI=$i - fi - if [[ ${AVAIL[i]} -lt $MINV ]]; then - MINV=${AVAIL[i]} - MINI=$i - fi - done - echo "Min free space: OST $MINI: $MINV" - echo "Max free space: OST $MAXI: $MAXV" -} - test_116a() { # was previously test_116() [ $PARALLEL == "yes" ] && skip "skip parallel run" [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" @@ -12909,6 +12875,7 @@ test_123a_base() { # was test 123, statahead(bug 11401) log "testing UP system. Performance may be lower than expected." SLOWOK=1 fi + running_in_vm && SLOWOK=1 rm -rf $DIR/$tdir test_mkdir $DIR/$tdir @@ -14647,7 +14614,7 @@ test_150b() { touch $DIR/$tfile stack_trap "rm -f $DIR/$tfile; wait_delete_completed" - check_fallocate $DIR/$tfile || error "fallocate failed" + check_fallocate $DIR/$tfile || skip_eopnotsupp "fallocate failed" } run_test 150b "Verify fallocate (prealloc) functionality" @@ -14697,8 +14664,7 @@ test_150c() { $LFS setstripe -E1M $striping -E16M -c3 -Eeof -c 4 $DIR/$tfile || error "Create $DIR/$tfile failed" - fallocate -l $((1048576 * 512)) $DIR/$tfile || - error "fallocate failed" + fallocate -l $((1048576 * 512)) $DIR/$tfile || error "fallocate failed" bytes=$(($(stat -c '%b * %B' $DIR/$tfile))) want=$((512 * 1048576)) @@ -14802,8 +14768,8 @@ test_150f() { error "dd failed for bs 4096 and count 5" # Call fallocate with punch range which is within the file range - fallocate -p --offset 4096 -l $length $DIR/$tfile || - error "fallocate failed: offset 4096 and length $length" + out=$(fallocate -p --offset 4096 -l $length $DIR/$tfile 2>&1) || + skip_eopnotsupp "$out|fallocate: offset 4096 and length $length" # client must see changes immediately after fallocate size=$(stat -c '%s' $DIR/$tfile) blocks=$(stat -c '%b' $DIR/$tfile) @@ -14833,8 +14799,8 @@ test_150f() { want_blocks_after=40 # 512 sized blocks # Punch overlaps two blocks and less than blocksize - fallocate -p --offset 4000 -l 3000 $DIR/$tfile || - error "fallocate failed: offset 4000 length 3000" + out=$(fallocate -p --offset 4000 -l 3000 $DIR/$tfile 2>&1) || + skip_eopnotsupp "$out|fallocate: offset 4000 length 3000" size=$(stat -c '%s' $DIR/$tfile) blocks=$(stat -c '%b' $DIR/$tfile) @@ -14918,8 +14884,8 @@ test_150g() { # Call fallocate to punch all except 2 blocks. We leave the # first and the last block echo "fallocate -p --offset $BS -l $punch_size $DIR/$tfile" - fallocate -p --offset $BS -l $punch_size $DIR/$tfile || - error "fallocate failed: offset $BS length $punch_size" + out=$(fallocate -p --offset $BS -l $punch_size $DIR/$tfile 2>&1) || + skip_eopnotsupp "$out|fallocate: offset $BS length $punch_size" size_after=$(stat -c '%s' $DIR/$tfile) blocks_after=$(stat -c '%b' $DIR/$tfile) @@ -17787,33 +17753,7 @@ obdecho_test() { } test_180a() { - [ $PARALLEL == "yes" ] && skip "skip parallel run" - - if ! [ -d /sys/fs/lustre/echo_client ] && - ! module_loaded obdecho; then - load_module obdecho/obdecho && - stack_trap "rmmod obdecho" EXIT || - error "unable to load obdecho on client" - fi - - local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}') - local host=$($LCTL get_param -n osc.$osc.import | - awk '/current_connection:/ { print $2 }' ) - local target=$($LCTL get_param -n osc.$osc.import | - awk '/target:/ { print $2 }' ) - target=${target%_UUID} - - if [ -n "$target" ]; then - setup_obdecho_osc $host $target && - stack_trap "cleanup_obdecho_osc $target" EXIT || - { error "obdecho setup failed with $?"; return; } - - obdecho_test ${target}_osc client || - error "obdecho_test failed on ${target}_osc" - else - $LCTL get_param osc.$osc.import - error "there is no osc.$osc.import target" - fi + skip "obdecho on osc is no longer supported" } run_test 180a "test obdecho on osc" @@ -17881,7 +17821,7 @@ test_181() { # bug 22177 } run_test 181 "Test open-unlinked dir ========================" -test_182() { +test_182a() { local fcount=1000 local tcount=10 @@ -17907,7 +17847,75 @@ test_182() { rm -rf $DIR/$tdir } -run_test 182 "Test parallel modify metadata operations ================" +run_test 182a "Test parallel modify metadata operations from mdc" + +test_182b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local dcount=1000 + local tcount=10 + local stime + local etime + local delta + + do_facet mds1 $LCTL list_param \ + osp.$FSNAME-MDT*-osp-MDT*.rpc_stats || + skip "MDS lacks parallel RPC handling" + + $LFS mkdir -i 0 $DIR/$tdir || error "creating dir $DIR/$tdir" + + rpc_count=$(do_facet mds1 $LCTL get_param -n \ + osp.$FSNAME-MDT0001-osp-MDT0000.max_mod_rpcs_in_flight) + + stime=$(date +%s) + createmany -i 0 -d $DIR/$tdir/t- $tcount + + for (( i = 0; i < $tcount; i++ )) ; do + createmany -i 0 -d $DIR/$tdir/t-$i/d- 0 $dcount & + done + wait + etime=$(date +%s) + delta=$((etime - stime)) + echo "Time for file creation $delta sec for $rpc_count parallel RPCs" + + stime=$(date +%s) + for (( i = 0; i < $tcount; i++ )) ; do + unlinkmany -d $DIR/$tdir/$i/d- $dcount & + done + wait + etime=$(date +%s) + delta=$((etime - stime)) + echo "Time for file removal $delta sec for $rpc_count parallel RPCs" + + rm -rf $DIR/$tdir + + $LFS mkdir -i 0 $DIR/$tdir || error "creating dir $DIR/$tdir" + + do_facet mds1 $LCTL set_param osp.$FSNAME-MDT0001-osp-MDT0000.max_mod_rpcs_in_flight=1 + + stime=$(date +%s) + createmany -i 0 -d $DIR/$tdir/t- $tcount + + for (( i = 0; i < $tcount; i++ )) ; do + createmany -i 0 -d $DIR/$tdir/t-$i/d- 0 $dcount & + done + wait + etime=$(date +%s) + delta=$((etime - stime)) + echo "Time for file creation $delta sec for 1 RPC sent at a time" + + stime=$(date +%s) + for (( i = 0; i < $tcount; i++ )) ; do + unlinkmany -d $DIR/$tdir/t-$i/d- $dcount & + done + wait + etime=$(date +%s) + delta=$((etime - stime)) + echo "Time for file removal $delta sec for 1 RPC sent at a time" + + do_facet mds1 $LCTL set_param osp.$FSNAME-MDT0001-osp-MDT0000.max_mod_rpcs_in_flight=$rpc_count +} +run_test 182b "Test parallel modify metadata operations from osp" test_183() { # LU-2275 [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -20923,7 +20931,7 @@ test_244b() } run_test 244b "multi-threaded write with group lock" -test_245() { +test_245a() { local flagname="multi_mod_rpcs" local connect_data_name="max_mod_rpcs" local out @@ -20946,7 +20954,35 @@ test_245() { echo "$out" | grep -qw $connect_data_name || error "import should have connect data $connect_data_name" } -run_test 245 "check mdc connection flag/data: multiple modify RPCs" +run_test 245a "check mdc connection flag/data: multiple modify RPCs" + +test_245b() { + local flagname="multi_mod_rpcs" + local connect_data_name="max_mod_rpcs" + local out + + remote_mds_nodsh && skip "remote MDS with nodsh" + [[ $MDSCOUNT -ge 2 ]] || skip "needs >= 2 MDTs" + + # check if multiple modify RPCs flag is set + out=$(do_facet mds1 \ + $LCTL get_param osp.$FSNAME-MDT0001-osp-MDT0000.import | + grep "connect_flags:") + echo "$out" + + [[ "$out" =~ $flagname ]] || skip "connect flag $flagname is not set" + + # check if multiple modify RPCs data is set + out=$(do_facet mds1 \ + $LCTL get_param osp.$FSNAME-MDT0001-osp-MDT0000.import) + + [[ "$out" =~ $connect_data_name ]] || + { + echo "$out" + error "missing connect data $connect_data_name" + } +} +run_test 245b "check osp connection flag/data: multiple modify RPCs" cleanup_247() { local submount=$1 @@ -21029,7 +21065,7 @@ test_247d() { for rootpath in "$submount" "$submount///" "$submount/dir1"; do echo "$rootpath $fid" found=$($LFS fid2path $rootpath "$fid") - [ -n "found" ] || error "fid2path should succeed" + [ -n "$found" ] || error "fid2path should succeed" [ "$found" == "$td" ] || error "fid2path $found != $td" done # check wrong root path format @@ -22356,9 +22392,9 @@ test_270g() { echo "Free space: ${spfree}%, default DOM stripe: ${dom_def}K" [[ $dom_def != $dom_current ]] || error "Default stripe size was not changed" - if [[ $spfree > 0 ]] ; then + if (( spfree > 0 )) ; then dom_set=$($LFS getstripe -S $dom) - [[ $dom_set == $((dom_def * 1024)) ]] || + (( dom_set == dom_def * 1024 )) || error "DOM component size is still old" else [[ $($LFS getstripe -L $dom) != "mdt" ]] || @@ -24121,17 +24157,17 @@ test_315() { # LU-618 run_test 315 "read should be accounted" test_316() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" - large_xattr_enabled || skip_env "ea_inode feature disabled" + (( $MDSCOUNT >= 2 )) || skip "needs >= 2 MDTs" + large_xattr_enabled || skip "ea_inode feature disabled" - rm -rf $DIR/$tdir/d - mkdir -p $DIR/$tdir/d - chown nobody $DIR/$tdir/d - touch $DIR/$tdir/d/file + mkdir_on_mdt0 $DIR/$tdir || error "mkdir $tdir failed" + mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed" + chown nobody $DIR/$tdir/d || error "chown $tdir/d failed" + touch $DIR/$tdir/d/$tfile || error "touch $tdir/d/$tfile failed" - $LFS mv -m1 $DIR/$tdir/d || error "lfs mv failed" + $LFS migrate -m1 $DIR/$tdir/d || error "lfs migrate -m1 failed" } -run_test 316 "lfs mv" +run_test 316 "lfs migrate of file with large_xattr enabled" test_317() { [ $MDS1_VERSION -lt $(version_code 2.11.53) ] && @@ -24183,7 +24219,7 @@ test_317() { # Truncate to size $trunc_sz bytes. Strip tail blocks and leave only 8 # blocks. The block count must drop to 8. # - trunc_sz=$(($(stat --format=%s $DIR/$tfile) - \ + trunc_sz=$(($(stat --format=%s $DIR/$tfile) - ((bs - grant_blk_size) + 1))) $TRUNCATE $DIR/$tfile $trunc_sz || error "truncate $tfile to $trunc_sz failed" @@ -24250,7 +24286,7 @@ test_318() { run_test 318 "Verify async readahead tunables" test_319() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + (( $MDSCOUNT >= 2 )) || skip "needs >= 2 MDTs" local before=$(date +%s) local evict @@ -24262,7 +24298,7 @@ test_319() { #define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c $LCTL set_param fail_val=5 fail_loc=0x8000032c - $LFS mv -m1 $file & + $LFS migrate -m1 $mdir & sleep 1 dd if=$file of=/dev/null @@ -24282,45 +24318,69 @@ test_398a() { # LU-4198 $LFS setstripe -c 1 -i 0 $DIR/$tfile $LCTL set_param ldlm.namespaces.*.lru_size=clear + # Disabled: DIO does not push out buffered I/O pages, see LU-12587 # request a new lock on client - dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 + #dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 - dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc - local lock_count=$($LCTL get_param -n \ - ldlm.namespaces.$imp_name.lru_size) - [[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO" + #dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc + #local lock_count=$($LCTL get_param -n \ + # ldlm.namespaces.$imp_name.lru_size) + #[[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO" $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear - # no lock cached, should use lockless IO and not enqueue new lock - dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc + # no lock cached, should use lockless DIO and not enqueue new lock + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct \ + conv=notrunc || + error "dio write failed" lock_count=$($LCTL get_param -n \ ldlm.namespaces.$imp_name.lru_size) [[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO" + + $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear + + # no lock cached, should use locked DIO append + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct oflag=append \ + conv=notrunc || error "DIO append failed" + lock_count=$($LCTL get_param -n \ + ldlm.namespaces.*-OST0000-osc-ffff*.lru_size) + [[ $lock_count -ne 0 ]] || error "lock still must be held by DIO append" } run_test 398a "direct IO should cancel lock otherwise lockless" test_398b() { # LU-4198 which fio || skip_env "no fio installed" - $LFS setstripe -c -1 $DIR/$tfile + $LFS setstripe -c -1 -S 1M $DIR/$tfile - local size=12 + local size=48 dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size local njobs=4 - echo "mix direct rw ${size}M to OST0 by fio with $njobs jobs..." - fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \ - --numjobs=$njobs --fallocate=none \ - --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \ - --filename=$DIR/$tfile & - bg_pid=$! - - echo "mix buffer rw ${size}M to OST0 by fio with $njobs jobs..." - fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE \ - --numjobs=$njobs --fallocate=none \ - --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \ - --filename=$DIR/$tfile || true - wait $bg_pid + # Single page, multiple pages, stripe size, 4*stripe size + for bsize in $(( $PAGE_SIZE )) $(( 4*$PAGE_SIZE )) 1048576 4194304; do + echo "mix direct rw ${bsize} by fio with $njobs jobs..." + fio --name=rand-rw --rw=randrw --bs=$bsize --direct=1 \ + --numjobs=$njobs --fallocate=none \ + --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \ + --filename=$DIR/$tfile & + bg_pid=$! + + echo "mix buffer rw ${bsize} by fio with $njobs jobs..." + fio --name=rand-rw --rw=randrw --bs=$bsize \ + --numjobs=$njobs --fallocate=none \ + --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \ + --filename=$DIR/$tfile || true + wait $bg_pid + done + + evict=$(do_facet client $LCTL get_param \ + osc.$FSNAME-OST*-osc-*/state | + awk -F"[ [,]" '/EVICTED ]$/ { if (t<$5) {t=$5;} } END { print t }') + + [ -z "$evict" ] || [[ $evict -le $before ]] || + (do_facet client $LCTL get_param \ + osc.$FSNAME-OST*-osc-*/state; + error "eviction happened: $evict before:$before") rm -f $DIR/$tfile } @@ -25390,16 +25450,16 @@ generate_uneven_mdts() { ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-*.filesfree)) bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-*.kbytesavail)) - max=$(((${ffree[max_index]} >> 8) * \ + max=$(((${ffree[max_index]} >> 8) * (${bavail[max_index]} * bsize >> 16))) - min=$(((${ffree[min_index]} >> 8) * \ + min=$(((${ffree[min_index]} >> 8) * (${bavail[min_index]} * bsize >> 16))) diff=$(((max - min) * 100 / min)) i=$((i + 1)) done - echo "MDT filesfree available: ${ffree[@]}" - echo "MDT blocks available: ${bavail[@]}" + echo "MDT filesfree available: ${ffree[*]}" + echo "MDT blocks available: ${bavail[*]}" echo "weight diff=$diff%" } @@ -25533,8 +25593,8 @@ test_qos_mkdir() { (( ${ffree[min_index]} < 10000000 )) || skip "too many free files in MDT$min_index" - echo "MDT filesfree available: ${ffree[@]}" - echo "MDT blocks available: ${bavail[@]}" + echo "MDT filesfree available: ${ffree[*]}" + echo "MDT blocks available: ${bavail[*]}" echo "weight diff=$(((max - min) * 100 / min))%" echo echo "Mkdir (stripe_count $stripe_count) with balanced space usage:" @@ -25770,26 +25830,15 @@ test_413e() { } run_test 413e "check default max-inherit value" -test_413f() { - (( MDSCOUNT >= 2 )) || skip "We need at least 2 MDTs for this test" - - (( MDS1_VERSION >= $(version_code 2.14.55) )) || - skip "Need server version at least 2.14.55" - - getfattr -d -m trusted.dmv --absolute-names $DIR > $TMP/dmv.ea || - error "dump $DIR default LMV failed" - stack_trap "setfattr --restore=$TMP/dmv.ea" - - $LFS setdirstripe -D -i -1 -c 1 -X 3 --max-inherit-rr 3 $DIR || - error "set $DIR default LMV failed" - +test_fs_dmv_inherit() +{ local testdir=$DIR/$tdir local count local inherit local inherit_rr - for i in $(seq 3); do + for i in 1 2 3; do mkdir $testdir || error "mkdir $testdir failed" count=$($LFS getdirstripe -D -c $testdir) (( count == 1 )) || @@ -25808,8 +25857,57 @@ test_413f() { (( count == 0 )) || error "$testdir default LMV count not zero: $count" } + +test_413f() { + (( MDSCOUNT >= 2 )) || skip "We need at least 2 MDTs for this test" + + (( MDS1_VERSION >= $(version_code 2.14.55) )) || + skip "Need server version at least 2.14.55" + + getfattr -d -m trusted.dmv --absolute-names $DIR > $TMP/dmv.ea || + error "dump $DIR default LMV failed" + stack_trap "setfattr --restore=$TMP/dmv.ea" + + $LFS setdirstripe -D -i -1 -c 1 -X 3 --max-inherit-rr 3 $DIR || + error "set $DIR default LMV failed" + + test_fs_dmv_inherit +} run_test 413f "lfs getdirstripe -D list ROOT default LMV if it's not set on dir" +test_413g() { + (( MDSCOUNT >= 2 )) || skip "We need at least 2 MDTs for this test" + + mkdir -p $DIR/$tdir/l2/l3/l4 || error "mkdir $tdir/l1/l2/l3 failed" + getfattr -d -m trusted.dmv --absolute-names $DIR > $TMP/dmv.ea || + error "dump $DIR default LMV failed" + stack_trap "setfattr --restore=$TMP/dmv.ea" + + $LFS setdirstripe -D -i -1 -c 1 -X 3 --max-inherit-rr 3 $DIR || + error "set $DIR default LMV failed" + + FILESET="$FILESET/$tdir/l2/l3/l4" mount_client $MOUNT2 || + error "mount $MOUNT2 failed" + stack_trap "umount_client $MOUNT2" + + local saved_DIR=$DIR + + export DIR=$MOUNT2 + + stack_trap "export DIR=$saved_DIR" + + # first check filesystem-wide default LMV inheritance + test_fs_dmv_inherit || error "incorrect fs default LMV inheritance" + + # then check subdirs are spread to all MDTs + createmany -d $DIR/s $((MDSCOUNT * 100)) || error "createmany failed" + + local count=$($LFS getstripe -m $DIR/s* | sort -u | wc -l) + + (( $count == $MDSCOUNT )) || error "dirs are spread to $count MDTs" +} +run_test 413g "enforce ROOT default LMV on subdir mount" + test_413z() { local pids="" local subdir @@ -25848,7 +25946,7 @@ test_415() { total=500 # this test may be slow on ZFS - [ "$mds1_FSTYPE" == "zfs" ] && total=100 + [ "$mds1_FSTYPE" == "zfs" ] && total=50 # though this test is designed for striped directory, let's test normal # directory too since lock is always saved as CoS lock. @@ -26788,6 +26886,45 @@ test_432() { } run_test 432 "mv dir from outside Lustre" +test_433() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + + [[ -n "$($LCTL list_param llite.*.inode_cache 2>/dev/null)" ]] || + skip "inode cache not supported" + + $LCTL set_param llite.*.inode_cache=0 + stack_trap "$LCTL set_param llite.*.inode_cache=1" + + local count=256 + local before + local after + + cancel_lru_locks mdc + test_mkdir $DIR/$tdir || error "mkdir $tdir" + createmany -m $DIR/$tdir/f $count + createmany -d $DIR/$tdir/d $count + ls -l $DIR/$tdir > /dev/null + stack_trap "rm -rf $DIR/$tdir" + + before=$(num_objects) + cancel_lru_locks mdc + after=$(num_objects) + + # sometimes even @before is less than 2 * count + while (( before - after < count )); do + sleep 1 + after=$(num_objects) + wait=$((wait + 1)) + (( wait % 5 == 0 )) && echo "wait $wait seconds objects: $after" + if (( wait > 60 )); then + error "inode slab grew from $before to $after" + fi + done + + echo "lustre_inode_cache $before objs before lock cancel, $after after" +} +run_test 433 "ldlm lock cancel releases dentries and inodes" + prep_801() { [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -28161,9 +28298,22 @@ test_904() { local testfile="$DIR/$tdir/$tfile" local xattr="trusted.projid" local projid + local mdts=$(comma_list $(mdts_nodes)) + local saved=$(do_facet mds1 $LCTL get_param -n \ + osd-ldiskfs.*MDT0000.enable_projid_xattr) + + do_nodes $mdts $LCTL set_param osd-ldiskfs.*MDT*.enable_projid_xattr=0 + stack_trap "do_nodes $mdts $LCTL set_param \ + osd-ldiskfs.*MDT*.enable_projid_xattr=$saved" mkdir -p $DIR/$tdir touch $testfile + #hide projid xattr on server + $LFS project -p 1 $testfile || + error "set $testfile project id failed" + getfattr -m - $testfile | grep $xattr && + error "do not show trusted.projid when disabled on server" + do_nodes $mdts $LCTL set_param osd-ldiskfs.*MDT*.enable_projid_xattr=1 #should be hidden when projid is 0 $LFS project -p 0 $testfile || error "set $testfile project id failed" @@ -28186,6 +28336,8 @@ test_904() { #check the new projid via getxattr $LFS project -p 1001 $testfile || error "set $testfile project id failed" + getfattr -m - $testfile | grep $xattr || + error "should show trusted.projid when project ID != 0" projid=$(getfattr -n $xattr $testfile | sed -n 's/^trusted\.projid="\(.*\)"/\1/p') [ $projid == "1001" ] ||