X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=37e6ab7158de12958891295314ee022d9e3b148a;hb=8fbef5ee761920faa3c84f142f56934d6266a409;hp=bac8c63de5decfe524385739e07a1801496cb594;hpb=225e7b8c70fb68bc3aa3a6d88c5e9bda322c9cc9;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh old mode 100755 new mode 100644 index bac8c63..37e6ab7 --- 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,44 +7,17 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: LU-9693 LU-6493 LU-9693 -ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c" -# 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 # Check Grants after these tests GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d" -# skip the grant tests for ARM until they are fixed -if [[ $(uname -m) = aarch64 ]]; then - # bug number: LU-11596 (all below) - ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST" - # bug number: LU-11671 LU-11594 LU-11667 LU-11729 - ALWAYS_EXCEPT+=" 45 103a 317 810" -fi - -SRCDIR=$(cd $(dirname $0); echo $PWD) -export PATH=$PATH:/sbin - -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} @@ -58,21 +30,33 @@ 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} 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-11594 LU-11667 LU-11729 + ALWAYS_EXCEPT+=" 45 103a 317 810" +fi + # 5 12 (min)" [ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o" @@ -121,6 +105,7 @@ elif [ -r /etc/os-release ]; then fi fi +build_test_filter FAIL_ON_ERROR=false cleanup() { @@ -157,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 @@ -1759,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() { @@ -1794,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} @@ -1807,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 } @@ -2050,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 @@ -2495,6 +2472,8 @@ test_27D() { [ $MDS1_VERSION -lt $(version_code 2.9.55) ] || [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] && skip27D+=" -s 30,31" + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code $SEL_VER) ] && + skip27D+="-s 32" [[ ! $($LCTL get_param mdc.*.import) =~ connect_flags.*overstriping || $OSTCOUNT -ge $(($LOV_MAX_STRIPE_COUNT / 2)) ]] && skip27D+=" -s 32,33" @@ -2530,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) @@ -2827,6 +2810,24 @@ test_27K() { } 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 @@ -5112,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) @@ -6949,9 +6950,9 @@ test_60g() { run_test 60g "transaction abort won't cause MDT hung" test_60h() { - [ $MDS1_VERSION -le $(version_code 2.12.52) ] || + [ $MDS1_VERSION -le $(version_code 2.12.52) ] && skip "Need MDS version at least 2.12.52" - [ $MDSCOUNT -le 2 ] || skip "Need >= 2 MDTs" + [ $MDSCOUNT -lt 2 ] && skip "Need at least 2 MDTs" local f @@ -7299,7 +7300,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 @@ -8616,6 +8617,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 @@ -9602,7 +9623,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 @@ -9723,17 +9744,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" @@ -15038,8 +15059,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" @@ -15196,9 +15217,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 @@ -15224,9 +15245,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 @@ -16887,33 +16908,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" @@ -16921,9 +16915,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 \ @@ -16935,60 +16928,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 - - test_253_fill_ost $ost_name $mdtosc_proc1 $new_lwm + dd if=/dev/zero of=$DIR/$tdir/$tfile.0 bs=1M count=10 - #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 \ @@ -16998,16 +16976,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 @@ -19391,6 +19359,51 @@ 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 @@ -19952,7 +19965,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" @@ -19986,7 +19999,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 @@ -20204,14 +20350,17 @@ test_420() umask 0000 mkdir -m03777 $dir/testdir ls -dn $dir/testdir - local dirperms=$(ls -dn $dir/testdir | awk '{print $1}') + # 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" - $PDSH ${uname}@localhost "PATH=$LUSTRE/tests:\$PATH; \ + 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 '{print $1}') + local fileperms=$(ls -n $dir/testdir/testfile | + awk '{ sub(/\.$/, "", $1); print $1}') [ $fileperms == "-rwxr-xr-x" ] || error "incorrect perms on $dir/testdir/testfile" @@ -20433,6 +20582,7 @@ 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_802a() { trap 0 @@ -20441,6 +20591,7 @@ cleanup_802a() { 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 } @@ -20476,7 +20627,8 @@ test_802a() { 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" @@ -21172,6 +21324,34 @@ test_814() } 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() { + $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" + # # tests that do cleanup/setup should be run at the end #