#!/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.
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}
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"
fi
fi
+build_test_filter
FAIL_ON_ERROR=false
cleanup() {
check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
-build_test_filter
-
if [ "${ONLY}" = "MOUNT" ] ; then
echo "Lustre is up, please go on"
exit
}
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() {
# 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}
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
}
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
[ $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"
$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)
}
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
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)
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
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
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
#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"
# 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
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
}
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"
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 \
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 \
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
}
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
}
run_test 412 "mkdir on specific MDTs"
-test_413() {
+test_413a() {
[ $MDSCOUNT -lt 2 ] &&
skip "We need at least 2 MDTs for this test"
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%%%}
+
+ 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
+
+ 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
+
+ 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
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"
}
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
#