X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=98fa2ae7b5e21c1b81701e2b80d645c94bdcacc0;hp=6591772338f4e6a8872759815e3ba52744debaa4;hb=f176efd183ead0b3008eb502c78b00f0c127f992;hpb=62b57e34d9a0df1ce4b82650d7e328db5d048b39 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh old mode 100755 new mode 100644 index 6591772..98fa2ae --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -1,5 +1,4 @@ #!/bin/bash -# -*- tab-width: 8; indent-tabs-mode: t; -*- # # Run select tests by setting ONLY, or as arguments to the script. # Skip specific tests by setting EXCEPT. @@ -8,42 +7,17 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058 -ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c 77k" -# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! - -# skipped tests: LU-8411 LU-9096 LU-9054 .. -ALWAYS_EXCEPT=" 407 253 312 $ALWAYS_EXCEPT" - -if $SHARED_KEY; then -# bug number for skipped tests: LU-9795 (all below) - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f" -fi - -if [[ $(uname -m) = aarch64 ]]; then - # bug number: LU-11596 (all below) - ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c" - # bug number: LU-11671 LU-11594 LU-11667 LU-11729 - ALWAYS_EXCEPT+=" 45 103a 317 810" -fi # Check Grants after these tests -GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c" -SRCDIR=$(cd $(dirname $0); echo $PWD) -export PATH=$PATH:/sbin +GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d" -TMP=${TMP:-/tmp} OSC=${OSC:-"osc"} CC=${CC:-cc} -CHECKSTAT=${CHECKSTAT:-"checkstat -v"} CREATETEST=${CREATETEST:-createtest} -LFS=${LFS:-lfs} LVERIFY=${LVERIFY:-ll_dirstripe_verify} -LCTL=${LCTL:-lctl} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} -export MULTIOP=${MULTIOP:-multiop} READS=${READS:-"reads"} MUNLINK=${MUNLINK:-munlink} SOCKETSERVER=${SOCKETSERVER:-socketserver} @@ -56,27 +30,39 @@ CHECK_GRANT=${CHECK_GRANT:-"yes"} GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""} export PARALLEL=${PARALLEL:-"no"} -export NAME=${NAME:-local} - -SAVE_PWD=$PWD - -CLEANUP=${CLEANUP:-:} -SETUP=${SETUP:-:} TRACE=${TRACE:-""} -LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi} +LUSTRE=${LUSTRE:-$(dirname $0)/..} . $LUSTRE/tests/test-framework.sh init_test_env $@ -. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} -get_lustre_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 " + +if $SHARED_KEY; then + # bug number: LU-9795 LU-9795 LU-9795 LU-9795 + ALWAYS_EXCEPT+=" 17n 60a 133g 300f " +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" +fi + # 5 12 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o" if [ "$mds1_FSTYPE" = "zfs" ]; then - # bug number for skipped test: LU-1957 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180" + # bug number for skipped test: + ALWAYS_EXCEPT="$ALWAYS_EXCEPT " # 13 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b" fi @@ -119,6 +105,7 @@ elif [ -r /etc/os-release ]; then fi fi +build_test_filter FAIL_ON_ERROR=false cleanup() { @@ -155,8 +142,6 @@ rm -rf $DIR/[Rdfs][0-9]* check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS -build_test_filter - if [ "${ONLY}" = "MOUNT" ] ; then echo "Lustre is up, please go on" exit @@ -1142,7 +1127,7 @@ run_test 24u "create stripe file" simple_cleanup_common() { local rc=0 trap 0 - [ -z "$DIR" -o -z "$tdir" ] && return 0 + [ -z "$DIR" ] || [ -z "$tdir" ] && return 0 local start=$SECONDS rm -rf $DIR/$tdir @@ -1184,10 +1169,10 @@ test_24v() { local num_ls=$(ls $DIR/$tdir | wc -l) local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l) local num_all=$(ls -a $DIR/$tdir | wc -l) - if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \ - $num_all -ne $((nrfiles + 2)) ]; then - error "Expected $nrfiles files, got $num_ls " \ - "($num_uniq unique $num_all .&..)" + if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] || + [ $num_all -ne $((nrfiles + 2)) ]; then + error "Expected $nrfiles files, got $num_ls " \ + "($num_uniq unique $num_all .&..)" fi # LU-5 large readdir # dirent_size = 32 bytes for sizeof(struct lu_dirent) + @@ -1282,6 +1267,36 @@ test_24y() { } run_test 24y "rename/link on the same dir should succeed" +test_24z() { + [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] && + skip "Need MDS version at least 2.12.51" + + local index + + for index in 0 1; do + $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed" + touch $DIR/$tdir.0/$tfile.$index || error "touch failed" + done + + mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed" + + index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0) + [ $index -eq 0 ] || error "$tfile.0 is on MDT$index" + + local mdts=$(comma_list $(mdts_nodes)) + + do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0 + stack_trap "do_nodes $mdts $LCTL \ + set_param mdt.*.enable_remote_rename=1" EXIT + + mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed" + + index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1) + [ $index -eq 1 ] || error "$tfile.1 is on MDT$index" +} +run_test 24z "cross-MDT rename is done as cp" + test_24A() { # LU-3182 local NFILES=5000 @@ -1292,7 +1307,8 @@ test_24A() { # LU-3182 local t=$(ls $DIR/$tdir | wc -l) local u=$(ls $DIR/$tdir | sort -u | wc -l) local v=$(ls -ai $DIR/$tdir | sort -u | wc -l) - if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then + if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] || + [ $v -ne $((NFILES + 2)) ] ; then error "Expected $NFILES files, got $t ($u unique $v .&..)" fi @@ -1387,6 +1403,26 @@ test_24E() { } run_test 24E "cross MDT rename/link" +test_24F () { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + + local repeats=1000 + [ "$SLOW" = "no" ] && repeats=100 + + mkdir -p $DIR/$tdir + + echo "$repeats repeats" + for ((i = 0; i < repeats; i++)); do + $LFS mkdir -i0 -c2 $DIR/$tdir/test || error "mkdir fails" + touch $DIR/$tdir/test/a || error "touch fails" + mkdir $DIR/$tdir/test/b || error "mkdir fails" + rm -rf $DIR/$tdir/test || error "rmdir fails" + done + + true +} +run_test 24F "hash order vs readdir (LU-11330)" + test_25a() { echo '== symlink sanity =============================================' @@ -1480,6 +1516,112 @@ test_27b() { } run_test 27b "create and write to two stripe file" +# 27c family tests specific striping, setstripe -o +test_27ca() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + test_mkdir -p $DIR/$tdir + local osts="1" + + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + $LFS getstripe -i $DIR/$tdir/$tfile + [ $($LFS getstripe -i $DIR/$tdir/$tfile ) -eq $osts ] || + error "stripe not on specified OST" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27ca "one stripe on specified OST" + +test_27cb() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + test_mkdir -p $DIR/$tdir + local osts="1,0" + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # 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:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27cb "two stripes on specified OSTs" + +test_27cc() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + + test_mkdir -p $DIR/$tdir + local osts="0,0" + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # 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:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27cc "two stripes on the same OST" + +test_27cd() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + test_mkdir -p $DIR/$tdir + local osts="0,1,1,0" + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # 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:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27cd "four stripes on two OSTs" + +test_27ce() { + [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip_env "too many osts, skipping" + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + # We do one more stripe than we have OSTs + [ $OSTCOUNT -ge 159 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + test_mkdir -p $DIR/$tdir + local osts="" + for i in $(seq 0 $OSTCOUNT); + do + osts=$osts"0" + if [ $i -ne $OSTCOUNT ]; then + osts=$osts"," + fi + done + $LFS setstripe -o $osts $DIR/$tdir/$tfile || error "setstripe failed" + local getstripe=$($LFS getstripe $DIR/$tdir/$tfile) + echo "$getstripe" + + # 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:]]*$//') + [ "$getstripe_osts" = "${osts//,/ }" ] || + error "stripes not on specified OSTs" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 || error "dd failed" +} +run_test 27ce "more stripes than OSTs with -o" + test_27d() { test_mkdir $DIR/$tdir $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile || @@ -1520,6 +1662,16 @@ test_27g() { } run_test 27g "$LFS getstripe with no objects" +test_27ga() { + test_mkdir $DIR/$tdir + touch $DIR/$tdir/$tfile || error "touch failed" + ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed" + $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2 + local rc=$? + (( rc == 2 )) || error "getstripe did not return ENOENT" +} +run_test 27ga "$LFS getstripe with missing file (should return error)" + test_27i() { test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile || error "touch failed" @@ -1558,6 +1710,9 @@ run_test 27l "check setstripe permissions (should return error)" test_27m() { [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] && + skip_env "multiple clients -- skipping" + ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | head -n1) if [[ $ORIGFREE -gt $MAXFREE ]]; then @@ -1587,12 +1742,6 @@ test_27m() { } run_test 27m "create file while OST0 was full" -sleep_maxage() { - local delay=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | - awk '{ print $1 * 2; exit; }') - sleep $delay -} - # OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage) # if the OST isn't full anymore. reset_enospc() { @@ -1622,12 +1771,12 @@ exhaust_precreations() { # on the mdt's osc local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST) local last_id=$(do_facet $mfacet lctl get_param -n \ - osc.$mdtosc_proc1.prealloc_last_id) + osp.$mdtosc_proc1.prealloc_last_id) local next_id=$(do_facet $mfacet lctl get_param -n \ - osc.$mdtosc_proc1.prealloc_next_id) + osp.$mdtosc_proc1.prealloc_next_id) local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet) - do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc* + do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc* test_mkdir -p $DIR/$tdir/${OST} $LFS setstripe -i $OSTIDX -c 1 $DIR/$tdir/${OST} @@ -1635,7 +1784,7 @@ exhaust_precreations() { do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215 echo "Creating to objid $last_id on ost $OST..." createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2)) - do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc* + do_facet $mfacet lctl get_param osp.$mdtosc_proc2.prealloc* do_facet $ofacet lctl set_param fail_loc=$FAILLOC sleep_maxage } @@ -1878,9 +2027,9 @@ test_27y() { local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000) local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc.prealloc_last_id) + osp.$mdtosc.prealloc_last_id) local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc.prealloc_next_id) + osp.$mdtosc.prealloc_next_id) local fcount=$((last_id - next_id)) [[ $fcount -eq 0 ]] && skip "not enough space on OST0" [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT @@ -2122,7 +2271,8 @@ test_27B() { # LU-2523 } run_test 27B "call setstripe on open unlinked file/rename victim" -test_27C() { #LU-2871 +# 27C family tests full striping and overstriping +test_27Ca() { #LU-2871 [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" declare -a ost_idx @@ -2158,7 +2308,143 @@ test_27C() { #LU-2871 done done } -run_test 27C "check full striping across all OSTs" +run_test 27Ca "check full striping across all OSTs" + +test_27Cb() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip_env "too many osts, skipping" + + test_mkdir -p $DIR/$tdir + local setcount=$(($OSTCOUNT * 2)) + [ $setcount -ge 160 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + $LFS setstripe -C $setcount $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" +} +run_test 27Cb "more stripes than OSTs with -C" + +test_27Cc() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST" + + test_mkdir -p $DIR/$tdir + local setcount=$(($OSTCOUNT - 1)) + + [ $setcount -ge 160 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + $LFS setstripe -C $setcount $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" && + error "overstriped should not be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" +} +run_test 27Cc "fewer stripes than OSTs does not set overstriping" + +test_27Cd() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST" + large_xattr_enabled || skip_env "ea_inode feature disabled" + + test_mkdir -p $DIR/$tdir + local setcount=$LOV_MAX_STRIPE_COUNT + + $LFS setstripe -C $setcount $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" + + rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed" +} +run_test 27Cd "test maximum stripe count" + +test_27Ce() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + test_mkdir -p $DIR/$tdir + + pool_add $TESTNAME || error "Pool creation failed" + pool_add_targets $TESTNAME 0 || error "pool_add_targets failed" + + local setcount=8 + + $LFS setstripe -C $setcount -p "$TESTNAME" $DIR/$tdir/$tfile || + error "setstripe failed" + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" + + rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed" +} +run_test 27Ce "test pool with overstriping" + +test_27Cf() { + [[ $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping ]] || + skip "server does not support overstriping" + [[ $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && + skip_env "too many osts, skipping" + + test_mkdir -p $DIR/$tdir + + local setcount=$(($OSTCOUNT * 2)) + [ $setcount -ge 160 ] || large_xattr_enabled || + skip_env "ea_inode feature disabled" + + $LFS setstripe -C $setcount $DIR/$tdir/ || + error "setstripe failed" + + echo 1 > $DIR/$tdir/$tfile + + local count=$($LFS getstripe -c $DIR/$tdir/$tfile) + [ $count -eq $setcount ] || + error "stripe count $count, should be $setcount" + + $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "overstriped" || + error "overstriped should be set in pattern" + + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=4 conv=notrunc || + error "dd failed" + + rm -f $DIR/$tdir/$tfile || error "Delete $tfile failed" +} +run_test 27Cf "test default inheritance with overstriping" test_27D() { [ $OSTCOUNT -lt 2 ] && skip_env "needs >= 2 OSTs" @@ -2183,9 +2469,14 @@ test_27D() { local skip27D [ $MDS1_VERSION -lt $(version_code 2.8.55) ] && skip27D+="-s 29" - [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \ - $CLIENT_VERSION -lt $(version_code 2.9.55) ] && - skip27D+=" -s 30,31" + [ $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" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D || error "llapi_layout_test failed" @@ -2218,8 +2509,12 @@ test_27E() { $LFS setstripe -c $OSTCOUNT $DIR/$tfile || error "setstripe failed" - cat $DIR/$tfile - rm $DIR/$tfile + # In order to ensure stat() call actually talks to MDS we need to + # do something drastic to this file to shake off all lock, e.g. + # rename it (kills lookup lock forcing cache cleaning) + mv $DIR/$tfile $DIR/${tfile}-1 + ls -l $DIR/${tfile}-1 + rm $DIR/${tfile}-1 easize=$($LCTL get_param -n llite.*.default_easize) @@ -2270,8 +2565,10 @@ test_27F() { # LU-5346/LU-7975 run_test 27F "Client resend delayed layout creation with non-zero size" test_27G() { #LU-10629 - [ -n "$FILESET" ] && skip "SKIP due to FILESET set" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return + [ $MDS1_VERSION -lt $(version_code 2.11.51) ] && + skip "Need MDS version at least 2.11.51" + [ -n "$FILESET" ] && skip "SKIP due to FILESET set" + remote_mds_nodsh && skip "remote MDS with nodsh" local POOL=${POOL:-testpool} local ostrange="0 0 1" @@ -2320,6 +2617,217 @@ test_27H() { } run_test 27H "Set specific OSTs stripe" +test_27I() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + local pool=$TESTNAME + local ostrange="1 1 1" + + save_layout_restore_at_exit $MOUNT + $LFS setstripe -c 2 -i 0 $MOUNT + pool_add $pool || error "pool_add failed" + pool_add_targets $pool $ostrange || "pool_add_targets failed" + test_mkdir $DIR/$tdir + $LFS setstripe -p $pool $DIR/$tdir + $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed" + $LFS getstripe $DIR/$tdir/$tfile +} +run_test 27I "check that root dir striping does not break parent dir one" + +test_27J() { + [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] && + skip "Need MDS version newer than 2.12.51" + + test_mkdir $DIR/$tdir + local uuid1=$(cat /proc/sys/kernel/random/uuid) + local uuid2=$(cat /proc/sys/kernel/random/uuid) + + # create foreign file (raw way) + create_foreign_file -f $DIR/$tdir/$tfile -x "${uuid1}@${uuid2}" \ + -t 1 -F 0xda08 || error "create_foreign_file failed" + + # verify foreign file (raw way) + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_magic: 0x0BD70BD0" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign magic" + parse_foreign_file -f $DIR/$tdir/$tfile | grep "lov_xattr_size: 89" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign size" + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_size: 73" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign size" + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_type: 1" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign type" + parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_flags: 0x0000DA08" || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign flags" + local lov=$(parse_foreign_file -f $DIR/$tdir/$tfile | + grep "lov_foreign_value: 0x" | + sed -e 's/lov_foreign_value: 0x//') + local lov2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160) + [[ $lov = ${lov2// /} ]] || + error "$DIR/$tdir/$tfile: invalid LOV EA foreign value" + + # create foreign file (lfs + API) + $LFS setstripe --foreign=daos --flags 0xda08 \ + -x "${uuid1}@${uuid2}" $DIR/$tdir/${tfile}2 || + error "$DIR/$tdir/${tfile}2: create failed" + + $LFS getstripe -v $DIR/$tdir/${tfile}2 | + grep "lfm_magic:.*0x0BD70BD0" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign magic" + # lfm_length is LOV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_length:.*73" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign size" + $LFS getstripe -v $DIR/$tdir/${tfile}2 | grep "lfm_type:.*daos" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign type" + $LFS getstripe -v $DIR/$tdir/${tfile}2 | + grep "lfm_flags:.*0x0000DA08" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign flags" + $LFS getstripe $DIR/$tdir/${tfile}2 | + grep "lfm_value:.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/${tfile}2: invalid LOV EA foreign value" + + # modify striping should fail + $LFS setstripe -c 2 $DIR/$tdir/$tfile && + error "$DIR/$tdir/$tfile: setstripe should fail" + $LFS setstripe -c 2 $DIR/$tdir/${tfile}2 && + error "$DIR/$tdir/${tfile}2: setstripe should fail" + + # R/W should fail + cat $DIR/$tdir/$tfile && error "$DIR/$tdir/$tfile: read should fail" + cat $DIR/$tdir/${tfile}2 && + error "$DIR/$tdir/${tfile}2: read should fail" + cat /etc/passwd > $DIR/$tdir/$tfile && + error "$DIR/$tdir/$tfile: write should fail" + cat /etc/passwd > $DIR/$tdir/${tfile}2 && + error "$DIR/$tdir/${tfile}2: write should fail" + + # chmod should work + chmod 222 $DIR/$tdir/$tfile || + error "$DIR/$tdir/$tfile: chmod failed" + chmod 222 $DIR/$tdir/${tfile}2 || + error "$DIR/$tdir/${tfile}2: chmod failed" + + # chown should work + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tfile || + error "$DIR/$tdir/$tfile: chown failed" + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tfile}2 || + error "$DIR/$tdir/${tfile}2: chown failed" + + # rename should work + mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}.new || + error "$DIR/$tdir/$tfile: rename of foreign file has failed" + mv $DIR/$tdir/${tfile}2 $DIR/$tdir/${tfile}2.new || + error "$DIR/$tdir/${tfile}2: rename of foreign file has failed" + + #remove foreign file + rm $DIR/$tdir/${tfile}.new || + error "$DIR/$tdir/${tfile}.new: remove of foreign file has failed" + rm $DIR/$tdir/${tfile}2.new || + error "$DIR/$tdir/${tfile}2.new: remove of foreign file has failed" +} +run_test 27J "basic ops on file with foreign LOV" + +test_27K() { + [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] && + skip "Need MDS version newer than 2.12.49" + + test_mkdir $DIR/$tdir + local uuid1=$(cat /proc/sys/kernel/random/uuid) + local uuid2=$(cat /proc/sys/kernel/random/uuid) + + # create foreign dir (raw way) + create_foreign_dir -d $DIR/$tdir/$tdir -x "${uuid1}@${uuid2}" -t 1 || + error "create_foreign_dir FAILED" + + # verify foreign dir (raw way) + parse_foreign_dir -d $DIR/$tdir/$tdir | + grep "lmv_foreign_magic:.*0xcd50cd0" || + error "$DIR/$tdir/$tfile: invalid LMV EA magic" + parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_xattr_size:.*89$" || + error "$DIR/$tdir/$tdir: invalid LMV EA size" + parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_type: 1$" || + error "$DIR/$tdir/$tdir: invalid LMV EA type" + parse_foreign_dir -d $DIR/$tdir/$tdir | grep "lmv_foreign_flags: 0$" || + error "$DIR/$tdir/$tdir: invalid LMV EA flags" + local lmv=$(parse_foreign_dir -d $DIR/$tdir/$tdir | + grep "lmv_foreign_value: 0x" | + sed 's/lmv_foreign_value: 0x//') + local lmv2=$(echo -n "${uuid1}@${uuid2}" | od -A n -t x1 -w160 | + sed 's/ //g') + [[ $lmv == $lmv2 ]] || error "$DIR/$tdir/$tdir: invalid LMV EA value" + + # create foreign dir (lfs + API) + $LFS mkdir --foreign=daos --xattr="${uuid1}@${uuid2}" --flags=0xda05 \ + $DIR/$tdir/${tdir}2 || + error "$DIR/$tdir/${tdir}2: create failed" + + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_magic:.*0x0CD50CD0" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA magic" + # lfm_length is LMV EA size - sizeof(lfm_magic) - sizeof(lfm_length) + # - sizeof(lfm_type) - sizeof(lfm_flags) + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_length:.*73" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA size" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | grep "lfm_type:.*daos" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA type" + $LFS getdirstripe -v $DIR/$tdir/${tdir}2 | + grep "lfm_flags:.*0x0000DA05" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA flags" + $LFS getdirstripe $DIR/$tdir/${tdir}2 | + grep "lfm_value.*${uuid1}@${uuid2}" || + error "$DIR/$tdir/${tdir}2: invalid LMV EA value" + + # file create in dir should fail + touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail" + touch $DIR/$tdir/${tdir}2/$tfile && + "$DIR/${tdir}2: file create should fail" + + # chmod should work + chmod 777 $DIR/$tdir/$tdir || + error "$DIR/$tdir: chmod failed" + chmod 777 $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chmod failed" + + # chown should work + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/$tdir || + error "$DIR/$tdir: chown failed" + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/${tdir}2 || + error "$DIR/${tdir}2: chown failed" + + # rename should work + mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new || + error "$DIR/$tdir/$tdir: rename of foreign dir has failed" + mv $DIR/$tdir/${tdir}2 $DIR/$tdir/${tdir}2.new || + error "$DIR/$tdir/${tdir}2: rename of foreign dir has failed" + + #remove foreign dir + rmdir $DIR/$tdir/${tdir}.new || + error "$DIR/$tdir/${tdir}.new: remove of foreign dir has failed" + rmdir $DIR/$tdir/${tdir}2.new || + error "$DIR/$tdir/${tdir}2.new: remove of foreign dir has failed" +} +run_test 27K "basic ops on dir with foreign LMV" + +test_27L() { + remote_mds_nodsh && skip "remote MDS with nodsh" + + local POOL=${POOL:-$TESTNAME} + + if ! combined_mgs_mds ; then + mount_mgs_client + trap umount_mgs_client EXIT + fi + + pool_add $POOL || error "pool_add failed" + + lfs pool_list $MOUNT | grep -Fx "${FSNAME}.${POOL}" || + error "pool_list does not contain ${FSNAME}.${POOL}:" \ + "$(lfs pool_list $MOUNT | grep -F "${POOL}")" +} +run_test 27L "lfs pool_list gives correct pool name" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -2574,10 +3082,10 @@ test_31n() { run_test 31n "check link count of unlinked file" link_one() { - local TEMPNAME=$(mktemp $1_XXXXXX) - mlink $TEMPNAME $1 2> /dev/null && - echo "$BASHPID: link $TEMPNAME to $1 succeeded" - munlink $TEMPNAME + local tempfile=$(mktemp $1_XXXXXX) + mlink $tempfile $1 2> /dev/null && + echo "$BASHPID: link $tempfile to $1 succeeded" + munlink $tempfile } test_31o() { # LU-2901 @@ -3280,7 +3788,7 @@ subr_36fh() { sleep 1 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache - cancel_lru_locks osc + cancel_lru_locks $OSC LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object date; date +%s [ "$LS_BEFORE" != "$LS_AFTER" ] && \ @@ -3303,30 +3811,36 @@ run_test 36f "utime on file racing with OST BRW write ==========" test_36g() { remote_ost_nodsh && skip "remote OST with nodsh" [ $PARALLEL == "yes" ] && skip "skip parallel run" + [ $MDS1_VERSION -lt $(version_code 2.12.51) ] && + skip "Need MDS version at least 2.12.51" local fmd_max_age - local fmd_before - local fmd_after + local fmd + local facet="ost1" + local tgt="obdfilter" + + [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1" test_mkdir $DIR/$tdir - fmd_max_age=$(do_facet ost1 \ - "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \ + fmd_max_age=$(do_facet $facet \ + "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \ head -n 1") - fmd_before=$(do_facet ost1 \ - "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo") + echo "FMD max age: ${fmd_max_age}s" touch $DIR/$tdir/$tfile + fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" | + gawk '{cnt=cnt+$1} END{print cnt}') + echo "FMD before: $fmd" + [[ $fmd == 0 ]] && + error "FMD wasn't create by touch" sleep $((fmd_max_age + 12)) - fmd_after=$(do_facet ost1 \ - "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo") - - echo "fmd_before: $fmd_before" - echo "fmd_after: $fmd_after" - [[ $fmd_after -gt $fmd_before ]] && - echo "AFTER: $fmd_after > BEFORE: $fmd_before" && - error "fmd didn't expire after ping" || true + fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" | + gawk '{cnt=cnt+$1} END{print cnt}') + echo "FMD after: $fmd" + [[ $fmd == 0 ]] || + error "FMD wasn't expired by ping" } -run_test 36g "filter mod data cache expiry =====================" +run_test 36g "FMD cache expiry =====================" test_36h() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -3423,7 +3937,7 @@ test_39b() { [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime" [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3457,7 +3971,7 @@ test_39c() { [ "$mtime2" = "$mtime3" ] || \ error "mtime ($mtime2) changed (to $mtime3) on rename" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3475,7 +3989,7 @@ test_39d() { [ $mtime = $TEST_39_MTIME ] || \ error "mtime($mtime) is not set to $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3495,7 +4009,7 @@ test_39e() { [ $mtime2 = $TEST_39_MTIME ] || \ error "mtime($mtime2) is not set to $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3516,7 +4030,7 @@ test_39f() { [ $mtime2 = $TEST_39_MTIME ] || \ error "mtime($mtime2) is not set to $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3537,7 +4051,7 @@ test_39g() { [ "$mtime1" = "$mtime2" ] || \ error "lost mtime: $mtime2, should be $mtime1" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3564,7 +4078,7 @@ test_39h() { [ "$mtime2" = $TEST_39_MTIME ] || \ error "lost mtime: $mtime2, should be $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done fi @@ -3588,7 +4102,7 @@ test_39i() { [ "$mtime1" = "$mtime2" ] || \ error "lost mtime: $mtime2, should be $mtime1" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3619,7 +4133,7 @@ test_39j() { error "mtime is lost on close: $mtime2, " \ "should be $mtime1" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done lctl set_param fail_loc=0 @@ -3723,7 +4237,7 @@ test_39m() { [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \ error "atime or mtime set incorrectly" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -4078,15 +4592,13 @@ run_test 43A "execution of file opened for write should return -ETXTBSY" test_43a() { test_mkdir $DIR/$tdir - cp -p $(which $MULTIOP) $DIR/$tdir/multiop || - cp -p multiop $DIR/$tdir/multiop - MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || - error "multiop open $TMP/$tfile.junk failed" - rm $TMP/$tfile.junk # delete junk file on close (not part of test) - MULTIOP_PID=$! - $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success" - kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" - wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed" + cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy" + $DIR/$tdir/sleep 60 & + SLEEP_PID=$! + # Make sure exec of $tdir/sleep wins race with truncate + sleep 1 + $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success" + kill $SLEEP_PID } run_test 43a "open(RDWR) of file being executed should return -ETXTBSY" @@ -4094,15 +4606,13 @@ test_43b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" test_mkdir $DIR/$tdir - cp -p $(which $MULTIOP) $DIR/$tdir/multiop || - cp -p multiop $DIR/$tdir/multiop - MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || - error "multiop open $TMP/$tfile.junk failed" - rm $TMP/$tfile.junk # delete junk file on close (not part of test) - MULTIOP_PID=$! - $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success" - kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" - wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed" + cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy" + $DIR/$tdir/sleep 60 & + SLEEP_PID=$! + # Make sure exec of $tdir/sleep wins race with truncate + sleep 1 + $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success" + kill $SLEEP_PID } run_test 43b "truncate of file being executed should return -ETXTBSY" @@ -4603,7 +5113,7 @@ test_53() { local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) local value for value in $(do_facet $SINGLEMDS \ - $LCTL get_param osc.$mdtosc.prealloc_last_id) ; do + $LCTL get_param osp.$mdtosc.prealloc_last_id) ; do param=$(echo ${value[0]} | cut -d "=" -f1) ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2) @@ -5050,6 +5560,41 @@ test_56o() { } run_test 56o "check lfs find -mtime for old files" +test_56ob() { + local dir=$DIR/$tdir + local expected=1 + local count=0 + + # just to make sure there is something that won't be found + test_mkdir $dir + touch $dir/$tfile.now + + for age in year week day hour min; do + count=$((count + 1)) + + touch $dir/$tfile-a.$age $dir/$tfile-m.$age + touch --date="$count $age ago" -a $dir/$tfile-a.$age + touch --date="$count $age ago" -m $dir/$tfile-m.$age + + local cmd="$LFS find $dir -mtime $count${age:0:1}" + local nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find $dir -atime $count${age:0:1}" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + done + + sleep 2 + cmd="$LFS find $dir -ctime +1s -type f" + nums=$($cmd | wc -l) + (( $nums == $count * 2 + 1)) || + error "'$cmd' wrong: found $nums, expected $((expected*2+1))" +} +run_test 56ob "check lfs find -atime -mtime -ctime with units" + test_56p() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" @@ -5767,7 +6312,7 @@ check_migrate_links() { # make sure hard links were properly detected, and migration was # performed only once for the entire link set; nonlinked files should # also be migrated - local actual=$(grep -c 'done migrate' <<< "$migrate_out") + local actual=$(grep -c 'done' <<< "$migrate_out") local expected=$(($uniq_count + 1)) [ "$actual" -eq "$expected" ] || @@ -5792,22 +6337,98 @@ test_56xb() { test_mkdir "$dir" || error "cannot create dir $dir" echo "testing lfs migrate mode when all links fit within xattrs" - LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 2 99 + LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 2 99 echo "testing rsync mode when all links fit within xattrs" - LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 2 99 + LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 2 99 echo "testing lfs migrate mode when all links do not fit within xattrs" - LFS_MIGRATE_RSYNC=false check_migrate_links "$dir" 101 100 + LFS_MIGRATE_RSYNC_MODE=false check_migrate_links "$dir" 101 100 echo "testing rsync mode when all links do not fit within xattrs" - LFS_MIGRATE_RSYNC=true check_migrate_links "$dir" 101 100 + LFS_MIGRATE_RSYNC_MODE=true check_migrate_links "$dir" 101 100 + # clean up rm -rf $dir } run_test 56xb "lfs migration hard link support" +test_56xc() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + + local dir="$DIR/$tdir" + + test_mkdir "$dir" || error "cannot create dir $dir" + + # Test 1: ensure file < 1 GB is always migrated with 1 stripe + echo -n "Setting initial stripe for 20MB test file..." + $LFS setstripe -c 2 -i 0 "$dir/20mb" || + error "cannot setstripe 20MB file" + echo "done" + echo -n "Sizing 20MB test file..." + truncate "$dir/20mb" 20971520 || error "cannot create 20MB test file" + echo "done" + echo -n "Verifying small file autostripe count is 1..." + $LFS_MIGRATE -y -A -C 1 "$dir/20mb" || + error "cannot migrate 20MB file" + local stripe_count=$($LFS getstripe -c "$dir/20mb") || + error "cannot get stripe for $dir/20mb" + [ $stripe_count -eq 1 ] || + error "unexpected stripe count $stripe_count for 20MB file" + rm -f "$dir/20mb" + echo "done" + + # Test 2: File is small enough to fit within the available space on + # sqrt(size_in_gb) + 1 OSTs but is larger than 1GB. The file must + # have at least an additional 1KB for each desired stripe for test 3 + echo -n "Setting stripe for 1GB test file..." + $LFS setstripe -c 1 -i 0 "$dir/1gb" || error "cannot setstripe 1GB file" + echo "done" + echo -n "Sizing 1GB test file..." + # File size is 1GB + 3KB + truncate "$dir/1gb" 1073744896 || error "cannot create 1GB test file" + echo "done" + + # need at least 512MB per OST for 1GB file to fit in 2 stripes + local avail=$($LCTL get_param -n llite.$FSNAME*.kbytesavail) + if (( avail > 524288 * OSTCOUNT )); then + echo -n "Migrating 1GB file..." + $LFS_MIGRATE -y -A -C 1 "$dir/1gb" || + error "cannot migrate 1GB file" + echo "done" + echo -n "Verifying autostripe count is sqrt(n) + 1..." + stripe_count=$($LFS getstripe -c "$dir/1gb") || + error "cannot getstripe for 1GB file" + [ $stripe_count -eq 2 ] || + error "unexpected stripe count $stripe_count != 2" + echo "done" + fi + + # Test 3: File is too large to fit within the available space on + # sqrt(n) + 1 OSTs. Simulate limited available space with -X + if [ $OSTCOUNT -ge 3 ]; then + # The required available space is calculated as + # file size (1GB + 3KB) / OST count (3). + local kb_per_ost=349526 + + echo -n "Migrating 1GB file with limit..." + $LFS_MIGRATE -y -A -C 1 -X $kb_per_ost "$dir/1gb" || + error "cannot migrate 1GB file with limit" + echo "done" + + stripe_count=$($LFS getstripe -c "$dir/1gb") + echo -n "Verifying 1GB autostripe count with limited space..." + [ "$stripe_count" -a $stripe_count -ge 3 ] || + error "unexpected stripe count $stripe_count (min 3)" + echo "done" + fi + + # clean up + rm -rf $dir +} +run_test 56xc "lfs migration autostripe" + test_56y() { [ $MDS1_VERSION -lt $(version_code 2.4.53) ] && skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" @@ -5850,18 +6471,20 @@ test_56z() { # LU-4824 test_mkdir $dir for i in d{0..9}; do test_mkdir $dir/$i + touch $dir/$i/$tfile done - touch $dir/d{0..9}/$tfile $LFS find $DIR/non_existent_dir $dir && error "$LFS find did not return an error" # Make a directory unsearchable. This should NOT be the last entry in # directory order. Arbitrarily pick the 6th entry chmod 700 $($LFS find $dir -type d | sed '6!d') + $RUNAS $LFS find $DIR/non_existent $dir local count=$($RUNAS $LFS find $DIR/non_existent $dir | wc -l) # The user should be able to see 10 directories and 9 files - [ $count == 19 ] || error "$LFS find did not continue after error" + (( count == 19 )) || + error "$LFS find found $count != 19 entries after error" } run_test 56z "lfs find should continue after an error" @@ -6157,7 +6780,7 @@ test_60a() { skip_env "missing subtest run-llog.sh" log "$TEST60_HEAD - from kernel mode" - do_facet mgs "$LCTL set_param debug=warning; $LCTL dk > /dev/null" + do_facet mgs "$LCTL dk > /dev/null" do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed" do_facet mgs $LCTL dk > $TMP/$tfile @@ -6184,9 +6807,9 @@ test_60a() { local pass=true #get fid and record list - fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile | + fid_list=($(awk '/9_sub.*record/ { print $NF }' $TMP/$tfile | tail -n 4)) - rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile | + rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' $TMP/$tfile | tail -n 4)) #remount mgs as ldiskfs or zfs type stop mgs || error "stop mgs failed" @@ -6305,13 +6928,16 @@ run_test 60e "no space while new llog is being created" test_60g() { local pid + local i test_mkdir -c $MDSCOUNT $DIR/$tdir - $LFS setdirstripe -D -i -1 -c $MDSCOUNT $DIR/$tdir ( local index=0 while true; do + $LFS setdirstripe -i $(($index % $MDSCOUNT)) \ + -c $MDSCOUNT $DIR/$tdir/subdir$index \ + 2>/dev/null mkdir $DIR/$tdir/subdir$index 2>/dev/null rmdir $DIR/$tdir/subdir$index 2>/dev/null index=$((index + 1)) @@ -6320,20 +6946,71 @@ test_60g() { pid=$! - for i in $(seq 100); do + for i in {0..100}; do # define OBD_FAIL_OSD_TXN_START 0x19a - do_facet mds1 lctl set_param fail_loc=0x8000019a + local index=$((i % MDSCOUNT + 1)) + + do_facet mds$index $LCTL set_param fail_loc=0x8000019a \ + > /dev/null usleep 100 done kill -9 $pid + for i in $(seq $MDSCOUNT); do + do_facet mds$i $LCTL set_param fail_loc=0 > /dev/null + done + mkdir $DIR/$tdir/new || error "mkdir failed" rmdir $DIR/$tdir/new || error "rmdir failed" + + do_facet mds1 $LCTL lfsck_start -M $(facet_svc mds1) -A -C \ + -t namespace + for i in $(seq $MDSCOUNT); do + wait_update_facet mds$i "$LCTL get_param -n \ + mdd.$(facet_svc mds$i).lfsck_namespace | + awk '/^status/ { print \\\$2 }'" "completed" + done + + ls -R $DIR/$tdir || error "ls failed" + rm -rf $DIR/$tdir || error "rmdir failed" } run_test 60g "transaction abort won't cause MDT hung" -test_61() { +test_60h() { + [ $MDS1_VERSION -le $(version_code 2.12.52) ] && + skip "Need MDS version at least 2.12.52" + [ $MDSCOUNT -lt 2 ] && skip "Need at least 2 MDTs" + + local f + + #define OBD_FAIL_MDS_STRIPE_CREATE 0x188 + #define OBD_FAIL_MDS_STRIPE_FID 0x189 + for fail_loc in 0x80000188 0x80000189; do + do_facet mds1 "$LCTL set_param fail_loc=$fail_loc" + $LFS mkdir -c $MDSCOUNT -i 0 $DIR/$tdir-$fail_loc || + error "mkdir $dir-$fail_loc failed" + for i in {0..10}; do + # create may fail on missing stripe + echo $i > $DIR/$tdir-$fail_loc/$i + done + $LFS getdirstripe $DIR/$tdir-$fail_loc || + error "getdirstripe $tdir-$fail_loc failed" + $LFS migrate -m 1 $DIR/$tdir-$fail_loc || + error "migrate $tdir-$fail_loc failed" + $LFS getdirstripe $DIR/$tdir-$fail_loc || + error "getdirstripe $tdir-$fail_loc failed" + pushd $DIR/$tdir-$fail_loc + for f in *; do + echo $f | cmp $f - || error "$f data mismatch" + done + popd + rm -rf $DIR/$tdir-$fail_loc + done +} +run_test 60h "striped directory with missing stripes can be accessed" + +test_61a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" f="$DIR/f61" @@ -6342,7 +7019,12 @@ test_61() { $MULTIOP $f OSMWUc || error "$MULTIOP $f failed" sync } -run_test 61 "mmap() writes don't make sync hang ================" +run_test 61a "mmap() writes don't make sync hang ================" + +test_61b() { + mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed" +} +run_test 61b "mmap() of unstriped file is successful" # bug 2330 - insufficient obd_match error checking causes LBUG test_62() { @@ -6558,9 +7240,9 @@ test_65d() { if [[ $STRIPECOUNT -le 0 ]]; then sc=1 - elif [[ $STRIPECOUNT -gt 2000 ]]; then -#LOV_MAX_STRIPE_COUNT is 2000 - [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1)) + elif [[ $STRIPECOUNT -gt $LOV_MAX_STRIPE_COUNT ]]; then + [[ $OSTCOUNT -gt $LOV_MAX_STRIPE_COUNT ]] && + sc=$LOV_MAX_STRIPE_COUNT || sc=$(($OSTCOUNT - 1)) else sc=$(($STRIPECOUNT - 1)) fi @@ -6646,7 +7328,7 @@ test_65j() { # bug6367 sync; sleep 1 # if we aren't already remounting for each test, do so for this test - if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then + if [ "$I_MOUNTED" = "yes" ]; then cleanup || error "failed to unmount" setup fi @@ -6657,7 +7339,7 @@ test_65j() { # bug6367 } run_test 65j "set default striping on root directory (bug 6367)=" -cleaup_65k() { +cleanup_65k() { rm -rf $DIR/$tdir wait_delete_completed do_facet $SINGLEMDS "lctl set_param -n \ @@ -6667,7 +7349,7 @@ cleaup_65k() { do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate echo $INACTIVE_OSC "is Activate" - wait_osc_import_state mds ost$ostnum FULL + wait_osc_import_state mds ost$(( ostnum + 1 )) FULL } test_65k() { # bug11679 @@ -6727,7 +7409,7 @@ test_65k() { # bug11679 do_facet $SINGLEMDS lctl --device %$INACTIVE_OSC activate echo $INACTIVE_OSC "is Activate" - wait_osc_import_state mds ost$ostnum FULL + wait_osc_import_state mds ost$(( ostnum + 1 )) FULL done } run_test 65k "validate manual striping works properly with deactivated OSCs" @@ -6752,6 +7434,7 @@ test_65m() { run_test 65m "normal user can't set filesystem default stripe" test_65n() { + [ -n "$FILESET" ] && skip "Not functional for FILESET set" [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] || skip "Need MDS version at least 2.12.50" [[ $PARALLEL != "yes" ]] || skip "skip parallel run" @@ -6916,11 +7599,11 @@ test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 || error "$RUNAS dd $DIR/$tfile failed" # See if we are still setuid/sgid - test -u $DIR/$tfile -o -g $DIR/$tfile && + [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] && error "S/gid is not dropped on write" # Now test that MDS is updated too cancel_lru_locks mdc - test -u $DIR/$tfile -o -g $DIR/$tfile && + [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] && error "S/gid is not dropped on MDS" rm -f $DIR/$tfile } @@ -7085,9 +7768,22 @@ CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type | set_checksum_type() { lctl set_param -n osc.*osc-[^mM]*.checksum_type $1 - log "set checksum type to $1" - return 0 + rc=$? + log "set checksum type to $1, rc = $rc" + return $rc +} + +get_osc_checksum_type() +{ + # arugment 1: OST name, like OST0000 + ost=$1 + checksum_type=$(lctl get_param -n osc.*${ost}-osc-[^mM]*.checksum_type | + sed 's/.*\[\(.*\)\].*/\1/g') + rc=$? + [ $rc -ne 0 ] && error "failed to get checksum type of $ost, rc = $rc, output = $checksum_type" + echo $checksum_type } + F77_TMP=$TMP/f77-temp F77SZ=8 setup_f77() { @@ -7320,6 +8016,9 @@ test_77k() { # LU-10906 checksum=$(eval $get_checksum) [ $checksum -eq $i ] || error "checksum($checksum) != $i" done + # remove persistent param to avoid races with checksum mountopt below + do_facet mgs $LCTL set_param -P -d $cksum_param || + error "failed to delete checksum on MGS" for opt in "checksum" "nochecksum"; do #remount with mount option @@ -7336,8 +8035,40 @@ test_77k() { # LU-10906 } run_test 77k "enable/disable checksum correctly" -[ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true -rm -f $F77_TMP +test_77l() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + $GSS && skip_env "could not run with gss" + + set_checksums 1 + stack_trap "set_checksums $ORIG_CSUM" EXIT + stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT + + set_checksum_type invalid && error "unexpected success of invalid checksum type" + + $LFS setstripe -c 1 -i 0 $DIR/$tfile + for algo in $CKSUM_TYPES; do + set_checksum_type $algo || error "fail to set checksum type $algo" + osc_algo=$(get_osc_checksum_type OST0000) + [ "$osc_algo" != "$algo" ] && error "checksum type is $osc_algo after setting it to $algo" + + # no locks, no reqs to let the connection idle + cancel_lru_locks osc + lru_resize_disable osc + wait_osc_import_state client ost1 IDLE + + # ensure ost1 is connected + stat $DIR/$tfile >/dev/null || error "can't stat" + wait_osc_import_state client ost1 FULL + + osc_algo=$(get_osc_checksum_type OST0000) + [ "$osc_algo" != "$algo" ] && error "checksum type changed from $algo to $osc_algo after reconnection" + done + return 0 +} +run_test 77l "preferred checksum type is remembered after reconnected" + +[ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true +rm -f $F77_TMP unset F77_TMP cleanup_test_78() { @@ -7734,12 +8465,14 @@ test_101c() { cancel_lru_locks osc $LCTL set_param osc.*.rpc_stats 0 $READS -f $DIR/$tfile -s$FILE_LENGTH -b$rsize -n$nreads -t 180 + $LCTL get_param osc.*.rpc_stats for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do local stats=$($LCTL get_param -n $osc_rpc_stats) local lines=$(echo "$stats" | awk 'END {print NR;}') local size if [ $lines -le 20 ]; then + echo "continue debug" continue fi for size in 1 2 4 8; do @@ -7799,7 +8532,7 @@ test_101d() { rm -f $file wait_delete_completed - [ $raOFF -le 1 -o $raON -lt $raOFF ] || + [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] || error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M" } run_test 101d "file read with and without read-ahead enabled" @@ -7923,13 +8656,17 @@ test_101g() { $LFS setstripe -i 0 -c 1 $DIR/$tfile local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1) - if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \ - \( $OST1_VERSION -ge $(version_code 2.7.17) -a \ - $OST1_VERSION -lt $(version_code 2.7.50) \) ] && - [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \ - \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \ - $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then - [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M" + + if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] || + { [ $OST1_VERSION -ge $(version_code 2.7.17) ] && + [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } && + { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] || + { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] && + [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then + + [ $OST1_VERSION -ge $(version_code 2.9.52) ] && + suffix="M" + if [[ $orig_mb -lt 16 ]]; then save_lustre_params $osts "$brw_size" > $p do_nodes $list $LCTL set_param -n $brw_size=16$suffix || @@ -7955,6 +8692,26 @@ test_101g() { } run_test 101g "Big bulk(4/16 MiB) readahead" +test_101h() { + $LFS setstripe -i 0 -c 1 $DIR/$tfile + + dd if=/dev/zero of=$DIR/$tfile bs=1M count=70 || + error "dd 70M file failed" + echo Cancel LRU locks on lustre client to flush the client cache + cancel_lru_locks osc + + echo "Reset readahead stats" + $LCTL set_param -n llite.*.read_ahead_stats 0 + + echo "Read 10M of data but cross 64M bundary" + dd if=$DIR/$tfile of=/dev/null bs=10M skip=6 count=1 + local miss=$($LCTL get_param -n llite.*.read_ahead_stats | + get_named_value 'misses' | cut -d" " -f1 | calc_total) + [ $miss -eq 1 ] || error "expected miss 1 but got $miss" + rm -f $p $DIR/$tfile +} +run_test 101h "Readahead should cover current read window" + setup_test102() { test_mkdir $DIR/$tdir chown $RUNAS_ID $DIR/$tdir @@ -8180,11 +8937,19 @@ grow_xattr() { local file=$DIR/$tfile local value="$(generate_string $xsize)" local xbig=trusted.big + local toobig=$2 touch $file log "save $xbig on $file" - setfattr -n $xbig -v $value $file || - error "saving $xbig on $file failed" + if [ -z "$toobig" ] + then + setfattr -n $xbig -v $value $file || + error "saving $xbig on $file failed" + else + setfattr -n $xbig -v $value $file && + error "saving $xbig on $file succeeded" + return 0 + fi local orig=$(get_xattr_value $xbig $file) [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig" @@ -8215,7 +8980,12 @@ run_test 102h "grow xattr from inside inode to external block" test_102ha() { large_xattr_enabled || skip_env "ea_inode feature disabled" + echo "setting xattr of max xattr size: $(max_xattr_size)" grow_xattr $(max_xattr_size) + + echo "setting xattr of > max xattr size: $(max_xattr_size) + 10" + echo "This should fail:" + grow_xattr $(($(max_xattr_size) + 10)) 1 } run_test 102ha "grow xattr from inside inode to external inode" @@ -8552,9 +9322,9 @@ test_103a() { echo "performing permissions..." run_acl_subtest permissions || error "permissions failed" # LU-1482 mdd: Setting xattr are properly checked with and without ACLs - if [ $MDS1_VERSION -gt $(version_code 2.8.55) -o \ - \( $MDS1_VERSION -lt $(version_code 2.6) -a \ - $MDS1_VERSION -ge $(version_code 2.5.29) \) ] + if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] || + { [ $MDS1_VERSION -lt $(version_code 2.6) ] && + [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; } then echo "performing permissions xattr..." run_acl_subtest permissions_xattr || @@ -8598,6 +9368,7 @@ test_103a() { run_test 103a "acl test" test_103b() { + declare -a pids local U for U in {0..511}; do @@ -8622,6 +9393,12 @@ test_103b() { error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'" rm -f $DIR/$tfile.[smp]$0 } & + local pid=$! + + # limit the concurrently running threads to 64. LU-11878 + local idx=$((U % 64)) + [ -z "${pids[idx]}" ] || wait ${pids[idx]} + pids[idx]=$pid done wait } @@ -8655,7 +9432,7 @@ test_104a() { lfs df || error "lfs df with deactivated OSC failed" lctl --device %$OSC activate # wait the osc back to normal - wait_osc_import_state client ost FULL + wait_osc_import_ready client ost lfs df || error "lfs df with reactivated OSC failed" rm -f $DIR/$tfile @@ -8921,7 +9698,7 @@ test_116a() { # was previously test_116() remote_mds_nodsh && skip "remote MDS with nodsh" echo -n "Free space priority " - do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free | + do_facet $SINGLEMDS lctl get_param -n lo[vd].*-mdtlov.qos_prio_free | head -n1 declare -a AVAIL free_min_max @@ -9042,17 +9819,17 @@ test_116b() { # LU-2093 #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147 local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \ - lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) + lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) [ -z "$old_rr" ] && skip "no QOS" do_facet $SINGLEMDS lctl set_param \ - lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0 + lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0 mkdir -p $DIR/$tdir do_facet $SINGLEMDS lctl set_param fail_loc=0x147 createmany -o $DIR/$tdir/f- 20 || error "can't create" do_facet $SINGLEMDS lctl set_param fail_loc=0 rm -rf $DIR/$tdir do_facet $SINGLEMDS lctl set_param \ - lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr + lo[vd].$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr } run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass" @@ -9570,7 +10347,7 @@ run_test 119d "The DIO path should try to send a new rpc once one is completed" test_120a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || skip_env "no early lock cancel on server" @@ -9581,13 +10358,13 @@ test_120a() { cancel_lru_locks osc stat $DIR/$tdir > /dev/null - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') - test_mkdir -c1 $DIR/$tdir/d1 - can2=$(do_facet $SINGLEMDS \ + test_mkdir -i0 -c1 $DIR/$tdir/d1 + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9631,24 +10408,24 @@ run_test 120b "Early Lock Cancel: create test" test_120c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || skip "no early lock cancel on server" lru_resize_disable mdc lru_resize_disable osc - test_mkdir -c1 $DIR/$tdir/d1 - test_mkdir -c1 $DIR/$tdir/d2 + test_mkdir -i0 -c1 $DIR/$tdir/d1 + test_mkdir -i0 -c1 $DIR/$tdir/d2 touch $DIR/$tdir/d1/f1 cancel_lru_locks mdc stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9663,7 +10440,7 @@ run_test 120c "Early Lock Cancel: link test" test_120d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || skip_env "no early lock cancel on server" @@ -9672,13 +10449,13 @@ test_120d() { touch $DIR/$tdir cancel_lru_locks mdc stat $DIR/$tdir > /dev/null - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') chmod a+x $DIR/$tdir - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9698,7 +10475,7 @@ test_120e() { local dlmtrace_set=false - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc ! $LCTL get_param debug | grep -q dlmtrace && @@ -9712,14 +10489,14 @@ test_120e() { # during unlink (LU-4206), so cancel osc lock now. sleep 2 cancel_lru_locks osc - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') unlink $DIR/$tdir/f1 sleep 5 - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9740,11 +10517,11 @@ test_120f() { skip_env "no early lock cancel on server" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc - test_mkdir -c1 $DIR/$tdir/d1 - test_mkdir -c1 $DIR/$tdir/d2 + test_mkdir -i0 -c1 $DIR/$tdir/d1 + test_mkdir -i0 -c1 $DIR/$tdir/d2 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1 cancel_lru_locks mdc @@ -9756,14 +10533,14 @@ test_120f() { # during rename (LU-4206), so cancel osc lock now. sleep 2 cancel_lru_locks osc - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 sleep 5 - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -10151,6 +10928,47 @@ test_124c() { } run_test 124c "LRUR cancel very aged locks" +test_124d() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize || + skip_env "no lru resize on server" + + # cache ununsed locks on client + local nr=100 + + lru_resize_disable mdc + stack_trap "lru_resize_enable mdc" EXIT + + cancel_lru_locks mdc + + # asynchronous object destroy at MDT could cause bl ast to client + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f $nr || + error "failed to create $nr files in $DIR/$tdir" + stack_trap "unlinkmany $DIR/$tdir/f $nr" EXIT + + ls -l $DIR/$tdir > /dev/null + + local nsdir="ldlm.namespaces.*-MDT0000-mdc-*" + local unused=$($LCTL get_param -n $nsdir.lock_unused_count) + local max_age=$($LCTL get_param -n $nsdir.lru_max_age) + local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period) + + echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p" + + # set lru_max_age to 1 sec + $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds + stack_trap "$LCTL set_param -n $nsdir.lru_max_age $max_age" EXIT + + echo "sleep $((recalc_p * 2)) seconds..." + sleep $((recalc_p * 2)) + + local remaining=$($LCTL get_param -n $nsdir.lock_unused_count) + + [ $remaining -eq 0 ] || error "$remaining locks are not canceled" +} +run_test 124d "cancel very aged locks if lru-resize diasbaled" + test_125() { # 13358 $LCTL get_param -n llite.*.client_type | grep -q local || skip "must run as local client" @@ -10269,6 +11087,75 @@ test_127b() { # bug LU-333 } run_test 127b "verify the llite client stats are sane" +test_127c() { # LU-12394 + [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs" + local size + local bsize + local reads + local writes + local count + + $LCTL set_param llite.*.extents_stats=1 + stack_trap "$LCTL set_param llite.*.extents_stats=0" EXIT + + # Use two stripes so there is enough space in default config + $LFS setstripe -c 2 $DIR/$tfile + + # Extent stats start at 0-4K and go in power of two buckets + # LL_HIST_START = 12 --> 2^12 = 4K + # We do 3K*2^i, so 3K, 6K, 12K, 24K... hitting each bucket. + # We do not do buckets larger than 64 MiB to avoid ENOSPC issues on + # small configs + for size in 3K 6K 12K 24K 48K 96K 192K 384K 768K 1536K 3M 6M 12M 24M 48M; + do + # Write and read, 2x each, second time at a non-zero offset + dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 + dd if=/dev/zero of=$DIR/$tfile bs=$size count=1 seek=10 + dd if=$DIR/$tfile of=/dev/null bs=$size count=1 + dd if=$DIR/$tfile of=/dev/null bs=$size count=1 seek=10 + rm -f $DIR/$tfile + done + + $LCTL get_param llite.*.extents_stats + + count=2 + for bsize in 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M; + do + local bucket=$($LCTL get_param -n llite.*.extents_stats | + grep -m 1 $bsize) + reads=$(echo $bucket | awk '{print $5}') + writes=$(echo $bucket | awk '{print $9}') + [ "$reads" -eq $count ] || + error "$reads reads in < $bsize bucket, expect $count" + [ "$writes" -eq $count ] || + error "$writes writes in < $bsize bucket, expect $count" + done + + # Test mmap write and read + $LCTL set_param llite.*.extents_stats=c + size=512 + dd if=/dev/zero of=$DIR/$tfile bs=${size}K count=1 + $MULTIOP $DIR/$tfile OSMRUc || error "$MULTIOP $DIR/$tfile failed" + $MULTIOP $DIR/$tfile OSMWUc || error "$MULTIOP $DIR/$tfile failed" + + $LCTL get_param llite.*.extents_stats + + count=$(((size*1024) / PAGE_SIZE)) + + bsize=$((2 * PAGE_SIZE / 1024))K + + bucket=$($LCTL get_param -n llite.*.extents_stats | + grep -m 1 $bsize) + reads=$(echo $bucket | awk '{print $5}') + writes=$(echo $bucket | awk '{print $9}') + # mmap writes fault in the page first, creating an additonal read + [ "$reads" -eq $((2 * count)) ] || + error "$reads reads in < $bsize bucket, expect $count" + [ "$writes" -eq $count ] || + error "$writes writes in < $bsize bucket, expect $count" +} +run_test 127c "test llite extent stats with regular & mmap i/o" + test_128() { # bug 15212 touch $DIR/$tfile $LFS 2>&1 <<-EOF | tee $TMP/$tfile.log @@ -10339,7 +11226,7 @@ test_129() { # check two errors: # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee) # EFBIG for previous versions included in ldiskfs series - if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then + if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then set_dir_limits 0 0 echo "return code $rc received as expected" @@ -11304,8 +12191,8 @@ test_140() { #bug-17379 done i=$((i - 1)) echo "The symlink depth = $i" - [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] || - error "Invalid symlink depth" + [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] || + error "Invalid symlink depth" # Test recursive symlink ln -s symlink_self symlink_self @@ -12884,6 +13771,49 @@ test_160i() { } run_test 160i "changelog user register/unregister race" +test_160j() { + remote_mds_nodsh && skip "remote MDS with nodsh" + [[ $MDS1_VERSION -lt $(version_code 2.12.56) ]] && + skip "Need MDS version at least 2.12.56" + + mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed" + + changelog_register || error "first changelog_register failed" + + # generate some changelog + test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed" + createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) || + error "create $DIR/$tdir/${tfile}bis failed" + + # open the changelog device + exec 3>/dev/changelog-$FSNAME-MDT0000 + exec 4/dev/null || error "read changelog failed" + + # clear changelog + local cl_user="${CL_USERS[$SINGLEMDS]%% *}" + changelog_users $SINGLEMDS | grep -q $cl_user || + error "User $cl_user not found in changelog_users" + + printf 'clear:'$cl_user':0' >&3 + + # close + exec 3>&- + exec 4<&- + + # cleanup + changelog_deregister || error "changelog_deregister failed" + + umount $MOUNT2 + mount_client $MOUNT || error "mount_client on $MOUNT failed" +} +run_test 160j "client can be umounted while its chanangelog is being used" + test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -13053,6 +13983,7 @@ run_test 161c "check CL_RENME[UNLINK] changelog record flags" test_161d() { remote_mds_nodsh && skip "remote MDS with nodsh" + [ -n "$FILESET" ] && skip "Not functional for FILESET set" local pid local fid @@ -13079,7 +14010,8 @@ test_161d() { ps -p $pid [[ $? -eq 0 ]] || error "create should be blocked" - local tempfile=$(mktemp) + local tempfile="$(mktemp --tmpdir $tfile.XXXXXX)" + stack_trap "rm -f $tempfile" fid=$(changelog_extract_field "CREAT" "$tfile" "t=") cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed" # some delay may occur during ChangeLog publishing and file read just @@ -13353,12 +14285,12 @@ obdecho_test() { "test_brw $count w v $pages $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" || rc=4; } - [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ - "cleanup" || rc=5; } - [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \ - "detach" || rc=6; } - [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" - return $rc + [ $rc -eq 0 ] || [ $rc -gt 2 ] && + { do_facet $node "$LCTL --device ec cleanup" || rc=5; } + [ $rc -eq 0 ] || [ $rc -gt 1 ] && + { do_facet $node "$LCTL --device ec detach" || rc=6; } + [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" + return $rc } test_180a() { @@ -13741,6 +14673,41 @@ test_185() { # LU-2441 } run_test 185 "Volatile file support" +function create_check_volatile() { + local idx=$1 + local tgt + + $MULTIOP $MOUNT/.lustre/fid V${idx}Fw4096_c >&/tmp/${tfile}.fid & + local PID=$! + sleep 1 + local FID=$(cat /tmp/${tfile}.fid) + [ "$FID" == "" ] && error "can't get FID for volatile" + $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID || error "can't stat $FID" + tgt=$($LFS getstripe -m $MOUNT/.lustre/fid/$FID) + [ "$tgt" != "$idx" ] && error "wrong MDS $tgt, expected $idx" + kill -USR1 $PID + wait + sleep 1 + cancel_lru_locks mdc # flush opencache + $CHECKSTAT -t file $MOUNT/.lustre/fid/$FID && error "can stat $FID" + return 0 +} + +test_185a(){ + # LU-12516 - volatile creation via .lustre + [[ $MDS1_VERSION -ge $(version_code 2.12.55) ]] || + skip "Need MDS version at least 2.3.55" + + create_check_volatile 0 + [ $MDSCOUNT -lt 2 ] && return 0 + + # DNE case + create_check_volatile 1 + + return 0 +} +run_test 185a "Volatile file creation in .lustre/fid/" + test_187a() { remote_mds_nodsh && skip "remote MDS with nodsh" [ $MDS1_VERSION -lt $(version_code 2.3.0) ] && @@ -14356,8 +15323,8 @@ test_215() { # for bugs 18102, 21079, 21517 # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down, # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are # numeric (0 or >0 or <0), router is a string like 192.168.1.1@tcp2 - L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$" - BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$" + L1="^ref +rtr_ref +alive +router$" + BR="^$P +$P +(up|down) +$NID$" create_lnet_proc_files "routers" check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1" remove_lnet_proc_files "routers" @@ -14514,9 +15481,9 @@ test_220() { #LU-325 # on the mdt's osc local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST) local last_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc_proc1.prealloc_last_id) + osp.$mdtosc_proc1.prealloc_last_id) local next_id=$(do_facet $SINGLEMDS lctl get_param -n \ - osc.$mdtosc_proc1.prealloc_next_id) + osp.$mdtosc_proc1.prealloc_next_id) $LFS df -i @@ -14542,9 +15509,9 @@ test_220() { #LU-325 createmany -o $DIR/$tdir/f $MDSOBJS || return 3 local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \ - osc.$mdtosc_proc1.prealloc_last_id) + osp.$mdtosc_proc1.prealloc_last_id) local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \ - osc.$mdtosc_proc1.prealloc_next_id) + osp.$mdtosc_proc1.prealloc_next_id) echo "after creation, last_id=$last_id2, next_id=$next_id2" $LFS df -i @@ -15793,7 +16760,7 @@ test_239A() { # was test_239 mkdir -p $DIR/$tdir createmany -o $DIR/$tdir/f- 5000 unlinkmany $DIR/$tdir/f- 5000 - [ $MDS1_VERSION -gt $(version_code 2.10.53) ] && + [ $MDS1_VERSION -gt $(version_code 2.10.4) ] && do_nodes $list "lctl set_param -n osp.*.force_sync=1" changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \ osp.*MDT*.sync_in_flight" | calc_sum) @@ -15917,7 +16884,7 @@ test_243() } run_test 243 "various group lock tests" -test_244() +test_244a() { test_mkdir $DIR/$tdir dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35 @@ -15925,7 +16892,26 @@ test_244() error "sendfile+grouplock failed" rm -rf $DIR/$tdir } -run_test 244 "sendfile with group lock tests" +run_test 244a "sendfile with group lock tests" + +test_244b() +{ + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + + local threads=50 + local size=$((1024*1024)) + + test_mkdir $DIR/$tdir + for i in $(seq 1 $threads); do + local file=$DIR/$tdir/file_$((i / 10)) + $MULTIOP $file OG1234w$size_$((i % 3))w$size_$((i % 4))g1234c & + local pids[$i]=$! + done + for i in $(seq 1 $threads); do + wait ${pids[$i]} + done +} +run_test 244b "multi-threaded write with group lock" test_245() { local flagname="multi_mod_rpcs" @@ -16158,7 +17144,7 @@ run_test 251 "Handling short read and write correctly" test_252() { remote_mds_nodsh && skip "remote MDS with nodsh" remote_ost_nodsh && skip "remote OST with nodsh" - if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then + if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then skip_env "ldiskfs only test" fi @@ -16205,33 +17191,6 @@ test_252() { } run_test 252 "check lr_reader tool" -test_253_fill_ost() { - local size_mb #how many MB should we write to pass watermark - local lwm=$3 #low watermark - local free_10mb #10% of free space - - free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }') - size_mb=$((free_kb / 1024 - lwm)) - free_10mb=$((free_kb / 10240)) - #If 10% of free space cross low watermark use it - if (( free_10mb > size_mb )); then - size_mb=$free_10mb - else - #At least we need to store 1.1 of difference between - #free space and low watermark - size_mb=$((size_mb + size_mb / 10)) - fi - if (( lwm <= $((free_kb / 1024)) )) || [ ! -f $DIR/$tdir/1 ]; then - dd if=/dev/zero of=$DIR/$tdir/1 bs=1M count=$size_mb \ - oflag=append conv=notrunc - fi - - sleep_maxage - - free_kb=$($LFS df $MOUNT | grep $1 | awk '{ print $4 }') - echo "OST still has $((free_kb / 1024)) mbytes free" -} - test_253() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" @@ -16239,9 +17198,8 @@ test_253() { local ostidx=0 local rc=0 + local ost_name=$(ostname_from_index $ostidx) - local ost_name=$($LFS osts | - sed -n 's/^'$ostidx': \(.*\)_UUID .*/\1/p') # on the mdt's osc local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $ost_name) do_facet $SINGLEMDS $LCTL get_param -n \ @@ -16253,60 +17211,45 @@ test_253() { wait_delete_completed mkdir $DIR/$tdir - local last_wm_h=$(do_facet $SINGLEMDS $LCTL get_param -n \ - osp.$mdtosc_proc1.reserved_mb_high) - local last_wm_l=$(do_facet $SINGLEMDS $LCTL get_param -n \ - osp.$mdtosc_proc1.reserved_mb_low) - echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l" - if ! combined_mgs_mds ; then mount_mgs_client fi - create_pool $FSNAME.$TESTNAME || error "Pool creation failed" - do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name || - error "Adding $ost_name to pool failed" - - # Wait for client to see a OST at pool - wait_update $HOSTNAME "$LCTL get_param -n - lov.$FSNAME-*.pools.$TESTNAME | sort -u | - grep $ost_name" "$ost_name""_UUID" $((TIMEOUT/2)) || - error "Client can not see the pool" + pool_add $TESTNAME || error "Pool creation failed" + pool_add_targets $TESTNAME 0 || error "Pool add targets failed" + $LFS setstripe $DIR/$tdir -i $ostidx -c 1 -p $FSNAME.$TESTNAME || error "Setstripe failed" - dd if=/dev/zero of=$DIR/$tdir/0 bs=1M count=10 - local blocks=$($LFS df $MOUNT | grep $ost_name | awk '{ print $4 }') - echo "OST still has $((blocks/1024)) mbytes free" - - local new_lwm=$((blocks/1024-10)) - do_facet $SINGLEMDS $LCTL set_param \ - osp.$mdtosc_proc1.reserved_mb_high=$((new_lwm+5)) - do_facet $SINGLEMDS $LCTL set_param \ - osp.$mdtosc_proc1.reserved_mb_low=$new_lwm + dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M count=10 - test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm - - #First enospc could execute orphan deletion so repeat. - test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm + local wms=$(ost_watermarks_set_enospc $tfile $ostidx | + grep "watermarks") + stack_trap "ost_watermarks_clear_enospc $tfile $ostidx $wms" EXIT local oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \ osp.$mdtosc_proc1.prealloc_status) echo "prealloc_status $oa_status" - dd if=/dev/zero of=$DIR/$tdir/2 bs=1M count=1 && + dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1M count=1 && error "File creation should fail" + #object allocation was stopped, but we still able to append files - dd if=/dev/zero of=$DIR/$tdir/1 bs=1M seek=6 count=5 oflag=append || - error "Append failed" - rm -f $DIR/$tdir/1 $DIR/$tdir/0 $DIR/$tdir/r* + dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M seek=6 count=5 \ + oflag=append || error "Append failed" + + rm -f $DIR/$tdir/$tfile.0 + + # For this test, we want to delete the files we created to go out of + # space but leave the watermark, so we remain nearly out of space + ost_watermarks_enospc_delete_files $tfile $ostidx wait_delete_completed sleep_maxage for i in $(seq 10 12); do - dd if=/dev/zero of=$DIR/$tdir/$i bs=1M count=1 2>/dev/null || - error "File creation failed after rm"; + dd if=/dev/zero of=$DIR/$tdir/$tfile.$i bs=1M count=1 \ + 2>/dev/null || error "File creation failed after rm" done oa_status=$(do_facet $SINGLEMDS $LCTL get_param -n \ @@ -16316,16 +17259,6 @@ test_253() { if (( oa_status != 0 )); then error "Object allocation still disable after rm" fi - do_facet $SINGLEMDS $LCTL set_param \ - osp.$mdtosc_proc1.reserved_mb_high=$last_wm_h - do_facet $SINGLEMDS $LCTL set_param \ - osp.$mdtosc_proc1.reserved_mb_low=$last_wm_l - - - do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $ost_name || - error "Remove $ost_name from pool failed" - do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || - error "Pool destroy fialed" if ! combined_mgs_mds ; then umount_mgs_client @@ -16644,7 +17577,7 @@ test_255c() { local rc test_mkdir -p $DIR/$tdir - $LFS setstripe -i 0 $DIR/$tdir + $LFS setstripe -i 0 -c 1 $DIR/$tdir #test 10 returns only success/failure i=10 @@ -16684,7 +17617,7 @@ test_255c() { cancel_lru_locks osc count=$($LCTL get_param -n \ - ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count) + ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count) lockahead_test -d $DIR/$tdir -t $i -f $tfile rc=$? @@ -16693,7 +17626,7 @@ test_255c() { fi new_count=$($LCTL get_param -n \ - ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count) + ldlm.namespaces.$FSNAME-OST0000*osc-[-0-9a-f]*.lock_unused_count) difference="$((new_count - count))" # Test 15 output is divided by 100 to map down to valid return @@ -16750,7 +17683,8 @@ test_256() { #after mount new plainllog is used touch $DIR/$tdir/{11..19} - local tmpfile=$(mktemp -u $tfile.XXXXXX) + local tmpfile="$(mktemp --tmpdir -u $tfile.XXXXXX)" + stack_trap "rm -f $tmpfile" cat_sl=$(do_facet $SINGLEMDS "sync; \ $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \ llog_reader $tmpfile | grep -c type=1064553b") @@ -16762,7 +17696,7 @@ test_256() { cat_sl=$(do_facet $SINGLEMDS "sync; \ $DEBUGFS -c -R 'dump changelog_catalog $tmpfile' $mdt_dev; \ - llog_reader $tmpfile | grep -c type=1064553b; rm -f $tmpfile") + llog_reader $tmpfile | grep -c type=1064553b") if (( cat_sl == 2 )); then error "Empty plain llog was not deleted from changelog catalog" @@ -16792,6 +17726,7 @@ test_257() { stop $facet || error "stop MDS failed" start $facet $(mdsdevname $((mdtidx + 1))) $MDS_MOUNT_OPTS || error "start MDS fail" + wait_recovery_complete $facet } run_test 257 "xattr locks are not lost" @@ -16809,7 +17744,7 @@ test_258a() { fi rm -f $DIR/$tfile } -run_test 258a +run_test 258a "verify i_mutex security behavior when suid attributes is set" # Verify we do NOT take the i_mutex in the normal case test_258b() { @@ -17326,7 +18261,7 @@ test_271d() { $LFS setstripe -E 1024K -L mdt $DIR/$tdir - local mdtidx=$($LFS getstripe -M $DIR/$tdir) + local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir) cancel_lru_locks mdc dd if=/dev/urandom of=$tmp bs=1000 count=1 @@ -17370,61 +18305,6 @@ test_271d() { } run_test 271d "DoM: read on open (1K file in reply buffer)" -test_271e() { - [ $MDS1_VERSION -lt $(version_code 2.10.57) ] && - skip "Need MDS version at least 2.10.57" - - local dom=$DIR/$tdir/dom - local tmp=$TMP/${tfile}.data - trap "cleanup_271def_tests $tmp" EXIT - - mkdir -p $DIR/$tdir - - $LFS setstripe -E 1024K -L mdt $DIR/$tdir - - local mdtidx=$($LFS getstripe -M $DIR/$tdir) - - cancel_lru_locks mdc - dd if=/dev/urandom of=$tmp bs=30K count=1 - dd if=$tmp of=$dom bs=30K count=1 - cancel_lru_locks mdc - cat /etc/hosts >> $tmp - lctl set_param -n mdc.*.stats=clear - - echo "Append to the same page" - cat /etc/hosts >> $dom - - local num=$(get_mdc_stats $mdtidx ost_read) - local ra=$(get_mdc_stats $mdtidx req_active) - local rw=$(get_mdc_stats $mdtidx req_waittime) - - [ -z $num ] || error "$num READ RPC occured" - # Reply buffer can be adjusted for larger buffer by resend - echo "... DONE with $((ra - rw)) resends" - - # compare content - cmp $tmp $dom || error "file miscompare" - - cancel_lru_locks mdc - lctl set_param -n mdc.*.stats=clear - - echo "Open and read file" - cat $dom > /dev/null - local num=$(get_mdc_stats $mdtidx ost_read) - local ra=$(get_mdc_stats $mdtidx req_active) - local rw=$(get_mdc_stats $mdtidx req_waittime) - - [ -z $num ] || error "$num READ RPC occured" - # Reply buffer can be adjusted for larger buffer by resend - echo "... DONE with $((ra - rw)) resends" - - # compare content - cmp $tmp $dom || error "file miscompare" - - return 0 -} -run_test 271e "DoM: read on open (30K file with reply buffer adjusting)" - test_271f() { [ $MDS1_VERSION -lt $(version_code 2.10.57) ] && skip "Need MDS version at least 2.10.57" @@ -17437,11 +18317,11 @@ test_271f() { $LFS setstripe -E 1024K -L mdt $DIR/$tdir - local mdtidx=$($LFS getstripe -M $DIR/$tdir) + local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir) cancel_lru_locks mdc - dd if=/dev/urandom of=$tmp bs=200000 count=1 - dd if=$tmp of=$dom bs=200000 count=1 + dd if=/dev/urandom of=$tmp bs=265000 count=1 + dd if=$tmp of=$dom bs=265000 count=1 cancel_lru_locks mdc cat /etc/hosts >> $tmp lctl set_param -n mdc.*.stats=clear @@ -17468,6 +18348,7 @@ test_271f() { local ra=$(get_mdc_stats $mdtidx req_active) local rw=$(get_mdc_stats $mdtidx req_waittime) + [ -z $num ] && num=0 [ $num -eq 1 ] || error "expect 1 READ RPC, $num occured" [ $ra == $rw ] || error "$((ra - rw)) resend occured" echo "... DONE" @@ -17479,6 +18360,26 @@ test_271f() { } run_test 271f "DoM: read on open (200K file and read tail)" +test_271g() { + [[ $($LCTL get_param mdc.*.import) =~ async_discard ]] || + skip "Skipping due to old client or server version" + + $LFS setstripe -E 1024K -L mdt -E EOF $DIR1/$tfile + # to get layout + $CHECKSTAT -t file $DIR1/$tfile + + $MULTIOP $DIR1/$tfile Ow40960_w4096c & + MULTIOP_PID=$! + sleep 1 + #define OBD_FAIL_LDLM_CANCEL_BL_CB_RACE + $LCTL set_param fail_loc=0x80000314 + rm $DIR1/$tfile || error "Unlink fails" + RC=$? + kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure" + [ $RC -eq 0 ] || error "Failed write to stale object" +} +run_test 271g "Discard DoM data vs client flush race" + test_272a() { [ $MDS1_VERSION -lt $(version_code 2.11.50) ] && skip "Need MDS version at least 2.11.50" @@ -17494,14 +18395,13 @@ test_272a() { $LFS migrate -E 256K -L mdt -E -1 -c2 $dom || error "failed to migrate to the same DoM component" - [ $($LFS getstripe -c $dom) -eq 2 ] || - error "layout was not changed silently" - local new_md5=$(md5sum $dom) - [ "$old_md5" != "$new_md5" ] && + [ "$old_md5" == "$new_md5" ] || error "md5sum differ: $old_md5, $new_md5" - return 0 + + [ $($LFS getstripe -c $dom) -eq 2 ] || + error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2" } run_test 272a "DoM migration: new layout with the same DOM component" @@ -17528,12 +18428,12 @@ test_272b() { $LFS migrate -c2 $dom || error "failed to migrate to the new composite layout" - [ $($LFS getstripe -L $dom) == 'mdt' ] && + [ $($LFS getstripe -L $dom) != 'mdt' ] || error "MDT stripe was not removed" cancel_lru_locks mdc local new_md5=$(md5sum $dom) - [ "$old_md5" != "$new_md5" ] && + [ "$old_md5" == "$new_md5" ] || error "$old_md5 != $new_md5" # Skip free space checks with ZFS @@ -17573,7 +18473,7 @@ test_272c() { cancel_lru_locks mdc local new_md5=$(md5sum $dom) - [ "$old_md5" != "$new_md5" ] && + [ "$old_md5" == "$new_md5" ] || error "$old_md5 != $new_md5" # Skip free space checks with ZFS @@ -17587,23 +18487,125 @@ test_272c() { } run_test 272c "DoM migration: DOM file to the OST-striped file (composite)" -test_273a() { - [ $MDS1_VERSION -lt $(version_code 2.11.50) ] && - skip "Need MDS version at least 2.11.50" - - # Layout swap cannot be done if either file has DOM component, - # this will never be supported, migration should be used instead +test_272d() { + [ $MDS1_VERSION -lt $(version_code 2.12.55) ] && + skip "Need MDS version at least 2.12.55" local dom=$DIR/$tdir/$tfile mkdir -p $DIR/$tdir + $LFS setstripe -E 1M -L mdt -E -1 -c1 $dom + + local mdtidx=$($LFS getstripe -m $dom) + local mdtname=MDT$(printf %04x $mdtidx) + local facet=mds$((mdtidx + 1)) + + dd if=/dev/urandom of=$dom bs=2M count=1 oflag=direct || + error "failed to write data into $dom" + local old_md5=$(md5sum $dom) + cancel_lru_locks mdc + local mdtfree1=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + + $LFS mirror extend -N -E 2M -c1 -E -1 -c2 $dom || + error "failed mirroring to the new composite layout" + $LFS mirror resync $dom || + error "failed mirror resync" + $LFS mirror split --mirror-id 1 -d $dom || + error "failed mirror split" + + [ $($LFS getstripe -L $dom) != 'mdt' ] || + error "MDT stripe was not removed" + + cancel_lru_locks mdc + local new_md5=$(md5sum $dom) + [ "$old_md5" == "$new_md5" ] || + error "$old_md5 != $new_md5" + + # Skip free space checks with ZFS + if [ "$(facet_fstype $facet)" != "zfs" ]; then + local mdtfree2=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + [ $mdtfree2 -gt $mdtfree1 ] || + error "MDS space is not freed after DOM mirror deletion" + fi + return 0 +} +run_test 272d "DoM mirroring: OST-striped mirror to DOM file" + +test_272e() { + [ $MDS1_VERSION -lt $(version_code 2.12.55) ] && + skip "Need MDS version at least 2.12.55" + + local dom=$DIR/$tdir/$tfile + mkdir -p $DIR/$tdir + $LFS setstripe -c 2 $dom + + dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct || + error "failed to write data into $dom" + local old_md5=$(md5sum $dom) + cancel_lru_locks mdc + + $LFS mirror extend -N -E 1M -L mdt -E eof -c2 $dom || + error "failed mirroring to the DOM layout" + $LFS mirror resync $dom || + error "failed mirror resync" + $LFS mirror split --mirror-id 1 -d $dom || + error "failed mirror split" + + [ $($LFS getstripe -L $dom) != 'mdt' ] || + error "MDT stripe was not removed" + + cancel_lru_locks mdc + local new_md5=$(md5sum $dom) + [ "$old_md5" == "$new_md5" ] || + error "$old_md5 != $new_md5" + + return 0 +} +run_test 272e "DoM mirroring: DOM mirror to the OST-striped file" + +test_272f() { + [ $MDS1_VERSION -lt $(version_code 2.12.55) ] && + skip "Need MDS version at least 2.12.55" + + local dom=$DIR/$tdir/$tfile + mkdir -p $DIR/$tdir + $LFS setstripe -c 2 $dom + + dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct || + error "failed to write data into $dom" + local old_md5=$(md5sum $dom) + cancel_lru_locks mdc + + $LFS migrate -E 1M -L mdt -E eof -c2 -v $dom || + error "failed migrating to the DOM file" + + cancel_lru_locks mdc + local new_md5=$(md5sum $dom) + [ "$old_md5" != "$new_md5" ] && + error "$old_md5 != $new_md5" + + return 0 +} +run_test 272f "DoM migration: OST-striped file to DOM file" + +test_273a() { + [ $MDS1_VERSION -lt $(version_code 2.11.50) ] && + skip "Need MDS version at least 2.11.50" + + # Layout swap cannot be done if either file has DOM component, + # this will never be supported, migration should be used instead + + local dom=$DIR/$tdir/$tfile + mkdir -p $DIR/$tdir + + $LFS setstripe -c2 ${dom}_plain + $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom + $LFS swap_layouts ${dom}_plain ${dom}_dom && + error "can swap layout with DoM component" + $LFS swap_layouts ${dom}_dom ${dom}_plain && + error "can swap layout with DoM component" - $LFS setstripe -c2 ${dom}_plain - $LFS setstripe -E 1M -L mdt -E -1 -c2 ${dom}_dom - $LFS swap_layouts ${dom}_plain ${dom}_dom && - error "can swap layout with DoM component" - $LFS swap_layouts ${dom}_dom ${dom}_plain && - error "can swap layout with DoM component" - $LFS setstripe -E 1M -c1 -E -1 -c2 ${dom}_comp $LFS swap_layouts ${dom}_comp ${dom}_dom && error "can swap layout with DoM component" @@ -17665,6 +18667,47 @@ test_276() { } run_test 276 "Race between mount and obd_statfs" +test_277() { + $LCTL set_param ldlm.namespaces.*.lru_size=0 + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 + local cached_mb=$($LCTL get_param llite.*.max_cached_mb | + grep ^used_mb | awk '{print $2}') + [ $cached_mb -eq 1 ] || error "expected mb 1 got $cached_mb" + dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 \ + oflag=direct conv=notrunc + cached_mb=$($LCTL get_param llite.*.max_cached_mb | + grep ^used_mb | awk '{print $2}') + [ $cached_mb -eq 0 ] || error "expected mb 0 got $cached_mb" +} +run_test 277 "Direct IO shall drop page cache" + +test_278() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] && + skip "needs the same host for mdt1 mdt2" && return + + local pid1 + local pid2 + +#define OBD_FAIL_OBD_STOP_MDS_RACE 0x60b + do_facet mds2 $LCTL set_param fail_loc=0x8000060c + stop mds2 & + pid2=$! + + stop mds1 + + echo "Starting MDTs" + start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS + wait $pid2 +#For the error assertion will happen. lu_env_get_key(..., &mdt_thread_key) +#will return NULL + do_facet mds2 $LCTL set_param fail_loc=0 + + start mds2 $(mdsdevname 2) $MDS_MOUNT_OPTS +} +run_test 278 "Race starting MDS between MDTs stop/start" + cleanup_test_300() { trap 0 umask $SAVE_UMASK @@ -17955,11 +18998,12 @@ test_300_check_default_striped_dir() for dir in $(find $DIR/$tdir/$dirname/*); do stripe_count=$($LFS getdirstripe -c $dir) [ $stripe_count -eq $default_count ] || - [ $stripe_count -eq 0 -o $default_count -eq 1 ] || + [ $stripe_count -eq 0 ] || [ $default_count -eq 1 ] || error "stripe count $default_count != $stripe_count for $dir" stripe_index=$($LFS getdirstripe -i $dir) - [ $default_index -eq -1 -o $stripe_index -eq $default_index ] || + [ $default_index -eq -1 ] || + [ $stripe_index -eq $default_index ] || error "$stripe_index != $default_index for $dir" #check default stripe @@ -18291,13 +19335,13 @@ test_300o() { numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree) numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree) - if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then + if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then skip "not enough free inodes $numfree1 $numfree2" fi numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree) numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree) - if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then + if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then skip "not enough free space $numfree1 $numfree2" fi @@ -18467,6 +19511,7 @@ test_311() { remote_mds_nodsh && skip "remote MDS with nodsh" local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }') + local mdts=$(comma_list $(mdts_nodes)) mkdir -p $DIR/$tdir $LFS setstripe -i 0 -c 1 $DIR/$tdir @@ -18475,14 +19520,11 @@ test_311() { # statfs data is not real time, let's just calculate it old_iused=$((old_iused + 1000)) - local count=$(do_facet $SINGLEMDS "lctl get_param -n \ + local count=$(do_facet $SINGLEMDS "$LCTL get_param -n \ osp.*OST0000*MDT0000.create_count") - local max_count=$(do_facet $SINGLEMDS "lctl get_param -n \ + local max_count=$(do_facet $SINGLEMDS "$LCTL get_param -n \ osp.*OST0000*MDT0000.max_create_count") - for idx in $(seq $MDSCOUNT); do - do_facet mds$idx "lctl set_param -n \ - osp.*OST0000*MDT000?.max_create_count=0" - done + do_nodes $mdts "$LCTL set_param -n osp.*OST0000*.max_create_count=0" $LFS setstripe -i 0 $DIR/$tdir/$tfile || error "setstripe failed" local index=$($LFS getstripe -i $DIR/$tdir/$tfile) @@ -18490,12 +19532,13 @@ test_311() { unlinkmany $DIR/$tdir/$tfile. 1000 - for idx in $(seq $MDSCOUNT); do - do_facet mds$idx "lctl set_param -n \ - osp.*OST0000*MDT000?.max_create_count=$max_count" - do_facet mds$idx "lctl set_param -n \ - osp.*OST0000*MDT000?.create_count=$count" - done + do_nodes $mdts "$LCTL set_param -n \ + osp.*OST0000*.max_create_count=$max_count" + [ $MDS1_VERSION -lt $(version_code 2.12.51) ] && + do_nodes $mdts "$LCTL set_param -n \ + osp.*OST0000*.create_count=$count" + do_nodes $mdts "$LCTL get_param osp.*OST0000*.create_count" | + grep "=0" && error "create_count is zero" local new_iused for i in $(seq 120); do @@ -18642,6 +19685,8 @@ test_314() { run_test 314 "OSP shouldn't fail after last_rcvd update failure" test_315() { # LU-618 + [ -f /proc/$$/io ] || skip_env "no IO accounting in kernel" + local file=$DIR/$tfile rm -f $file @@ -18674,14 +19719,15 @@ test_316() { run_test 316 "lfs mv" test_317() { + [ $MDS1_VERSION -lt $(version_code 2.11.53) ] && + skip "Need MDS version at least 2.11.53" + if [ "$ost1_FSTYPE" == "zfs" ]; then + skip "LU-10370: no implementation for ZFS" + fi + local trunc_sz local grant_blk_size - if [ "$(facet_fstype $facet)" == "zfs" ]; then - skip "LU-10370: no implementation for ZFS" && return - fi - - stack_trap "rm -f $DIR/$tfile" EXIT grant_blk_size=$($LCTL get_param osc.$FSNAME*.import | awk '/grant_block_size:/ { print $2; exit; }') # @@ -18689,7 +19735,8 @@ test_317() { # blocks count. # dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync || - error "Create file : $DIR/$tfile" + error "Create file $DIR/$tfile failed" + stack_trap "rm -f $DIR/$tfile" EXIT for trunc_sz in 2097152 4097 4000 509 0; do $TRUNCATE $DIR/$tfile $trunc_sz || @@ -18740,6 +19787,76 @@ test_317() { } run_test 317 "Verify blocks get correctly update after truncate" +test_318() { + local old_max_active=$($LCTL get_param -n \ + llite.*.max_read_ahead_async_active 2>/dev/null) + + $LCTL set_param llite.*.max_read_ahead_async_active=256 + local max_active=$($LCTL get_param -n \ + llite.*.max_read_ahead_async_active 2>/dev/null) + [ $max_active -ne 256 ] && error "expected 256 but got $max_active" + + # currently reset to 0 is unsupported, leave it 512 for now. + $LCTL set_param llite.*.max_read_ahead_async_active=0 && + error "set max_read_ahead_async_active should fail" + + $LCTL set_param llite.*.max_read_ahead_async_active=512 + max_active=$($LCTL get_param -n \ + llite.*.max_read_ahead_async_active 2>/dev/null) + [ $max_active -eq 512 ] || error "expected 512 but got $max_active" + + # restore @max_active + [ $old_max_active -ne 0 ] && $LCTL set_param \ + llite.*.max_read_ahead_async_active=$old_max_active + + local old_threshold=$($LCTL get_param -n \ + llite.*.read_ahead_async_file_threshold_mb 2>/dev/null) + local max_per_file_mb=$($LCTL get_param -n \ + llite.*.max_read_ahead_per_file_mb 2>/dev/null) + + local invalid=$(($max_per_file_mb + 1)) + $LCTL set_param \ + llite.*.read_ahead_async_file_threshold_mb=$invalid\ + && error "set $invalid should fail" + + local valid=$(($invalid - 1)) + $LCTL set_param \ + llite.*.read_ahead_async_file_threshold_mb=$valid || + error "set $valid should succeed" + local threshold=$($LCTL get_param -n \ + llite.*.read_ahead_async_file_threshold_mb 2>/dev/null) + [ $threshold -eq $valid ] || error \ + "expect threshold $valid got $threshold" + $LCTL set_param \ + llite.*.read_ahead_async_file_threshold_mb=$old_threshold +} +run_test 318 "Verify async readahead tunables" + +test_319() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 + + local before=$(date +%s) + local evict + local mdir=$DIR/$tdir + local file=$mdir/xxx + + $LFS mkdir -i0 $mdir || error "mkdir $mdir fails" + touch $file + +#define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c + $LCTL set_param fail_val=5 fail_loc=0x8000032c + $LFS mv -m1 $file & + + sleep 1 + dd if=$file of=/dev/null + wait + evict=$($LCTL get_param mdc.$FSNAME-MDT*.state | + awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }') + + [ -z "$evict" ] || [[ $evict -le $before ]] || error "eviction happened" +} +run_test 319 "lost lease lock on migrate error" + test_fake_rw() { local read_write=$1 if [ "$read_write" = "write" ]; then @@ -19043,9 +20160,11 @@ test_404() { # LU-6601 run_test 404 "validate manual {de}activated works properly for OSPs" test_405() { - [ $MDS1_VERSION -lt $(version_code 2.6.92) -o \ - [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] && - skip "Layout swap lock is not supported" + [ -n "$FILESET" ] && skip "Not functional for FILESET set" + [ $MDS1_VERSION -lt $(version_code 2.6.92) ] || + [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] && + skip "Layout swap lock is not supported" + check_swap_layouts_support test_mkdir $DIR/$tdir @@ -19172,8 +20291,7 @@ run_test 408 "drop_caches should not hang due to page leaks" test_409() { - [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs" - check_mount_and_prep + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" mkdir -p $DIR/$tdir || error "(0) Fail to mkdir" $LFS mkdir -i 1 -c 2 $DIR/$tdir/foo || error "(1) Fail to mkdir" @@ -19197,6 +20315,7 @@ test_409() echo "Unlink hard links start at $(date)" unlinkmany $DIR/$tdir/foo/${PREFIX}_ 1000 || error "(7) Fail to unlink" + echo "Unlink hard links finished at $(date)" } run_test 409 "Large amount of cross-MDTs hard links on the same file" @@ -19274,7 +20393,7 @@ test_412() { } run_test 412 "mkdir on specific MDTs" -test_413() { +test_413a() { [ $MDSCOUNT -lt 2 ] && skip "We need at least 2 MDTs for this test" @@ -19308,7 +20427,140 @@ test_413() { error "don't expect $max" done } -run_test 413 "mkdir on less full MDTs" +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" + + local qos_prio_free + local qos_threshold_rr + local count + + 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" \ + EXIT + stack_trap "$LCTL set_param lmv.*.qos_maxage=$qos_maxage" EXIT + + echo "mkdir with roundrobin" + + $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" + done + for i in $(seq $MDSCOUNT); do + count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ | + wc -w) + echo "$count directories created on MDT$((i - 1))" + [ $count -eq 100 ] || error "subdirs are not evenly distributed" + done + + rm -rf $DIR/$tdir/* + + $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 + + local ffree + local max + local min + local max_index + local min_index + + ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-[^M]*.filesfree | uniq)) + echo "MDT filesfree available: ${ffree[@]}" + max=${ffree[0]} + min=${ffree[0]} + max_index=0 + min_index=0 + for ((i = 0; i < ${#ffree[@]}; i++)); do + if [[ ${ffree[i]} -gt $max ]]; then + max=${ffree[i]} + max_index=$i + fi + if [[ ${ffree[i]} -lt $min ]]; then + min=${ffree[i]} + min_index=$i + fi + done + echo "Min free files: MDT$min_index: $min" + echo "Max free files: MDT$max_index: $max" + + [ $min -eq 0 ] && skip "no free files in MDT$min_index" + [ $min -gt 10000000 ] && skip "too much free files in MDT$min_index" + + # Check if we need to generate uneven MDTs + test_mkdir -i $min_index -c 1 -p $DIR/$tdir-MDT$min_index + local threshold=10 + local diff=$((max - min)) + local diff2=$((diff * 100 / min)) + + echo -n "Check for uneven MDTs: " + echo -n "diff=$diff files ($diff2%) must be > $threshold% ..." + + if [ $diff2 -gt $threshold ]; then + echo "ok" + echo "Don't need to fill MDT$min_index" + else + # generate uneven MDTs, create till 25% diff + echo "no" + diff2=$((threshold - diff2)) + diff=$((min * diff2 / 100)) + # 50 sec per 10000 files in vm + [ $diff -gt 40000 ] && [ "$SLOW" = "no" ] && + skip "$diff files to create" + echo "Fill $diff2% diff in MDT$min_index with $diff files" + local i + local value="$(generate_string 1024)" + for i in $(seq $diff); do + $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE \ + $DIR/$tdir-MDT$min_index/f$i > /dev/null || + error "create f$i failed" + setfattr -n user.413b -v $value \ + $DIR/$tdir-MDT$min_index/f$i || + error "setfattr f$i failed" + done + fi + + min=$((100 *MDSCOUNT)) + max=0 + + echo "mkdir with balanced space usage" + $LCTL set_param lmv.*.qos_prio_free=100 + for i in $(seq $((100 * MDSCOUNT))); do + mkdir $DIR/$tdir/subdir$i || error "mkdir subdir$i failed" + done + for i in $(seq $MDSCOUNT); do + count=$($LFS getdirstripe -i $DIR/$tdir/* | grep ^$((i - 1))$ | + wc -w) + echo "$count directories created on MDT$((i - 1))" + [ $min -gt $count ] && min=$count + [ $max -lt $count ] && max=$count + done + [ $((max - min)) -gt $MDSCOUNT ] || + error "subdirs shouldn't be evenly distributed" + + which getfattr > /dev/null 2>&1 || skip_env "no getfattr command" + + $LFS setdirstripe -D -d $DIR/$tdir || error "setdirstripe -d failed" + getfattr -n trusted.dmv $DIR/$tdir && error "default dir layout exists" + true +} +run_test 413b "mkdir with balanced space usage" test_414() { #define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521 @@ -19418,31 +20670,45 @@ check_lfs_df() { local inodes local df_out local lfs_df_out + local count + local passed=false # blocks or inodes [ "$1" == "blocks" ] && inodes= || inodes="-i" - # read the lines of interest - df_out=($(df $inodes $dir | tail -n +2)) || - error "df $inodes $dir | tail -n +2 failed" - lfs_df_out=($($LFS df $inodes $dir | grep filesystem_summary:)) || - error "lfs df $inodes $dir | grep filesystem_summary: failed" - - # skip the first substrings of each command output as they are different - # :/:/" for df, "filesystem_summary:" for lfs df + # compare the two outputs + passed=true + for i in {1..5}; do + [ "${df_out[i]}" != "${lfs_df_out[i]}" ] && passed=false + done + $passed && break done + + if ! $passed; then + df -P $inodes $dir + echo + lfs df $inodes $dir + error "df and lfs df $1 output mismatch: " \ + "df ${inodes}: ${df_out[*]}, " \ + "lfs df ${inodes}: ${lfs_df_out[*]}" + fi } test_418() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + local dir=$DIR/$tdir local numfiles=$((RANDOM % 4096 + 2)) local numblocks=$((RANDOM % 256 + 1)) @@ -19459,8 +20725,6 @@ test_418() { echo "Creating a single file and testing" createmany -o $dir/$tfile- 1 &>/dev/null || error "creating 1 file in $dir failed" - cancel_lru_locks osc - sync; sleep 2 check_lfs_df blocks $dir check_lfs_df inodes $dir @@ -19476,8 +20740,6 @@ test_418() { error "dd to $dir/${tfile}-0 failed" # retest - cancel_lru_locks osc - sync; sleep 10 check_lfs_df blocks $dir check_lfs_df inodes $dir @@ -19486,6 +20748,282 @@ test_418() { } run_test 418 "df and lfs df outputs match" +test_419() +{ + local dir=$DIR/$tdir + + mkdir -p $dir + touch $dir/file + + cancel_lru_locks mdc + + #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410 + $LCTL set_param fail_loc=0x1410 + cat $dir/file + $LCTL set_param fail_loc=0 + rm -rf $dir +} +run_test 419 "Verify open file by name doesn't crash kernel" + +test_420() +{ + [[ $MDS1_VERSION -ge $(version_code 2.12.53) ]] || + skip "Need MDS version at least 2.12.53" + + local SAVE_UMASK=$(umask) + local dir=$DIR/$tdir + local uname=$(getent passwd $RUNAS_ID | cut -d: -f1) + + mkdir -p $dir + umask 0000 + mkdir -m03777 $dir/testdir + ls -dn $dir/testdir + # Need to remove trailing '.' when SELinux is enabled + local dirperms=$(ls -dn $dir/testdir | + awk '{ sub(/\.$/, "", $1); print $1}') + [ $dirperms == "drwxrwsrwt" ] || + error "incorrect perms on $dir/testdir" + + su - $uname -c "PATH=$LUSTRE/tests:\$PATH; \ + openfile -f O_RDONLY:O_CREAT -m 02755 $dir/testdir/testfile" + ls -n $dir/testdir/testfile + local fileperms=$(ls -n $dir/testdir/testfile | + awk '{ sub(/\.$/, "", $1); print $1}') + [ $fileperms == "-rwxr-xr-x" ] || + error "incorrect perms on $dir/testdir/testfile" + + umask $SAVE_UMASK +} +run_test 420 "clear SGID bit on non-directories for non-members" + +test_421a() { + local cnt + local fid1 + local fid2 + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 3 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 3 ] && error "unexpected #files: $cnt" + + fid1=$(lfs path2fid $DIR/$tdir/f1) + fid2=$(lfs path2fid $DIR/$tdir/f2) + $LFS rmfid $DIR $fid1 $fid2 || error "rmfid failed" + + stat $DIR/$tdir/f1 && error "f1 still visible on the client" + stat $DIR/$tdir/f2 && error "f2 still visible on the client" + + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 1 ] || error "unexpected #files after: $cnt" + + rm -f $DIR/$tdir/f3 || error "can't remove f3" + createmany -o $DIR/$tdir/f 3 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 3 ] && error "unexpected #files: $cnt" + + fid1=$(lfs path2fid $DIR/$tdir/f1) + fid2=$(lfs path2fid $DIR/$tdir/f2) + echo "remove using fsname $FSNAME" + $LFS rmfid $FSNAME $fid1 $fid2 || error "rmfid with fsname failed" + + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 1 ] || error "unexpected #files after: $cnt" +} +run_test 421a "simple rm by fid" + +test_421b() { + local cnt + local FID1 + local FID2 + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 3 + multiop_bg_pause $DIR/$tdir/f1 o_c || error "multiop failed to start" + MULTIPID=$! + + FID1=$(lfs path2fid $DIR/$tdir/f1) + FID2=$(lfs path2fid $DIR/$tdir/f2) + $LFS rmfid $DIR $FID1 $FID2 && error "rmfid didn't fail" + + kill -USR1 $MULTIPID + wait + + cnt=$(ls $DIR/$tdir | wc -l) + [ $cnt == 2 ] || error "unexpected #files after: $cnt" +} +run_test 421b "rm by fid on open file" + +test_421c() { + local cnt + local FIDS + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 3 + touch $DIR/$tdir/$tfile + createmany -l$DIR/$tdir/$tfile $DIR/$tdir/h 180 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 184 ] && error "unexpected #files: $cnt" + + FID1=$(lfs path2fid $DIR/$tdir/$tfile) + $LFS rmfid $DIR $FID1 || error "rmfid failed" + + cnt=$(ls $DIR/$tdir | wc -l) + [ $cnt == 3 ] || error "unexpected #files after: $cnt" +} +run_test 421c "rm by fid against hardlinked files" + +test_421d() { + local cnt + local FIDS + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + createmany -o $DIR/$tdir/f 4097 + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 4097 ] && error "unexpected #files: $cnt" + + FIDS=$(lfs path2fid $DIR/$tdir/f* | sed "s/[/][^:]*://g") + $LFS rmfid $DIR $FIDS || error "rmfid failed" + + cnt=$(ls $DIR/$tdir | wc -l) + rm -rf $DIR/$tdir + [ $cnt == 0 ] || error "unexpected #files after: $cnt" +} +run_test 421d "rmfid en masse" + +test_421e() { + local cnt + local FID + + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + mkdir -p $DIR/$tdir + $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir + createmany -o $DIR/$tdir/striped_dir/f 512 + cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l) + [ $cnt != 512 ] && error "unexpected #files: $cnt" + + FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* | + sed "s/[/][^:]*://g") + $LFS rmfid $DIR $FIDS || error "rmfid failed" + + cnt=$(ls $DIR/$tdir/striped_dir | wc -l) + rm -rf $DIR/$tdir + [ $cnt == 0 ] || error "unexpected #files after: $cnt" +} +run_test 421e "rmfid in DNE" + +test_421f() { + local cnt + local FID + + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + test_mkdir $DIR/$tdir + touch $DIR/$tdir/f + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files: $cnt" + + FID=$(lfs path2fid $DIR/$tdir/f) + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (1)" + # rmfid should fail + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files after (2): $cnt" + + chmod a+rw $DIR/$tdir + ls -la $DIR/$tdir + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail (2)" + # rmfid should fail + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files after (3): $cnt" + + rm -f $DIR/$tdir/f + $RUNAS touch $DIR/$tdir/f + FID=$(lfs path2fid $DIR/$tdir/f) + echo "rmfid as root" + $LFS rmfid $DIR $FID || error "rmfid as root failed" + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 0 ] || error "unexpected #files after (4): $cnt" + + rm -f $DIR/$tdir/f + $RUNAS touch $DIR/$tdir/f + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt != 1 ] && error "unexpected #files (4): $cnt" + FID=$(lfs path2fid $DIR/$tdir/f) + # rmfid w/o user_fid2path mount option should fail + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail(3)" + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 1 ] || error "unexpected #files after (5): $cnt" + + umount_client $MOUNT || "failed to umount client" + mount_client $MOUNT "$MOUNT_OPTS,user_fid2path" || + "failed to mount client'" + + $RUNAS $LFS rmfid $DIR $FID || error "rmfid failed" + # rmfid should succeed + cnt=$(ls -1 $DIR/$tdir | wc -l) + [ $cnt == 0 ] || error "unexpected #files after (6): $cnt" + + # rmfid shouldn't allow to remove files due to dir's permission + chmod a+rwx $DIR/$tdir + touch $DIR/$tdir/f + ls -la $DIR/$tdir + FID=$(lfs path2fid $DIR/$tdir/f) + $RUNAS $LFS rmfid $DIR $FID && error "rmfid didn't fail" + + umount_client $MOUNT || "failed to umount client" + mount_client $MOUNT "$MOUNT_OPTS" || + "failed to mount client'" + +} +run_test 421f "rmfid checks permissions" + +test_421g() { + local cnt + local FIDS + + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" + [ $MDS1_VERSION -lt $(version_code 2.12.54) ] && + skip "Need MDS version at least 2.12.54" + + mkdir -p $DIR/$tdir + $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir + createmany -o $DIR/$tdir/striped_dir/f 512 + cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l) + [ $cnt != 512 ] && error "unexpected #files: $cnt" + + FIDS=$(lfs path2fid $DIR/$tdir/striped_dir/f* | + sed "s/[/][^:]*://g") + + rm -f $DIR/$tdir/striped_dir/f1* + cnt=$(ls -1 $DIR/$tdir/striped_dir | wc -l) + removed=$((512 - cnt)) + + # few files have been just removed, so we expect + # rmfid to fail on their fids + errors=$($LFS rmfid $DIR $FIDS 2>&1 | wc -l) + [ $removed != $errors ] && error "$errors != $removed" + + cnt=$(ls $DIR/$tdir/striped_dir | wc -l) + rm -rf $DIR/$tdir + [ $cnt == 0 ] || error "unexpected #files after: $cnt" +} +run_test 421g "rmfid to return errors properly" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -19528,7 +21066,8 @@ test_801a() { echo "Start barrier_freeze at: $(date)" #define OBD_FAIL_BARRIER_DELAY 0x2202 do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202 - do_facet mgs $LCTL barrier_freeze $FSNAME 10 & + # Do not reduce barrier time - See LU-11873 + do_facet mgs $LCTL barrier_freeze $FSNAME 20 & sleep 2 local b_status=$(barrier_stat) @@ -19550,7 +21089,8 @@ test_801a() { [ "$b_status" = "'expired'" ] || error "(3) unexpected barrier status $b_status" - do_facet mgs $LCTL barrier_freeze $FSNAME 10 || + # Do not reduce barrier time - See LU-11873 + do_facet mgs $LCTL barrier_freeze $FSNAME 20 || error "(4) fail to freeze barrier" b_status=$(barrier_stat) @@ -19667,7 +21207,7 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 30 local b_status=$(barrier_stat) - [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || { + [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || { do_facet mgs $LCTL barrier_thaw $FSNAME error "(2) unexpected barrier status $b_status" } @@ -19675,7 +21215,8 @@ test_801c() { do_facet mgs $LCTL barrier_rescan $FSNAME || error "(3) Fail to rescan barrier bitmap" - do_facet mgs $LCTL barrier_freeze $FSNAME 10 + # Do not reduce barrier time - See LU-11873 + do_facet mgs $LCTL barrier_freeze $FSNAME 20 b_status=$(barrier_stat) [ "$b_status" = "'frozen'" ] || @@ -19700,19 +21241,21 @@ run_test 801c "rescan barrier bitmap" saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS +saved_MOUNT_OPTS=$MOUNT_OPTS -cleanup_802() { +cleanup_802a() { trap 0 stopall MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS + MOUNT_OPTS=$saved_MOUNT_OPTS setupall } -test_802() { - +test_802a() { + [[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test" [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && skip "Need server version at least 2.9.55" @@ -19724,7 +21267,7 @@ test_802() { cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ || error "(2) Fail to copy" - trap cleanup_802 EXIT + trap cleanup_802a EXIT # sync by force before remount as readonly sync; sync_all_data; sleep 3; sync_all_data @@ -19743,7 +21286,8 @@ test_802() { error "(4) Mount client without 'ro' should fail" echo "Mount client with ro should succeed" - mount_client $MOUNT ro || + MOUNT_OPTS=$(csa_add "$MOUNT_OPTS" -o ro) + mount_client $MOUNT || error "(5) Mount client with 'ro' should succeed" echo "Modify should be refused" @@ -19753,9 +21297,40 @@ test_802() { diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh || error "(7) Read should succeed under ro mode" - cleanup_802 + cleanup_802a } -run_test 802 "simulate readonly device" +run_test 802a "simulate readonly device" + +test_802b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + remote_mds_nodsh && skip "remote MDS with nodsh" + + do_facet $SINGLEMDS $LCTL get_param mdt.*.readonly || + skip "readonly option not available" + + $LFS mkdir -i 0 -c 1 $DIR/$tdir || error "(1) fail to mkdir" + + cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ || + error "(2) Fail to copy" + + # write back all cached data before setting MDT to readonly + cancel_lru_locks + sync_all_data + + do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=1 + stack_trap "do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0" EXIT + + echo "Modify should be refused" + touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode" + + echo "Read should be allowed" + diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh || + error "(7) Read should succeed under ro mode" + + # disable readonly + do_facet $SINGLEMDS $LCTL set_param mdt.*.readonly=0 +} +run_test 802b "be able to set MDTs to readonly" test_803() { [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" @@ -20055,6 +21630,7 @@ test_806() { run_test 806 "Verify Lazy Size on MDS" test_807() { + [ -n "$FILESET" ] && skip "Not functional for FILESET set" [ $MDS1_VERSION -lt $(version_code 2.11.52) ] && skip "Need MDS version at least 2.11.52" @@ -20170,20 +21746,29 @@ test_809() { run_test 809 "Verify no SOM xattr store for DoM-only files" test_810() { - local ORIG - local CSUM - - # t10 seem to dislike partial pages - lctl set_param osc.*.checksum_type=adler - lctl set_param fail_loc=0x411 - dd if=/dev/urandom of=$DIR/$tfile bs=10240 count=2 - ORIG=$(md5sum $DIR/$tfile) - lctl set_param ldlm.namespaces.*osc*.lru_size=clear - CSUM=$(md5sum $DIR/$tfile) - set_checksum_type adler - if [ "$ORIG" != "$CSUM" ]; then - error "$ORIG != $CSUM" - fi + [ $PARALLEL == "yes" ] && skip "skip parallel run" + $GSS && skip_env "could not run with gss" + + set_checksums 1 + stack_trap "set_checksums $ORIG_CSUM" EXIT + stack_trap "set_checksum_type $ORIG_CSUM_TYPE" EXIT + + local csum + local before + local after + for csum in $CKSUM_TYPES; do + #define OBD_FAIL_OSC_NO_GRANT 0x411 + $LCTL set_param osc.*.checksum_type=$csum fail_loc=0x411 + for i in "10240 0" "10000 0" "4000 1" "500 1"; do + eval set -- $i + dd if=/dev/urandom of=$DIR/$tfile bs=$1 count=2 seek=$2 + before=$(md5sum $DIR/$tfile) + $LCTL set_param ldlm.namespaces.*osc*.lru_size=clear + after=$(md5sum $DIR/$tfile) + [ "$before" == "$after" ] || + error "$csum: $before != $after bs=$1 seek=$2" + done + done } run_test 810 "partial page writes on ZFS (LU-11663)" @@ -20204,6 +21789,277 @@ test_811() { } run_test 811 "orphan name stub can be cleaned up in startup" +test_812() { + [ $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 + # 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" + + 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)" + +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" + + local readsample + local writesample + local readbyte + local writebyte + local readsample1 + local writesample1 + local readbyte1 + local writebyte1 + + local period_second=$($LCTL get_param -n llite.*.heat_period_second) + local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage) + + $LCTL set_param -n llite.*.file_heat=1 + echo "Turn on file heat" + echo "Period second: $period_second, Decay percentage: $decay_pct" + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + local out=$($LFS heat_get $DIR/$tfile) + + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -le 4 ] || error "read sample ($readsample) is wrong" + [ $writesample -le 3 ] || error "write sample ($writesample) is wrong" + [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong" + + sleep $((period_second + 3)) + echo "Sleep $((period_second + 3)) seconds..." + # The recursion formula to calculate the heat of the file f is as + # follow: + # Hi+1(f) = (1-P)*Hi(f)+ P*Ci + # Where Hi is the heat value in the period between time points i*I and + # (i+1)*I; Ci is the access count in the period; the symbol P refers + # to the weight of Ci. + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] || + error "read sample ($readsample) is wrong" + [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] || + error "write sample ($writesample) is wrong" + [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] || + error "read bytes ($readbyte) is wrong" + [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] || + error "write bytes ($writebyte) is wrong" + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + sleep $((period_second + 3)) + echo "Sleep $((period_second + 3)) seconds..." + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \ + 4 * $decay_pct) / 100") -eq 1 ] || + error "read sample ($readsample1) is wrong" + [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \ + 3 * $decay_pct) / 100") -eq 1 ] || + error "write sample ($writesample1) is wrong" + [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \ + 20 * $decay_pct) / 100") -eq 1 ] || + error "read bytes ($readbyte1) is wrong" + [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \ + 15 * $decay_pct) / 100") -eq 1 ] || + error "write bytes ($writebyte1) is wrong" + + echo "Turn off file heat for the file $DIR/$tfile" + $LFS heat_set -o $DIR/$tfile + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong" + [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong" + [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong" + + echo "Trun on file heat for the file $DIR/$tfile" + $LFS heat_set -O $DIR/$tfile + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong" + [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong" + [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong" + + $LFS heat_set -c $DIR/$tfile + $LCTL set_param -n llite.*.file_heat=0 + echo "Turn off file heat support for the Lustre filesystem" + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong" + [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong" + [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong" + + $LCTL set_param -n llite.*.file_heat=$file_heat_sav + rm -f $DIR/$tfile +} +run_test 813 "File heat verfication" + +test_814() +{ + dd of=$DIR/$tfile seek=128 bs=1k < /dev/null + echo -n y >> $DIR/$tfile + cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed" + diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same" +} +run_test 814 "sparse cp works as expected (LU-12361)" + +test_815() +{ + writeme -b 100 $DIR/$tfile || error "write 100 bytes failed" + writeme -b 0 $DIR/$tfile || error "write 0 byte failed" +} +run_test 815 "zero byte tiny write doesn't hang (LU-12382)" + +test_816() { + [ "$SHARED_KEY" = true ] && + skip "OSC connections never go IDLE with Shared-Keys enabled" + + $LFS setstripe -c 1 -i 0 $DIR/$tfile + # 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 + lru_resize_disable osc + local before + local now + before=$($LCTL get_param -n \ + ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size) + + wait_osc_import_state client ost1 IDLE + dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync + now=$($LCTL get_param -n \ + ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size) + [ $before == $now ] || error "lru_size changed $before != $now" +} +run_test 816 "do not reset lru_resize on idle reconnect" + +cleanup_817() { + umount $tmpdir + exportfs -u localhost:$DIR/nfsexp + rm -rf $DIR/nfsexp +} + +test_817() { + systemctl restart nfs-server.service || skip "failed to restart nfsd" + + mkdir -p $DIR/nfsexp + exportfs -orw,no_root_squash localhost:$DIR/nfsexp || + error "failed to export nfs" + + tmpdir=$(mktemp -d /tmp/nfs-XXXXXX) + stack_trap cleanup_817 EXIT + + mount -t nfs -orw localhost:$DIR/nfsexp $tmpdir || + error "failed to mount nfs to $tmpdir" + + cp /bin/true $tmpdir + $DIR/nfsexp/true || error "failed to execute 'true' command" +} +run_test 817 "nfsd won't cache write lock for exec file" + +test_818() { + mkdir $DIR/$tdir + $LFS setstripe -c1 -i0 $DIR/$tfile + $LFS setstripe -c1 -i1 $DIR/$tfile + stop $SINGLEMDS + #define OBD_FAIL_OSP_CANT_PROCESS_LLOG 0x2105 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80002105 + start $SINGLEMDS $(mdsdevname ${SINGLEMDS//mds/}) $MDS_MOUNT_OPTS || + error "start $SINGLEMDS failed" + rm -rf $DIR/$tdir +} +run_test 818 "unlink with failed llog" + # # tests that do cleanup/setup should be run at the end #