DEF_STRIPE_COUNT=-1
CHECK_GRANT=${CHECK_GRANT:-"yes"}
GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
-export PARALLEL=${PARALLEL:-"no"}
TRACE=${TRACE:-""}
LUSTRE=${LUSTRE:-$(dirname $0)/..}
LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
. $LUSTRE/tests/test-framework.sh
-init_test_env $@
+init_test_env "$@"
init_logging
ALWAYS_EXCEPT="$SANITY_EXCEPT "
-# bug number for skipped test: LU-9693 LU-6493 LU-9693
-ALWAYS_EXCEPT+=" 42a 42b 42c "
-# bug number: LU-8411 LU-9054
-ALWAYS_EXCEPT+=" 407 312"
+always_except LU-9693 42a 42c
+always_except LU-6493 42b
+always_except LU-14541 277
+always_except LU-9054 312
+always_except LU-8411 407
if $SHARED_KEY; then
- # bug number: LU-14181 LU-14181
- ALWAYS_EXCEPT+=" 64e 64f"
-fi
-
-selinux_status=$(getenforce)
-if [ "$selinux_status" != "Disabled" ]; then
- # bug number:
- ALWAYS_EXCEPT+=""
+ always_except LU-14181 64e 64f
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
- ALWAYS_EXCEPT+=" 45"
- # bug number: LU-14067 LU-14067
- ALWAYS_EXCEPT+=" 400a 400b"
+ always_except LU-11671 45
fi
# skip nfs tests on kernels >= 4.12.0 until they are fixed
if [ $LINUX_VERSION_CODE -ge $(version_code 4.12.0) ]; then
- # bug number: LU-12661
- ALWAYS_EXCEPT+=" 817"
+ always_except LU-12661 817
fi
# skip cgroup tests on RHEL8.1 kernels until they are fixed
if (( $LINUX_VERSION_CODE >= $(version_code 4.18.0) &&
$LINUX_VERSION_CODE < $(version_code 5.4.0) )); then
- # bug number: LU-13063
- ALWAYS_EXCEPT+=" 411"
+ always_except LU-13063 411
+fi
+
+#skip ACL tests on RHEL8 and SLES15 until tests changed to use other users
+if (( $(egrep -cw "^bin|^daemon" /etc/passwd) < 2 )); then
+ always_except LU-15259 103a 125 154a
fi
# 5 12 8 12 15 (min)"
[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 60i 64b 68 71 115 135 136 230d 300o"
if [ "$mds1_FSTYPE" = "zfs" ]; then
- # bug number for skipped test:
- ALWAYS_EXCEPT+=" "
# 13 (min)"
[ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
fi
if [ "$ost1_FSTYPE" = "zfs" ]; then
- # bug number for skipped test: LU-1941 LU-1941 LU-1941 LU-1941
- ALWAYS_EXCEPT+=" 130a 130b 130c 130d 130e 130f 130g"
+ always_except LU-1941 130a 130b 130c 130d 130e 130f 130g
fi
proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
if [ -r /etc/SuSE-release ]; then
sles_version=$(sles_version_code)
[ $sles_version -lt $(version_code 11.4.0) ] &&
- # bug number for skipped test: LU-4341
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
+ always_except LU-4341 170
+
[ $sles_version -lt $(version_code 12.0.0) ] &&
- # bug number for skipped test: LU-3703
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 234"
+ always_except LU-3703 234
elif [ -r /etc/os-release ]; then
if grep -qi ubuntu /etc/os-release; then
ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
awk '{ print $1 }'))
if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
- # bug number for skipped test:
- # LU-10334 LU-10366
- ALWAYS_EXCEPT+=" 103a 410"
+ always_except LU-10334 103a
+ always_except LU-10366 410
fi
fi
fi
done
local mds_index=$(($($LFS getstripe -m $wdir) + 1))
- local devname=$(mdsdevname $mds_index)
echo "stop and checking mds${mds_index}:"
# e2fsck should not return error
stop mds${mds_index}
+ local devname=$(mdsdevname $mds_index)
run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
rc=$?
# create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
# so it only check MDT1/MDT2 instead of all of MDTs.
for mdt_index in 1 2; do
- local devname=$(mdsdevname $mdt_index)
# e2fsck should not return error
stop mds${mdt_index}
+ local devname=$(mdsdevname $mdt_index)
run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
rc=$((rc + $?))
run_test 24u "create stripe file"
simple_cleanup_common() {
+ local createmany=$1
local rc=0
- trap 0
- [ -z "$DIR" ] || [ -z "$tdir" ] && return 0
+
+ [[ -z "$DIR" || -z "$tdir" || ! -d "$DIR/$tdir" ]] && return 0
local start=$SECONDS
- rm -rf $DIR/$tdir
+
+ [[ -n "$createmany" ]] && unlinkmany $DIR/$tdir/$tfile $createmany
+ rm -rf $DIR/$tdir || error "cleanup $DIR/$tdir failed"
rc=$?
wait_delete_completed
echo "cleanup time $((SECONDS - start))"
test_mkdir "$(dirname $fname)"
# assume MDT0000 has the fewest inodes
local stripes=$($LFS getdirstripe -c $(dirname $fname))
- local free_inodes=$(($(mdt_free_inodes 0) * stripes))
+ local free_inodes=$(($(mdt_free_inodes 0) * ${stripes/#0/1}))
[[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
- trap simple_cleanup_common EXIT
+ stack_trap "simple_cleanup_common $nrfiles"
createmany -m "$fname" $nrfiles
local rpc_pages=$(max_pages_per_rpc $mdt_idx)
local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
- echo "readpages: $mds_readpage rpc_max: $rpc_max"
- (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
+ echo "readpages: $mds_readpage rpc_max: $rpc_max-2/+1"
+ (( $mds_readpage >= $rpc_max - 2 && $mds_readpage <= $rpc_max + 1)) ||
error "large readdir doesn't take effect: " \
"$mds_readpage should be about $rpc_max"
-
- simple_cleanup_common
}
run_test 24v "list large directory (test hash collision, b=17560)"
test_24A() { # LU-3182
local NFILES=5000
- rm -rf $DIR/$tdir
test_mkdir $DIR/$tdir
- trap simple_cleanup_common EXIT
+ stack_trap "simple_cleanup_common $NFILES"
createmany -m $DIR/$tdir/$tfile $NFILES
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 ] || [ $u -ne $NFILES ] ||
- [ $v -ne $((NFILES + 2)) ] ; then
- error "Expected $NFILES files, got $t ($u unique $v .&..)"
- fi
- simple_cleanup_common || error "Can not delete directories"
+ (( $t == $NFILES && $u == $NFILES && $v == NFILES + 2 )) ||
+ error "Expected $NFILES files, got $t ($u unique $v .&..)"
}
run_test 24A "readdir() returns correct number of entries."
}
run_test 24G "migrate symlink in rename"
+test_24H() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
+ [[ $(hostname) != $(facet_active_host mds2) ]] ||
+ skip "MDT1 should be on another node"
+
+ test_mkdir -i 1 -c 1 $DIR/$tdir
+#define OBD_FAIL_FLD_QUERY_REQ 0x1103
+ do_facet mds2 $LCTL set_param fail_loc=0x80001103
+ touch $DIR/$tdir/$tfile || error "touch failed"
+}
+run_test 24H "repeat FLD_QUERY rpc"
+
test_25a() {
echo '== symlink sanity ============================================='
if [[ $ORIGFREE -gt $MAXFREE ]]; then
skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
fi
- trap simple_cleanup_common EXIT
+ stack_trap simple_cleanup_common
test_mkdir $DIR/$tdir
$LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
touch $DIR/$tdir/$tfile.$i
[ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
awk '{print $1}'| grep -w "0") ] &&
- error "OST0 was full but new created file still use it"
- simple_cleanup_common
+ error "OST0 was full but new created file still use it" || true
}
run_test 27m "create file while OST0 was full"
#define OBD_FAIL_MDS_OSC_PRECREATE 0x139
do_nodes $list $LCTL set_param fail_loc=0x139
test_mkdir -p $DIR/$tdir
- trap simple_cleanup_common EXIT
- createmany -o $DIR/$tdir/t- 1000
+ stack_trap "simple_cleanup_common 1000"
+ createmany -o $DIR/$tdir/$tfile 1000
do_nodes $list $LCTL set_param fail_loc=0
TLOG=$TMP/$tfile.getstripe
$LFS getstripe $DIR/$tdir > $TLOG
OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
- unlinkmany $DIR/$tdir/t- 1000
- trap 0
[[ $OBJS -gt 0 ]] &&
error "$OBJS objects created on OST-0. See $TLOG" ||
rm -f $TLOG
# get striping information
ost_idx=($($LFS getstripe $tfile$i |
tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
- echo ${ost_idx[@]}
+ echo "OST Index: ${ost_idx[*]}"
# check the layout
[ ${#ost_idx[@]} -eq $OSTCOUNT ] ||
for index in $(seq 0 $((OSTCOUNT - 1))); do
found=0
- for j in $(echo ${ost_idx[@]}); do
+ for j in "${ost_idx[@]}"; do
if [ $index -eq $j ]; then
found=1
break
fi
done
[ $found = 1 ] ||
- error "Can not find $index in ${ost_idx[@]}"
+ error "Can not find $index in ${ost_idx[*]}"
done
done
}
$DIR/$tdir/${tdir}2 ||
error "$DIR/$tdir/${tdir}2: create failed"
+ $LFS getdirstripe -v $DIR/$tdir/${tdir}2
+
$LFS getdirstripe -v $DIR/$tdir/${tdir}2 |
grep "lfm_magic:.*0x0CD50CD0" ||
error "$DIR/$tdir/${tdir}2: invalid LMV EA magic"
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/$tfile && error "$DIR/$tdir: file create should fail"
touch $DIR/$tdir/${tdir}2/$tfile &&
- "$DIR/${tdir}2: file create should fail"
+ error "$DIR/${tdir}2: file create should fail"
# chmod should work
chmod 777 $DIR/$tdir/$tdir ||
remote_mds_nodsh && skip "remote MDS with nodsh"
[[ $OSTCOUNT -lt 2 ]] && skip_env "need > 1 OST"
- test_mkdir $DIR/$tdir
-
# Set default striping on directory
local setcount=4
local stripe_opt
+ local mdts=$(comma_list $(mdts_nodes))
# if we run against a 2.12 server which lacks overstring support
# then the connect_flag will not report overstriping, even if client
else
skip "server does not support overstriping"
fi
+
+ test_mkdir $DIR/$tdir
+
+ # Validate existing append_* params and ensure restore
+ local pool=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_pool)
+ [[ "$pool" == "" ]] || error "expected append_pool == '', got '$pool'"
+ stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool=none"
+
+ local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
+ ((orig_count == 1)) || error "expected append_stripe_count == 1, got $orig_count"
+ stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=1"
+
$LFS setstripe $stripe_opt $DIR/$tdir
echo 1 > $DIR/$tdir/${tfile}.1
[ $count -eq $setcount ] ||
error "(1) stripe count $count, should be $setcount"
- # Capture existing append_stripe_count setting for restore
- local orig_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
- local mdts=$(comma_list $(mdts_nodes))
- stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$orig_count" EXIT
-
local appendcount=$orig_count
echo 1 >> $DIR/$tdir/${tfile}.2_append
count=$($LFS getstripe -c $DIR/$tdir/${tfile}.2_append)
error "(9) stripe count $count, should be $appendcount for append"
# Now test O_APPEND striping with pools
- do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
- stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool='none'" EXIT
-
- # Create the pool
pool_add $TESTNAME || error "pool creation failed"
pool_add_targets $TESTNAME 0 1 || error "Pool add targets failed"
+ do_nodes $mdts $LCTL set_param mdd.*.append_pool="$TESTNAME"
echo 1 >> $DIR/$tdir/${tfile}.10_append
--flags=0xda05 --mode 0750 $DIR/$tdir/${tdir} ||
error "$DIR/$tdir/${tdir}: create failed"
+ $LFS getdirstripe -v $DIR/$tdir/${tdir}
+
$LFS getdirstripe -v $DIR/$tdir/${tdir} |
grep "lfm_magic:.*0x0CD50CD0" ||
error "$DIR/$tdir/${tdir}: invalid LMV EA magic"
# file create in dir should fail
# ("/{foreign_symlink_prefix}/${uuid1}/${uuid2}/" missing)
- touch $DIR/$tdir/$tdir/$tfile && "$DIR/$tdir: file create should fail"
+ touch $DIR/$tdir/$tdir/$tfile && error "$DIR/$tdir: file create should fail"
# rename should succeed
mv $DIR/$tdir/$tdir $DIR/$tdir/${tdir}.new ||
}
run_test 27Q "llapi_file_get_stripe() works on symlinks"
+test_27R() {
+ (( $MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "need MDS 2.14.55 or later"
+ (( $OSTCOUNT >= 2 )) || skip_env "needs at least 2 OSTs"
+
+ local testdir="$DIR/$tdir"
+ test_mkdir -p $testdir
+ stack_trap "rm -rf $testdir"
+ $LFS setstripe -c -1 $testdir || error "setstripe failed"
+
+ local f1="$testdir/f1"
+ touch $f1 || error "failed to touch $f1"
+ local count=$($LFS getstripe -c $f1)
+ (( $count == $OSTCOUNT )) || error "wrong stripe count"
+
+ do_facet $SINGLEMDS $LCTL set_param lod.*.max_stripecount=-1
+ (( $? == 34 )) || error "setting max_stripecount to -1 should fail and return ERANGE"
+
+ local maxcount=$(($OSTCOUNT - 1))
+ local mdts=$(comma_list $(mdts_nodes))
+ do_nodes $mdts $LCTL set_param lod.*.max_stripecount=$maxcount
+ stack_trap "do_nodes $mdts $LCTL set_param lod.*.max_stripecount=0"
+
+ local f2="$testdir/f2"
+ touch $f2 || error "failed to touch $f2"
+ local count=$($LFS getstripe -c $f2)
+ (( $count == $maxcount )) || error "wrong stripe count"
+}
+run_test 27R "test max_stripecount limitation when stripe count is set to -1"
+
+test_27T() {
+ [ $(facet_host client) == $(facet_host ost1) ] &&
+ skip "need ost1 and client on different nodes"
+
+#define OBD_FAIL_OSC_NO_GRANT 0x411
+ $LCTL set_param fail_loc=0x20000411 fail_val=1
+#define OBD_FAIL_OST_ENOSPC 0x215
+ do_facet ost1 "$LCTL set_param fail_loc=0x80000215"
+ $LFS setstripe -i 0 -c 1 $DIR/$tfile
+ $MULTIOP $DIR/$tfile oO_WRONLY:P$((4 * 1024 * 1024 + 10 * 4096))c ||
+ error "multiop failed"
+}
+run_test 27T "no eio on close on partial write due to enosp"
+
+test_27U() {
+ local dir=$DIR/$tdir
+ local file=$dir/$tfile
+ local append_pool=${TESTNAME}-append
+ local normal_pool=${TESTNAME}-normal
+ local pool
+ local stripe_count
+ local stripe_count2
+ local mdts=$(comma_list $(mdts_nodes))
+
+ # FIMXE
+ # (( $MDS1_VERSION >= $(version_code 2.15.42) )) ||
+ # skip "Need MDS version at least 2.15.42"
+
+ # Validate existing append_* params and ensure restore
+ pool=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_pool)
+ [[ "$pool" == "" ]] || error "expected append_pool == '', got '$pool'"
+ stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_pool=none"
+
+ stripe_count=$(do_facet mds1 $LCTL get_param -n mdd.$FSNAME-MDT0000.append_stripe_count)
+ ((stripe_count == 1)) || error "expected append_stripe_count != 0, got $stripe_count"
+ stack_trap "do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=$stripe_count"
+
+ pool_add $append_pool || error "pool creation failed"
+ pool_add_targets $append_pool 0 1 || error "Pool add targets failed"
+
+ pool_add $normal_pool || error "pool creation failed"
+ pool_add_targets $normal_pool 0 1 || error "Pool add targets failed"
+
+ test_mkdir $dir
+ $LFS setstripe -E 1M -c 1 -p $normal_pool -E 2M -c 2 -p $normal_pool -E eof -c -1 $dir
+
+ echo XXX >> $file.1
+ $LFS getstripe $file.1
+
+ pool=$($LFS getstripe -p $file.1)
+ [[ "$pool" == "$normal_pool" ]] || error "got pool '$pool', expected '$normal_pool'"
+
+ stripe_count2=$($LFS getstripe -c $file.1)
+ ((stripe_count2 == stripe_count)) ||
+ error "got stripe_count '$stripe_count2', expected '$stripe_count'"
+
+ do_nodes $mdts $LCTL set_param mdd.*.append_pool=$append_pool
+
+ echo XXX >> $file.2
+ $LFS getstripe $file.2
+
+ pool=$($LFS getstripe -p $file.2)
+ [[ "$pool" == "$append_pool" ]] || error "got pool '$pool', expected '$append_pool'"
+
+ do_nodes $mdts $LCTL set_param mdd.*.append_stripe_count=2
+
+ echo XXX >> $file.3
+ $LFS getstripe $file.3
+
+ stripe_count2=$($LFS getstripe -c $file.3)
+ ((stripe_count2 == 2)) || error "got stripe_count '$stripe_count2', expected 2"
+}
+run_test 27U "append pool and stripe count work with composite default layout"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
test_29() {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
+ [ $MDS1_VERSION -ge $(version_code 2.14.51) ] && {
+ disable_opencache
+ stack_trap "restore_opencache"
+ }
+
sync; sleep 1; sync # flush out any dirty pages from previous tests
cancel_lru_locks
test_mkdir $DIR/d29
}
run_test 33g "nonroot user create already existing root created file"
-test_33h() {
- [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
- [ $MDS1_VERSION -lt $(version_code 2.13.50) ] &&
- skip "Need MDS version at least 2.13.50"
+sub_33h() {
+ local hash_type=$1
+ local count=250
- test_mkdir -c $MDSCOUNT -H crush $DIR/$tdir ||
- error "mkdir $tdir failed"
+ test_mkdir -c $MDSCOUNT -H $hash_type $DIR/$tdir ||
+ error "lfs mkdir -H $hash_type $tdir failed"
touch $DIR/$tdir/$tfile || error "touch $tfile failed"
local index=$($LFS getstripe -m $DIR/$tdir/$tfile)
local index2
+ local fname
for fname in $DIR/$tdir/$tfile.bak \
$DIR/$tdir/$tfile.SAV \
$DIR/$tdir/$tfile.orig \
$DIR/$tdir/$tfile~; do
- touch $fname || error "touch $fname failed"
+ touch $fname || error "touch $fname failed"
index2=$($LFS getstripe -m $fname)
- [ $index -eq $index2 ] ||
+ (( $index == $index2 )) ||
error "$fname MDT index mismatch $index != $index2"
done
local failed=0
- for i in {1..250}; do
- for fname in $(mktemp -u $DIR/$tdir/.$tfile.XXXXXX) \
- $(mktemp $DIR/$tdir/$tfile.XXXXXXXX); do
- touch $fname || error "touch $fname failed"
+ local patterns=(".$tfile.XXXXXX" "$tfile.XXXXXXXX")
+ local pattern
+
+ for pattern in ${patterns[*]}; do
+ echo "pattern $pattern"
+ fname=$DIR/$tdir/$pattern
+ for (( i = 0; i < $count; i++ )); do
+ fname=$(mktemp $DIR/$tdir/$pattern) ||
+ error "mktemp $DIR/$tdir/$pattern failed"
index2=$($LFS getstripe -m $fname)
- if [[ $index != $index2 ]]; then
- failed=$((failed + 1))
- echo "$fname MDT index mismatch $index != $index2"
- fi
+ (( $index == $index2 )) && continue
+
+ failed=$((failed + 1))
+ echo "$fname MDT index mismatch $index != $index2"
+ done
+ done
+
+ echo "$failed/$count MDT index mismatches, expect ~2-4"
+ (( failed < 10 )) || error "MDT index mismatch $failed/$count times"
+
+ local same=0
+ local expect
+
+ # verify that "crush" is still broken with all files on same MDT,
+ # crush2 should have about 1/MDSCOUNT files on each MDT, with margin
+ [[ "$hash_type" == "crush" ]] && expect=$count ||
+ expect=$((count / MDSCOUNT))
+
+ # crush2 doesn't put all-numeric suffixes on the same MDT,
+ # filename like $tfile.12345678 should *not* be considered temp
+ for pattern in ${patterns[*]}; do
+ local base=${pattern%%X*}
+ local suff=${pattern#$base}
+
+ echo "pattern $pattern"
+ for (( i = 0; i < $count; i++ )); do
+ fname=$DIR/$tdir/$base$((${suff//X/1} + i))
+ touch $fname || error "touch $fname failed"
+ index2=$($LFS getstripe -m $fname)
+ (( $index != $index2 )) && continue
+
+ same=$((same + 1))
+ done
+ done
+
+ echo "$((same/${#patterns[*]}))/$count matches, expect ~$expect for $1"
+ (( same / ${#patterns[*]} < expect * 5 / 4 &&
+ same / ${#patterns[*]} > expect * 4 / 5 )) ||
+ error "MDT index match $((same / ${#patterns[*]}))/$count times"
+ same=0
+
+ # crush2 doesn't put suffixes with special characters on the same MDT
+ # filename like $tfile.txt.1234 should *not* be considered temp
+ for pattern in ${patterns[*]}; do
+ local base=${pattern%%X*}
+ local suff=${pattern#$base}
+
+ pattern=$base...${suff/XXX}
+ echo "pattern=$pattern"
+ for (( i = 0; i < $count; i++ )); do
+ fname=$(mktemp $DIR/$tdir/$pattern) ||
+ error "touch $fname failed"
+ index2=$($LFS getstripe -m $fname)
+ (( $index != $index2 )) && continue
+
+ same=$((same + 1))
done
done
- echo "$failed MDT index mismatches"
- (( failed < 20 )) || error "MDT index mismatch $failed times"
+ echo "$((same/${#patterns[*]}))/$count matches, expect ~$expect for $1"
+ (( same / ${#patterns[*]} < expect * 5 / 4 &&
+ same / ${#patterns[*]} > expect * 4 / 5 )) ||
+ error "MDT index match $((same / ${#patterns[*]}))/$count times"
+}
+
+test_33h() {
+ (( $MDSCOUNT >= 2 )) || skip "needs >= 2 MDTs"
+ (( $MDS1_VERSION >= $(version_code 2.13.50) )) ||
+ skip "Need MDS version at least 2.13.50"
+
+ sub_33h crush
+}
+run_test 33h "temp file is located on the same MDT as target (crush)"
+
+test_33hh() {
+ (( $MDSCOUNT >= 2 )) || skip "needs >= 2 MDTs"
+ echo "MDS1_VERSION=$MDS1_VERSION version_code=$(version_code 2.15.0)"
+ (( $MDS1_VERSION > $(version_code 2.15.0) )) ||
+ skip "Need MDS version at least 2.15.0 for crush2"
+
+ sub_33h crush2
+}
+run_test 33hh "temp file is located on the same MDT as target (crush2)"
+
+test_33i()
+{
+ (( MDSCOUNT < 2 )) && skip "needs >= 2 MDTs"
+
+ local FNAME=$(str_repeat 'f' 250)
+
+ test_mkdir -i 0 -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+ createmany -o $DIR/$tdir/$FNAME 1000 || error "createmany failed"
+
+ local count
+ local total
+
+ count=$($LFS getstripe -m $DIR/$tdir/* | grep -cw 1)
+
+ local MDC=$(lctl dl | awk '/MDT0001-mdc-[^M]/ { print $4 }')
+
+ lctl --device %$MDC deactivate
+ stack_trap "lctl --device %$MDC activate"
+ ls $DIR/$tdir > /dev/null && error "ls should return an error"
+ total=$(\ls -l $DIR/$tdir | wc -l)
+ # "ls -l" will list total in the first line
+ total=$((total - 1))
+ (( total + count == 1000 )) ||
+ error "ls list $total files, $count files on MDT1"
}
-run_test 33h "temp file is located on the same MDT as target"
+run_test 33i "striped directory can be accessed when one MDT is down"
TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
test_34a() {
cancel_lru_locks osc
# exceed atime_diff and access file
- sleep 6
+ sleep 10
dd if=$DIR/$tfile of=/dev/null bs=4k count=1 ||
error "can't udpate atime"
}
run_test 51b "exceed 64k subdirectory nlink limit on create, verify unlink"
-test_51d() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run"
- [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
- local qos_old
-
- test_mkdir $DIR/$tdir
- $LFS setstripe -c $OSTCOUNT $DIR/$tdir
-
- qos_old=$(do_facet mds1 \
- "$LCTL get_param -n lod.$FSNAME-*.qos_threshold_rr" | head -n 1)
- do_nodes $(comma_list $(mdts_nodes)) \
- "$LCTL set_param lod.$FSNAME-*.qos_threshold_rr=100"
- stack_trap "do_nodes $(comma_list $(mdts_nodes)) \
- '$LCTL set_param lod.$FSNAME-*.qos_threshold_rr=${qos_old%%%}'"
+test_51d_sub() {
+ local stripecount=$1
+ local nfiles=$((200 * $OSTCOUNT))
- createmany -o $DIR/$tdir/t- 1000
+ log "create files with stripecount=$stripecount"
+ $LFS setstripe -C $stripecount $DIR/$tdir
+ createmany -o $DIR/$tdir/t- $nfiles
$LFS getstripe $DIR/$tdir > $TMP/$tfile
for ((n = 0; n < $OSTCOUNT; n++)); do
objs[$n]=$(awk -vobjs=0 '($1 == '$n') { objs += 1 } \
END { printf("%0.0f", objs) }')
log "OST$n has ${objs[$n]} objects, ${objs0[$n]} are index 0"
done
- unlinkmany $DIR/$tdir/t- 1000
-
- nlast=0
- for ((n = 0; n < $OSTCOUNT; n++)); do
+ unlinkmany $DIR/$tdir/t- $nfiles
+ rm -f $TMP/$tfile
+
+ local nlast
+ local min=4
+ local max=6 # allow variance of (1 - $min/$max) = 33% by default
+
+ # For some combinations of stripecount and OSTCOUNT current code
+ # is not ideal, and allocates 50% fewer *first* objects to some OSTs
+ # than others. Rather than skipping this test entirely, check that
+ # and keep testing to ensure imbalance does not get worse. LU-15282
+ (( (OSTCOUNT == 6 && stripecount == 4) ||
+ (OSTCOUNT == 10 && (stripecount == 4 || stripecount == 8)) ||
+ (OSTCOUNT == 12 && (stripecount == 8 || stripecount == 9)))) && max=9
+ for ((nlast=0, n = 1; n < $OSTCOUNT; nlast=n,n++)); do
(( ${objs[$n]} > ${objs[$nlast]} * 4 / 5 )) ||
{ $LFS df && $LFS df -i &&
- error "OST $n has fewer objects vs. OST $nlast" \
- " (${objs[$n]} < ${objs[$nlast]}"; }
+ error "OST $n has fewer objects vs. OST $nlast " \
+ "(${objs[$n]} < ${objs[$nlast]} x 4/5)"; }
(( ${objs[$n]} < ${objs[$nlast]} * 5 / 4 )) ||
{ $LFS df && $LFS df -i &&
- error "OST $n has fewer objects vs. OST $nlast" \
- " (${objs[$n]} < ${objs[$nlast]}"; }
+ error "OST $n has fewer objects vs. OST $nlast " \
+ "(${objs[$n]} > ${objs[$nlast]} x 5/4)"; }
- (( ${objs0[$n]} > ${objs0[$nlast]} * 4 / 5 )) ||
+ (( ${objs0[$n]} > ${objs0[$nlast]} * $min / $max )) ||
{ $LFS df && $LFS df -i &&
- error "OST $n has fewer #0 objects vs. OST $nlast" \
- " (${objs0[$n]} < ${objs0[$nlast]}"; }
- (( ${objs0[$n]} < ${objs0[$nlast]} * 5 / 4 )) ||
+ error "OST $n has fewer #0 objects vs. OST $nlast " \
+ "(${objs0[$n]} < ${objs0[$nlast]} x $min/$max)"; }
+ (( ${objs0[$n]} < ${objs0[$nlast]} * $max / $min )) ||
{ $LFS df && $LFS df -i &&
- error "OST $n has fewer #0 objects vs. OST $nlast" \
- " (${objs0[$n]} < ${objs0[$nlast]}"; }
- nlast=$n
+ error "OST $n has fewer #0 objects vs. OST $nlast " \
+ "(${objs0[$n]} > ${objs0[$nlast]} x $max/$min)"; }
+ done
+}
+
+test_51d() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+ [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs"
+
+ local stripecount
+ local qos_old=$(do_facet mds1 \
+ "$LCTL get_param -n lod.$FSNAME-*.qos_threshold_rr" | head -n 1)
+
+ do_nodes $(comma_list $(mdts_nodes)) \
+ "$LCTL set_param lod.$FSNAME-*.qos_threshold_rr=100"
+ stack_trap "do_nodes $(comma_list $(mdts_nodes)) \
+ '$LCTL set_param lod.$FSNAME-*.qos_threshold_rr=${qos_old%%%}'"
+
+ test_mkdir $DIR/$tdir
+
+ for ((stripecount = 3; stripecount <= $OSTCOUNT; stripecount++)); do
+ test_51d_sub $stripecount
done
}
run_test 51d "check object distribution"
run_test 54c "block device works in lustre ====================="
test_54d() {
- f="$DIR/f54d"
- string="aaaaaa"
- mknod $f p
- [ "$string" = $(echo $string > $f | cat $f) ] || error "$f != $string"
+ local pipe="$DIR/$tfile.pipe"
+ local string="aaaaaa"
+
+ mknod $pipe p
+ echo -n "$string" > $pipe &
+ local result=$(cat $pipe)
+ [[ "$result" == "$string" ]] || error "$result != $string"
}
run_test 54d "fifo device works in lustre ======================"
}
run_test 56da "test lfs find with long paths"
+test_56ea() { #LU-10378
+ local path=$DIR/$tdir
+ local pool=$TESTNAME
+
+ # Create ost pool
+ pool_add $pool || error "pool_add $pool failed"
+ pool_add_targets $pool 0 $((OSTCOUNT - 1)) 1 ||
+ error "adding targets to $pool failed"
+
+ # Set default pool on directory before creating file
+ mkdir $path || error "mkdir $path failed"
+ $LFS setstripe -p $pool $path ||
+ error "set OST pool on $pool failed"
+ touch $path/$tfile || error "touch $path/$tfile failed"
+
+ # Compare basic file attributes from -printf and stat
+ local attr_printf=$($LFS find $path/$tfile -printf "%A@ %T@ %C@ %U %G")
+ local attr_stat=$(stat -c "%X %Y %Z %u %g" $path/$tfile)
+
+ [[ "${attr_printf}" == "${attr_stat}" ]] ||
+ error "Attrs from lfs find and stat don't match"
+
+ # Compare Lustre attributes from lfs find and lfs getstripe
+ local lattr_printf=$($LFS find $path/$tfile -printf "%Lc %LS %Li %Lp")
+ local str_cnt=$($LFS getstripe --stripe-count $path/$tfile)
+ local str_size=$($LFS getstripe --stripe-size $path/$tfile)
+ local str_idx=$($LFS getstripe --stripe-index $path/$tfile)
+ local fpool=$($LFS getstripe --pool $path/$tfile)
+ local lattr_getstr="${str_cnt} ${str_size} ${str_idx} ${fpool}"
+
+ [[ "${lattr_printf}" == "${lattr_getstr}" ]] ||
+ error "Attrs from lfs find and lfs getstripe don't match"
+
+ # Verify behavior for unknown escape/format sequences
+ local esc_printf=$($LFS find $path/$tfile -printf '\\ %% \Q %Q')
+
+ [[ "${esc_printf}" == '\ % \Q %Q' ]] ||
+ error "Escape/format codes don't match"
+}
+run_test 56ea "test lfs find -printf option"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
# note test will not do anything if MDS is not local
awk '/^status/ { print \\\$2 }'" "completed"
done
- ls -R $DIR/$tdir || error "ls failed"
+ ls -R $DIR/$tdir
rm -rf $DIR/$tdir || error "rmdir failed"
}
run_test 60g "transaction abort won't cause MDT hung"
test_64b () {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
- sh oos.sh $MOUNT || error "oos.sh failed: $?"
+ bash oos.sh $MOUNT || error "oos.sh failed: $?"
}
run_test 64b "check out-of-space detection on client"
run_test 64f "check grant consumption (with grant allocation)"
test_64g() {
- #[ $MDS1_VERSION -lt $(version_code 2.14.54) ] &&
- # skip "Need MDS version at least 2.14.54"
+ (( $MDS1_VERSION >= $(version_code 2.14.56) )) ||
+ skip "Need MDS version at least 2.14.56"
local mdts=$(comma_list $(mdts_nodes))
run_test 64g "grant shrink on MDT"
test_64h() {
+ (( $OST1_VERSION >= $(version_code 2.14.56) )) ||
+ skip "need OST at least 2.14.56 to avoid grant shrink on read"
+
local instance=$($LFS getname -i $DIR)
local osc_tgt="$FSNAME-OST0000-osc-$instance"
local num_exps=$(do_facet ost1 \
run_test 64h "grant shrink on read"
test_64i() {
- (( $OST1_VERSION >= $(version_code 2.14.55) )) ||
- skip "need OST at least 2.14.55 to avoid grant shrink on replay"
+ (( $OST1_VERSION >= $(version_code 2.14.56) )) ||
+ skip "need OST at least 2.14.56 to avoid grant shrink on replay"
[ $PARALLEL == "yes" ] && skip "skip parallel run"
remote_ost_nodsh && skip "remote OSTs with nodsh"
mkdir $MOUNT/$tdir-6 || error "mkdir $tdir-6 failed"
local lmv_count=$($LFS getdirstripe -c $MOUNT/$tdir-6)
[ $lmv_count -eq 2 ] || error "$tdir-6 stripe count $lmv_count"
+
+ # $dir4 layout includes pool
+ $LFS setstripe -S $((new_def_stripe_size * 2)) $dir4
+ [[ "$pool" = $($LFS getstripe -p -d $dir4) ]] ||
+ error "pool lost on setstripe"
+ $LFS setstripe -E -1 -S $new_def_stripe_size $dir4
+ [[ "$pool" = $($LFS getstripe -p -d $dir4) ]] ||
+ error "pool lost on compound layout setstripe"
}
run_test 65n "don't inherit default layout from root for new subdirectories"
test_71() {
test_mkdir $DIR/$tdir
$LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
- sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
+ bash rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
}
run_test 71 "Running dbench on lustre (don't segment fault) ===="
run_test 77n "Verify read from a hole inside contiguous blocks with T10PI"
test_77o() {
- (( $CLIENT_VERSION >= $(version_code 2.14.54) )) ||
- skip "Need at least version 2.14.54"
+ (( $MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "Need MDS version at least 2.14.55"
+ (( $OST1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "Need OST version at least 2.14.55"
local ofd=obdfilter
local mdt=mdt
}
ra_check_101() {
- local READ_SIZE=$1
- local STRIPE_SIZE=$2
- local FILE_LENGTH=$3
- local RA_INC=1048576
- local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
- local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
- (STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
- DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
+ local read_size=$1
+ local stripe_size=$2
+ local stride_length=$((stripe_size / read_size))
+ local stride_width=$((stride_length * OSTCOUNT))
+ local discard_limit=$(( ((stride_length - 1) * 3 / stride_width) *
+ (stride_width - stride_length) ))
+ local discard=$($LCTL get_param -n llite.*.read_ahead_stats |
get_named_value 'read.but.discarded' | calc_total)
- if [[ $DISCARD -gt $discard_limit ]]; then
+
+ if [[ $discard -gt $discard_limit ]]; then
$LCTL get_param llite.*.read_ahead_stats
- error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
+ error "($discard) discarded pages with size (${read_size})"
else
- echo "Read-ahead success for size ${READ_SIZE}"
+ echo "Read-ahead success for size ${read_size}"
fi
}
local fileacl
local saved_debug=$($LCTL get_param -n debug)
- (( $MDS1_VERSION >= $(version_code 2.14.0) )) ||
- skip "MDS needs to be at least 2.14.0"
+ (( $MDS1_VERSION >= $(version_code 2.14.52) )) ||
+ skip "MDS needs to be at least 2.14.52"
large_xattr_enabled || skip_env "ea_inode feature disabled"
echo "Before recordsize change"
lfs_df=($($LFS df -h | grep "filesystem_summary:"))
- df=($(df -h | grep "/mnt/lustre"$))
+ df=($(df -h | grep "$MOUNT"$))
# For checking.
echo "lfs output : ${lfs_df[*]}"
echo "After recordsize change"
lfs_df_after=($($LFS df -h | grep "filesystem_summary:"))
- df_after=($(df -h | grep "/mnt/lustre"$))
+ df_after=($(df -h | grep "$MOUNT"$))
# For checking.
echo "lfs output : ${lfs_df_after[*]}"
echo "Starting with $OSTIO_pre threads"
local thread_max=$((OSTIO_pre * 2))
local rpc_in_flight=$((thread_max * 2))
+ # this is limited to OSC_MAX_RIF_MAX (256)
+ [ $rpc_in_flight -gt 256 ] && rpc_in_flight=256
+ thread_max=$((rpc_in_flight / 2))
+ [ $thread_max -le $OSTIO_pre ] && skip "Too many ost_io threads" &&
+ return
+
# Number of I/O Process proposed to be started.
local nfiles
local facets=$(get_facets OST)
}
run_test 115 "verify dynamic thread creation===================="
-free_min_max () {
- wait_delete_completed
- AVAIL=($(lctl get_param -n osc.*[oO][sS][cC]-[^M]*.kbytesavail))
- echo "OST kbytes available: ${AVAIL[@]}"
- MAXV=${AVAIL[0]}
- MAXI=0
- MINV=${AVAIL[0]}
- MINI=0
- for ((i = 0; i < ${#AVAIL[@]}; i++)); do
- #echo OST $i: ${AVAIL[i]}kb
- if [[ ${AVAIL[i]} -gt $MAXV ]]; then
- MAXV=${AVAIL[i]}
- MAXI=$i
- fi
- if [[ ${AVAIL[i]} -lt $MINV ]]; then
- MINV=${AVAIL[i]}
- MINI=$i
- fi
- done
- echo "Min free space: OST $MINI: $MINV"
- echo "Max free space: OST $MAXI: $MAXV"
-}
-
test_116a() { # was previously test_116()
[ $PARALLEL == "yes" ] && skip "skip parallel run"
[[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
[ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip"
[ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip"
- trap simple_cleanup_common EXIT
+ stack_trap simple_cleanup_common
# Check if we need to generate uneven OSTs
test_mkdir -p $DIR/$tdir/OST${MINI}
if [ $DIFF2 -gt $threshold ]; then
echo "ok"
else
- echo "failed - QOS mode won't be used"
- simple_cleanup_common
skip "QOS imbalance criteria not met"
fi
fi
[[ $MAXC -gt $MINC ]] ||
error_ignore LU-9 "stripe QOS didn't balance free space"
- simple_cleanup_common
}
run_test 116a "stripe QOS: free space balance ==================="
log "testing UP system. Performance may be lower than expected."
SLOWOK=1
fi
+ running_in_vm && SLOWOK=1
rm -rf $DIR/$tdir
test_mkdir $DIR/$tdir
touch $DIR/$tfile
stack_trap "rm -f $DIR/$tfile; wait_delete_completed"
- check_fallocate $DIR/$tfile || error "fallocate failed"
+ check_fallocate $DIR/$tfile || skip_eopnotsupp "fallocate failed"
}
run_test 150b "Verify fallocate (prealloc) functionality"
$LFS setstripe -E1M $striping -E16M -c3 -Eeof -c 4 $DIR/$tfile ||
error "Create $DIR/$tfile failed"
- fallocate -l $((1048576 * 512)) $DIR/$tfile ||
- error "fallocate failed"
+ fallocate -l $((1048576 * 512)) $DIR/$tfile || error "fallocate failed"
bytes=$(($(stat -c '%b * %B' $DIR/$tfile)))
want=$((512 * 1048576))
error "dd failed for bs 4096 and count 5"
# Call fallocate with punch range which is within the file range
- fallocate -p --offset 4096 -l $length $DIR/$tfile ||
- error "fallocate failed: offset 4096 and length $length"
+ out=$(fallocate -p --offset 4096 -l $length $DIR/$tfile 2>&1) ||
+ skip_eopnotsupp "$out|fallocate: offset 4096 and length $length"
# client must see changes immediately after fallocate
size=$(stat -c '%s' $DIR/$tfile)
blocks=$(stat -c '%b' $DIR/$tfile)
want_blocks_after=40 # 512 sized blocks
# Punch overlaps two blocks and less than blocksize
- fallocate -p --offset 4000 -l 3000 $DIR/$tfile ||
- error "fallocate failed: offset 4000 length 3000"
+ out=$(fallocate -p --offset 4000 -l 3000 $DIR/$tfile 2>&1) ||
+ skip_eopnotsupp "$out|fallocate: offset 4000 length 3000"
size=$(stat -c '%s' $DIR/$tfile)
blocks=$(stat -c '%b' $DIR/$tfile)
# Call fallocate to punch all except 2 blocks. We leave the
# first and the last block
echo "fallocate -p --offset $BS -l $punch_size $DIR/$tfile"
- fallocate -p --offset $BS -l $punch_size $DIR/$tfile ||
- error "fallocate failed: offset $BS length $punch_size"
+ out=$(fallocate -p --offset $BS -l $punch_size $DIR/$tfile 2>&1) ||
+ skip_eopnotsupp "$out|fallocate: offset $BS length $punch_size"
size_after=$(stat -c '%s' $DIR/$tfile)
blocks_after=$(stat -c '%b' $DIR/$tfile)
free_min_max
local cache_size=$(do_facet ost$((MAXI+1)) \
"awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
+
+ # LU-16042: can not get the cache size on Arm64 VM here, fallback to a
+ # pre-set value
+ if [ -z "$cache_size" ]; then
+ cache_size=256
+ fi
local large_file_size=$((cache_size * 2))
echo "OSS cache size: $cache_size KB"
test_160g() {
remote_mds_nodsh && skip "remote MDS with nodsh"
- [[ $MDS1_VERSION -ge $(version_code 2.10.56) ]] ||
- skip "Need MDS version at least 2.10.56"
+ [[ $MDS1_VERSION -ge $(version_code 2.14.55) ]] ||
+ skip "Need MDS version at least 2.14.55"
local mdts=$(comma_list $(mdts_nodes))
- #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
- do_nodes $mdts $LCTL set_param fail_loc=0x1314
-
# Create a user
changelog_register || error "first changelog_register failed"
changelog_register || error "second changelog_register failed"
(( $nbcl > 0 )) || error "no changelogs found"
# reduce the max_idle_indexes value to make sure we exceed it
- for param in "changelog_max_idle_indexes=1" \
+ for param in "changelog_max_idle_indexes=2" \
"changelog_gc=1" \
- "changelog_min_gc_interval=2" \
- "changelog_min_free_cat_entries=3"; do
+ "changelog_min_gc_interval=2"; do
local MDT0=$(facet_svc $SINGLEMDS)
local var="${param%=*}"
local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
error "unable to set mdd.*.$param"
done
- # simulate changelog catalog almost full
- #define OBD_FAIL_CAT_FREE_RECORDS 0x1313
- do_nodes $mdts "$LCTL set_param fail_loc=0x1313 fail_val=3"
-
local start=$SECONDS
for i in $(seq $MDSCOUNT); do
cl_users=(${CL_USERS[mds$i]})
cl_user2[mds$i]="${cl_users[1]}"
[ -n "${cl_user1[mds$i]}" ] ||
- error "mds$i: no user registered"
+ error "mds$i: user1 is not registered"
[ -n "${cl_user2[mds$i]}" ] ||
error "mds$i: only ${cl_user1[mds$i]} is registered"
user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
[ -n "$user_rec1" ] ||
- error "mds$i: User ${cl_user1[mds$i]} not registered"
+ error "mds$i: user1 ${cl_user1[mds$i]} not found"
__changelog_clear mds$i ${cl_user1[mds$i]} +2
user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
[ -n "$user_rec2" ] ||
- error "mds$i: User ${cl_user1[mds$i]} not registered"
- echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \
+ error "mds$i: user1 ${cl_user1[mds$i]} not found (2)"
+ echo "mds$i: verifying user1 ${cl_user1[mds$i]} clear: " \
"$user_rec1 + 2 == $user_rec2"
[ $((user_rec1 + 2)) == $user_rec2 ] ||
- error "mds$i: user ${cl_user1[mds$i]} index expected " \
- "$user_rec1 + 2, but is $user_rec2"
+ error "mds$i: user1 ${cl_user1[mds$i]} index " \
+ "expected $user_rec1 + 2, but is $user_rec2"
user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]})
[ -n "$user_rec2" ] ||
- error "mds$i: User ${cl_user2[mds$i]} not registered"
+ error "mds$i: user2 ${cl_user2[mds$i]} not found"
[ $user_rec1 == $user_rec2 ] ||
- error "mds$i: user ${cl_user2[mds$i]} index expected " \
- "$user_rec1, but is $user_rec2"
+ error "mds$i: user2 ${cl_user2[mds$i]} index " \
+ "expected $user_rec1, but is $user_rec2"
done
# ensure we are past the previous changelog_min_gc_interval set above
local sleep2=$((start + 2 - SECONDS))
(( sleep2 > 0 )) && echo "sleep $sleep2 for interval" && sleep $sleep2
-
# Generate one more changelog to trigger GC at fail_loc for cl_user2.
# cl_user1 should be OK because it recently processed records.
for ((i = 0; i < MDSCOUNT; i++)); do
- $LFS mkdir -i $i $DIR/$tdir/d$i.3 $DIR/$tdir/d$i.4 ||
+ $LFS mkdir -i $i $DIR/$tdir/d$i.3 ||
error "create $DIR/$tdir/d$i.3 failed"
done
for (( i = 1; i <= MDSCOUNT; i++ )); do
# check cl_user1 still registered
changelog_users mds$i | grep -q "${cl_user1[mds$i]}" ||
- error "mds$i: User ${cl_user1[mds$i]} not registered"
+ error "mds$i: user1 ${cl_user1[mds$i]} not found (3)"
# check cl_user2 unregistered
changelog_users mds$i | grep -q "${cl_user2[mds$i]}" &&
- error "mds$i: User ${cl_user2[mds$i]} still registered"
+ error "mds$i: user2 ${cl_user2[mds$i]} is registered"
# check changelogs are present and starting at $user_rec1 + 1
user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]})
[ -n "$user_rec1" ] ||
- error "mds$i: User ${cl_user1[mds$i]} not registered"
+ error "mds$i: user1 ${cl_user1[mds$i]} not found (4)"
first_rec=$($LFS changelog $(facet_svc mds$i) |
awk '{ print $1; exit; }')
error "mds$i: rec $first_rec != $user_rec1 + 1"
done
}
-run_test 160g "changelog garbage collect (old users)"
+run_test 160g "changelog garbage collect on idle records"
test_160h() {
remote_mds_nodsh && skip "remote MDS with nodsh" && return
# remove changelog_users and check that orphan entries are removed
stop mds1
- do_facet mds1 "$DEBUGFS -w -R 'rm changelog_users' $(mdsdevname 1)"
- start mds1 || error "cannot start mdt"
+ local dev=$(mdsdevname 1)
+ do_facet mds1 "$DEBUGFS -w -R 'rm changelog_users' $dev"
+ start mds1 $dev $MDS_MOUNT_OPTS || error "cannot start mds1"
entry_count=$(changelog_dump | wc -l)
((entry_count == 0)) ||
error "found $entry_count changelog entries, expected none"
}
run_test 160q "changelog effective mask is DEFMASK if not set"
-test_161a() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run"
+test_160s() {
+ remote_mds_nodsh && skip "remote MDS with nodsh"
+ (( $MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "Need MDS version at least 2.14.55"
- test_mkdir -c1 $DIR/$tdir
- cp /etc/hosts $DIR/$tdir/$tfile
- test_mkdir -c1 $DIR/$tdir/foo1
- test_mkdir -c1 $DIR/$tdir/foo2
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
- ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
- local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
- if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
- $LFS fid2path $DIR $FID
- error "bad link ea"
- fi
- # middle
- rm $DIR/$tdir/foo2/zachary
- # last
- rm $DIR/$tdir/foo2/thor
- # first
- rm $DIR/$tdir/$tfile
- # rename
- mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
- [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
- { $LFS fid2path $DIR $FID; error "bad link rename"; }
- rm $DIR/$tdir/foo2/maggie
+ local mdts=$(comma_list $(mdts_nodes))
- # overflow the EA
- local longname=$tfile.avg_len_is_thirty_two_
- stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
- error_noexit 'failed to unlink many hardlinks'" EXIT
- createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
- error "failed to hardlink many files"
- links=$($LFS fid2path $DIR $FID | wc -l)
- echo -n "${links}/1000 links in link EA"
- [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
-}
-run_test 161a "link ea sanity"
+ #define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
+ do_nodes $mdts $LCTL set_param fail_loc=0x1314 \
+ fail_val=$((24 * 3600 * 10))
-test_161b() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run"
- [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
+ # Create a user which is 10 days old
+ changelog_register || error "first changelog_register failed"
+ local cl_users
+ declare -A cl_user1
+ local i
+
+ # generate some changelog records to accumulate on each MDT
+ # use all_char because created files should be evenly distributed
+ test_mkdir -c $MDSCOUNT -H all_char $DIR/$tdir ||
+ error "test_mkdir $tdir failed"
+ for ((i = 0; i < MDSCOUNT; i++)); do
+ $LFS mkdir -i $i $DIR/$tdir/d$i.1 $DIR/$tdir/d$i.2 ||
+ error "create $DIR/$tdir/d$i.1 failed"
+ done
+
+ # check changelogs have been generated
+ local nbcl=$(changelog_dump | wc -l)
+ (( nbcl > 0 )) || error "no changelogs found"
+
+ # reduce the max_idle_indexes value to make sure we exceed it
+ for param in "changelog_max_idle_indexes=2097446912" \
+ "changelog_max_idle_time=2592000" \
+ "changelog_gc=1" \
+ "changelog_min_gc_interval=2"; do
+ local MDT0=$(facet_svc $SINGLEMDS)
+ local var="${param%=*}"
+ local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var")
+
+ stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT
+ do_nodes $mdts $LCTL set_param mdd.*.$param ||
+ error "unable to set mdd.*.$param"
+ done
+
+ local start=$SECONDS
+ for i in $(seq $MDSCOUNT); do
+ cl_users=(${CL_USERS[mds$i]})
+ cl_user1[mds$i]="${cl_users[0]}"
+
+ [[ -n "${cl_user1[mds$i]}" ]] ||
+ error "mds$i: no user registered"
+ done
+
+ #define OBD_FAIL_MDS_CHANGELOG_IDX_PUMP 0x16d
+ do_nodes $mdts $LCTL set_param fail_loc=0x16d fail_val=500000000
+
+ # ensure we are past the previous changelog_min_gc_interval set above
+ local sleep2=$((start + 2 - SECONDS))
+ (( sleep2 > 0 )) && echo "sleep $sleep2 for interval" && sleep $sleep2
+
+ # Generate one more changelog to trigger GC
+ for ((i = 0; i < MDSCOUNT; i++)); do
+ $LFS mkdir -i $i $DIR/$tdir/d$i.3 $DIR/$tdir/d$i.4 ||
+ error "create $DIR/$tdir/d$i.3 failed"
+ done
+
+ # ensure gc thread is done
+ for node in $(mdts_nodes); do
+ wait_update $node "pgrep chlg_gc_thread" "" 20 ||
+ error "$node: GC-thread not done"
+ done
+
+ do_nodes $mdts $LCTL set_param fail_loc=0
+
+ for (( i = 1; i <= MDSCOUNT; i++ )); do
+ # check cl_user1 is purged
+ changelog_users mds$i | grep -q "${cl_user1[mds$i]}" &&
+ error "mds$i: User ${cl_user1[mds$i]} is registered"
+ done
+ return 0
+}
+run_test 160s "changelog garbage collect on idle records * time"
+
+test_161a() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+
+ test_mkdir -c1 $DIR/$tdir
+ cp /etc/hosts $DIR/$tdir/$tfile
+ test_mkdir -c1 $DIR/$tdir/foo1
+ test_mkdir -c1 $DIR/$tdir/foo2
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
+ ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
+ local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]')
+ if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
+ $LFS fid2path $DIR $FID
+ error "bad link ea"
+ fi
+ # middle
+ rm $DIR/$tdir/foo2/zachary
+ # last
+ rm $DIR/$tdir/foo2/thor
+ # first
+ rm $DIR/$tdir/$tfile
+ # rename
+ mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
+ [ "$($LFS fid2path $FSNAME --link 1 $FID)" != "$tdir/foo2/maggie" ] &&
+ { $LFS fid2path $DIR $FID; error "bad link rename"; }
+ rm $DIR/$tdir/foo2/maggie
+
+ # overflow the EA
+ local longname=$tfile.avg_len_is_thirty_two_
+ stack_trap "unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
+ error_noexit 'failed to unlink many hardlinks'" EXIT
+ createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 ||
+ error "failed to hardlink many files"
+ links=$($LFS fid2path $DIR $FID | wc -l)
+ echo -n "${links}/1000 links in link EA"
+ [[ $links -gt 60 ]] || error "expected at least 60 links in link EA"
+}
+run_test 161a "link ea sanity"
+
+test_161b() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+ [ $MDSCOUNT -lt 2 ] && skip_env "skipping remote directory test"
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
}
run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
+test_172() {
+
+ #define OBD_FAIL_OBD_CLEANUP 0x60e
+ $LCTL set_param fail_loc=0x60e
+ umount $MOUNT || error "umount $MOUNT failed"
+ stack_trap "mount_client $MOUNT"
+
+ (( $($LCTL dl | egrep -c " osc | lov | lmv | mdc ") > 0 )) ||
+ error "no client OBDs are remained"
+
+ $LCTL dl | while read devno state type name foo; do
+ case $type in
+ lov|osc|lmv|mdc)
+ $LCTL --device $name cleanup
+ $LCTL --device $name detach
+ ;;
+ *)
+ # skip server devices
+ ;;
+ esac
+ done
+
+ if (( $($LCTL dl | egrep -c " osc | lov | lmv | mdc ") > 0 )); then
+ $LCTL dl | egrep " osc | lov | lmv | mdc "
+ error "some client OBDs are still remained"
+ fi
+
+}
+run_test 172 "manual device removal with lctl cleanup/detach ======"
+
# it would be good to share it with obdfilter-survey/iokit-libecho code
setup_obdecho_osc () {
local rc=0
}
test_180a() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run"
-
- if ! [ -d /sys/fs/lustre/echo_client ] &&
- ! module_loaded obdecho; then
- load_module obdecho/obdecho &&
- stack_trap "rmmod obdecho" EXIT ||
- error "unable to load obdecho on client"
- fi
-
- local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
- local host=$($LCTL get_param -n osc.$osc.import |
- awk '/current_connection:/ { print $2 }' )
- local target=$($LCTL get_param -n osc.$osc.import |
- awk '/target:/ { print $2 }' )
- target=${target%_UUID}
-
- if [ -n "$target" ]; then
- setup_obdecho_osc $host $target &&
- stack_trap "cleanup_obdecho_osc $target" EXIT ||
- { error "obdecho setup failed with $?"; return; }
-
- obdecho_test ${target}_osc client ||
- error "obdecho_test failed on ${target}_osc"
- else
- $LCTL get_param osc.$osc.import
- error "there is no osc.$osc.import target"
- fi
+ skip "obdecho on osc is no longer supported"
}
run_test 180a "test obdecho on osc"
}
run_test 181 "Test open-unlinked dir ========================"
-test_182() {
+test_182a() {
local fcount=1000
local tcount=10
rm -rf $DIR/$tdir
}
-run_test 182 "Test parallel modify metadata operations ================"
+run_test 182a "Test parallel modify metadata operations from mdc"
+
+test_182b() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local dcount=1000
+ local tcount=10
+ local stime
+ local etime
+ local delta
+
+ do_facet mds1 $LCTL list_param \
+ osp.$FSNAME-MDT*-osp-MDT*.rpc_stats ||
+ skip "MDS lacks parallel RPC handling"
+
+ $LFS mkdir -i 0 $DIR/$tdir || error "creating dir $DIR/$tdir"
+
+ rpc_count=$(do_facet mds1 $LCTL get_param -n \
+ osp.$FSNAME-MDT0001-osp-MDT0000.max_mod_rpcs_in_flight)
+
+ stime=$(date +%s)
+ createmany -i 0 -d $DIR/$tdir/t- $tcount
+
+ for (( i = 0; i < $tcount; i++ )) ; do
+ createmany -i 0 -d $DIR/$tdir/t-$i/d- 0 $dcount &
+ done
+ wait
+ etime=$(date +%s)
+ delta=$((etime - stime))
+ echo "Time for file creation $delta sec for $rpc_count parallel RPCs"
+
+ stime=$(date +%s)
+ for (( i = 0; i < $tcount; i++ )) ; do
+ unlinkmany -d $DIR/$tdir/$i/d- $dcount &
+ done
+ wait
+ etime=$(date +%s)
+ delta=$((etime - stime))
+ echo "Time for file removal $delta sec for $rpc_count parallel RPCs"
+
+ rm -rf $DIR/$tdir
+
+ $LFS mkdir -i 0 $DIR/$tdir || error "creating dir $DIR/$tdir"
+
+ do_facet mds1 $LCTL set_param osp.$FSNAME-MDT0001-osp-MDT0000.max_mod_rpcs_in_flight=1
+
+ stime=$(date +%s)
+ createmany -i 0 -d $DIR/$tdir/t- $tcount
+
+ for (( i = 0; i < $tcount; i++ )) ; do
+ createmany -i 0 -d $DIR/$tdir/t-$i/d- 0 $dcount &
+ done
+ wait
+ etime=$(date +%s)
+ delta=$((etime - stime))
+ echo "Time for file creation $delta sec for 1 RPC sent at a time"
+
+ stime=$(date +%s)
+ for (( i = 0; i < $tcount; i++ )) ; do
+ unlinkmany -d $DIR/$tdir/t-$i/d- $dcount &
+ done
+ wait
+ etime=$(date +%s)
+ delta=$((etime - stime))
+ echo "Time for file removal $delta sec for 1 RPC sent at a time"
+
+ do_facet mds1 $LCTL set_param osp.$FSNAME-MDT0001-osp-MDT0000.max_mod_rpcs_in_flight=$rpc_count
+}
+run_test 182b "Test parallel modify metadata operations from osp"
test_183() { # LU-2275
[ $PARALLEL == "yes" ] && skip "skip parallel run"
$LFS swap_layouts $file1 $file2 || error "swap of file layout failed"
gen=$($LFS getstripe -g $file1)
[[ $gen1 != $gen ]] ||
- "Layout generation on $file1 does not change"
+ error "Layout generation on $file1 does not change"
gen=$($LFS getstripe -g $file2)
[[ $gen2 != $gen ]] ||
- "Layout generation on $file2 does not change"
+ error "Layout generation on $file2 does not change"
cmp $ref1 $file2 || error "content compare failed ($ref1 != $file2)"
cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
local stats="*.$(convert_facet2label $facet).job_stats"
# strip out libtool wrappers for in-tree executables
- if [ $(do_facet $facet lctl get_param $stats |
- sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
+ if (( $(do_facet $facet lctl get_param $stats |
+ sed -e 's/\.lt-/./' | grep -cw $JOBVAL) != 1 )); then
do_facet $facet lctl get_param $stats
error "No jobstats for $JOBVAL found on $facet::$stats"
fi
(( $MDS1_VERSION >= $(version_code 2.13.54.91) )) ||
skip "Need MDS version at least 2.13.54.91"
- job_stats="mdt.*.job_stats"
- $LCTL set_param $job_stats=clear
+ local job_stats="mdt.*.job_stats"
+ local old_jobid=$(do_facet mds1 $LCTL get_param jobid_var)
+
+ do_facet mds1 $LCTL set_param $job_stats=clear
+
# Setting jobid_var to USER might not be supported
+ [[ -n "$old_jobid" ]] && stack_trap "$LCTL set_param $old_jobid"
$LCTL set_param jobid_var=USER || true
- $LCTL set_param jobid_name="%e.%u"
+ stack_trap "$LCTL set_param $($LCTL get_param jobid_name)"
+ $LCTL set_param jobid_name="%j.%e.%u"
+
env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
- do_facet $SINGLEMDS $LCTL get_param $job_stats |
- grep "job_id:.*foolish" &&
- error "Unexpected jobid found"
- do_facet $SINGLEMDS $LCTL get_param $job_stats |
- grep "open:.*min.*max.*sum" ||
- error "wrong job_stats format found"
+ do_facet mds1 $LCTL get_param $job_stats | grep "job_id:.*foolish" &&
+ { do_facet mds1 $LCTL get_param $job_stats;
+ error "Unexpected jobid found"; }
+ do_facet mds1 $LCTL get_param $job_stats | grep "open:.*min.*max.*sum"||
+ { do_facet mds1 $LCTL get_param $job_stats;
+ error "wrong job_stats format found"; }
+
+ (( $MDS1_VERSION <= $(version_code 2.15.0) )) &&
+ echo "MDS does not yet escape jobid" && return 0
+ $LCTL set_param jobid_var=TEST205b
+ env -i TEST205b="has sp" touch $DIR/$tfile.2
+ do_facet mds1 $LCTL get_param $job_stats | grep "has.*x20sp" ||
+ { do_facet mds1 $LCTL get_param $job_stats;
+ error "jobid not escaped"; }
}
run_test 205b "Verify job stats jobid and output format"
echo "==== test 2: verify lease can be broken by upcoming open"
$MULTIOP $DIR/$tfile oO_RDWR:eR_E-eUc &
local PID=$!
- sleep 1
+ sleep 2
$MULTIOP $DIR/$tfile oO_RDWR:c
kill -USR1 $PID && wait $PID || error "break lease error"
echo "==== test 3: verify lease can't be granted if an open already exists"
$MULTIOP $DIR/$tfile oO_RDWR:_c &
local PID=$!
- sleep 1
+ sleep 2
$MULTIOP $DIR/$tfile oO_RDWR:eReUc && error "apply lease should fail"
kill -USR1 $PID && wait $PID || error "open file error"
echo "==== test 4: lease can sustain over recovery"
$MULTIOP $DIR/$tfile oO_RDWR:eR_E+eUc &
PID=$!
- sleep 1
+ sleep 2
fail mds1
echo "==== test 5: lease broken can't be regained by replay"
$MULTIOP $DIR/$tfile oO_RDWR:eR_E-eUc &
PID=$!
- sleep 1
+ sleep 2
# open file to break lease and then recovery
$MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
# stop the MDT
stop $SINGLEMDS || error "Fail to stop MDT."
# remount the MDT
- start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
+ start $SINGLEMDS $(facet_device $SINGLEMDS) $MDS_MOUNT_OPTS ||
+ error "Fail to start MDT."
df $MOUNT || error "Fail to df."
# Create new files, idle OI blocks should be reused.
run_test 230r "migrate with too many local locks"
test_230s() {
- [ $MDS1_VERSION -ge $(version_code 2.13.57) ] ||
- skip "Need MDS version at least 2.13.57"
+ (( $MDS1_VERSION >= $(version_code 2.14.52) )) ||
+ skip "Need MDS version at least 2.14.52"
local mdts=$(comma_list $(mdts_nodes))
local restripe_status=$(do_facet mds1 $LCTL get_param -n \
do_nodes $mdts "$LCTL set_param mdt.*.enable_dir_restripe=$st"
test_mkdir $DIR/$tdir
$LFS mkdir $DIR/$tdir |& grep "File exists" ||
- error "$LFS mkdir doesn't return -EEXIST if target exists"
+ error "$LFS mkdir should return EEXIST if target exists"
rmdir $DIR/$tdir
done
}
}
run_test 230v "subdir migrated to the MDT where its parent is located"
+test_230w() {
+ (( MDSCOUNT > 1 )) || skip "needs >= 2 MDTs"
+ (( MDS1_VERSION >= $(version_code 2.15.0) )) ||
+ skip "Need MDS version at least 2.15.0"
+
+ mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+ createmany -o $DIR/$tdir/f 10 || error "create files failed"
+ createmany -d $DIR/$tdir/d 10 || error "create dirs failed"
+
+ $LFS migrate -m 1 -c $MDSCOUNT -d $DIR/$tdir ||
+ error "migrate failed"
+
+ (( $($LFS getdirstripe -c $DIR/$tdir) == MDSCOUNT )) ||
+ error "$tdir stripe count mismatch"
+
+ for i in $(seq 0 9); do
+ (( $($LFS getdirstripe -c $DIR/$tdir/d$i) == 0 )) ||
+ error "d$i is striped"
+ done
+}
+run_test 230w "non-recursive mode dir migration"
+
test_231a()
{
# For simplicity this test assumes that max_pages_per_rpc
}
run_test 244b "multi-threaded write with group lock"
-test_245() {
+test_245a() {
local flagname="multi_mod_rpcs"
local connect_data_name="max_mod_rpcs"
local out
echo "$out" | grep -qw $connect_data_name ||
error "import should have connect data $connect_data_name"
}
-run_test 245 "check mdc connection flag/data: multiple modify RPCs"
+run_test 245a "check mdc connection flag/data: multiple modify RPCs"
+
+test_245b() {
+ local flagname="multi_mod_rpcs"
+ local connect_data_name="max_mod_rpcs"
+ local out
+
+ remote_mds_nodsh && skip "remote MDS with nodsh"
+ [[ $MDSCOUNT -ge 2 ]] || skip "needs >= 2 MDTs"
+
+ # check if multiple modify RPCs flag is set
+ out=$(do_facet mds1 \
+ $LCTL get_param osp.$FSNAME-MDT0001-osp-MDT0000.import |
+ grep "connect_flags:")
+ echo "$out"
+
+ [[ "$out" =~ $flagname ]] || skip "connect flag $flagname is not set"
+
+ # check if multiple modify RPCs data is set
+ out=$(do_facet mds1 \
+ $LCTL get_param osp.$FSNAME-MDT0001-osp-MDT0000.import)
+
+ [[ "$out" =~ $connect_data_name ]] ||
+ {
+ echo "$out"
+ error "missing connect data $connect_data_name"
+ }
+}
+run_test 245b "check osp connection flag/data: multiple modify RPCs"
cleanup_247() {
local submount=$1
for rootpath in "$submount" "$submount///" "$submount/dir1"; do
echo "$rootpath $fid"
found=$($LFS fid2path $rootpath "$fid")
- [ -n "found" ] || error "fid2path should succeed"
+ [ -n "$found" ] || error "fid2path should succeed"
[ "$found" == "$td" ] || error "fid2path $found != $td"
done
# check wrong root path format
"$average_ladvise = +$speedup_ladvise%"
local lowest_speedup=20
- if [ ${average_cache%.*} -lt $lowest_speedup ]; then
- echo "Speedup with OSS cached read less than $lowest_speedup%," \
- "got $average_cache%. Skipping ladvise willread check."
+ if (( ${average_cache%.*} < $lowest_speedup )); then
+ echo "Speedup with OSS cached read less than $lowest_speedup%,"\
+ " got $average_cache%. Skipping ladvise willread check."
return 0
fi
return 0
lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
- [[ ${average_ladvise%.*} > $lowest_speedup ]] ||
+ (( ${average_ladvise%.*} > ${lowest_speedup%.*} )) ||
error_not_in_vm "Speedup with willread is less than " \
"$lowest_speedup%, got $average_ladvise%"
}
local cat_sl
local mdt_dev
- mdt_dev=$(mdsdevname 1)
+ mdt_dev=$(facet_device $SINGLEMDS)
echo $mdt_dev
changelog_register || error "changelog_register failed"
rm -rf $DIR/$tdir
- mkdir_on_mdt0 $DIR/$tdir
+ mkdir_on_mdt -i$(($(facet_number $SINGLEMDS) - 1)) $DIR/$tdir
changelog_clear 0 || error "changelog_clear failed"
stop $SINGLEMDS || error "Fail to stop MDT"
# remount the MDT
-
- start $SINGLEMDS $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT"
+ start $SINGLEMDS $(facet_device $SINGLEMDS) $MDS_MOUNT_OPTS ||
+ error "Fail to start MDT"
#after mount new plainllog is used
touch $DIR/$tdir/{11..19}
echo "Free space: ${spfree}%, default DOM stripe: ${dom_def}K"
[[ $dom_def != $dom_current ]] ||
error "Default stripe size was not changed"
- if [[ $spfree > 0 ]] ; then
+ if (( spfree > 0 )) ; then
dom_set=$($LFS getstripe -S $dom)
- [[ $dom_set == $((dom_def * 1024)) ]] ||
+ (( dom_set == dom_def * 1024 )) ||
error "DOM component size is still old"
else
[[ $($LFS getstripe -L $dom) != "mdt" ]] ||
mkdir -p $DIR/$tdir
$LFS setstripe -c 2 $dom
- dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct ||
+ 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
+ cancel_lru_locks
$LFS mirror extend -N -E 1M -L mdt -E eof -c2 $dom ||
error "failed mirroring to the DOM layout"
$LFS mirror split --mirror-id 1 -d $dom ||
error "failed mirror split"
- [ $($LFS getstripe -L $dom) != 'mdt' ] ||
- error "MDT stripe was not removed"
+ [[ $($LFS getstripe -L --component-start=0 $dom) == 'mdt' ]] ||
+ error "MDT stripe wasn't set"
- cancel_lru_locks mdc
+ cancel_lru_locks
local new_md5=$(md5sum $dom)
[ "$old_md5" == "$new_md5" ] ||
error "$old_md5 != $new_md5"
mkdir -p $DIR/$tdir
$LFS setstripe -c 2 $dom
- dd if=/dev/urandom of=$dom bs=512K count=1 oflag=direct ||
+ 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
+ cancel_lru_locks
$LFS migrate -E 1M -L mdt -E eof -c2 -v $dom ||
error "failed migrating to the DOM file"
- cancel_lru_locks mdc
+ [[ $($LFS getstripe -L --component-start=0 $dom) == 'mdt' ]] ||
+ error "MDT stripe wasn't set"
+
+ cancel_lru_locks
local new_md5=$(md5sum $dom)
[ "$old_md5" != "$new_md5" ] &&
error "$old_md5 != $new_md5"
run_test 300h "check default striped directory for striped directory"
test_300i() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run"
- [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
- [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
+ [[ $PARALLEL == "yes" ]] && skip "skip parallel run"
+ (( $MDSCOUNT >= 2 )) || skip_env "needs >= 2 MDTs"
+ (( $MDS1_VERSION >= $(version_code 2.7.55) )) ||
skip "Need MDS version at least 2.7.55"
local stripe_count
$LFS find -H fnv_1a_64,crush $DIR/$tdir/hashdir
local dircnt=$($LFS find -H fnv_1a_64,crush $DIR/$tdir/hashdir | wc -l)
- [ $dircnt -eq 2 ] || error "lfs find striped dir got:$dircnt,except:1"
-
- #set the stripe to be unknown hash type
- #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
- $LCTL set_param fail_loc=0x1901
+ (( $dircnt == 2 )) || error "lfs find striped dir got $dircnt != 2"
+
+ if (( $MDS1_VERSION > $(version_code 2.15.0) )); then
+ $LFS mkdir -i0 -c$MDSCOUNT -H crush2 $DIR/$tdir/hashdir/d3 ||
+ error "create crush2 dir $tdir/hashdir/d3 failed"
+ $LFS find -H crush2 $DIR/$tdir/hashdir
+ dircnt=$($LFS find -H crush2 $DIR/$tdir/hashdir | wc -l)
+ (( $dircnt == 1 )) || error "find crush2 dir got $dircnt != 1"
+
+ # mkdir with an invalid hash type (hash=fail_val) from client
+ # should be replaced on MDS with a valid (default) hash type
+ #define OBD_FAIL_LMV_UNKNOWN_STRIPE 0x1901
+ $LCTL set_param fail_loc=0x1901 fail_val=99
+ $LFS mkdir -c2 $DIR/$tdir/hashdir/d99
+
+ local hash=$($LFS getdirstripe -H $DIR/$tdir/hashdir/d99)
+ local expect=$(do_facet mds1 \
+ $LCTL get_param -n lod.$FSNAME-MDT0000-mdtlov.mdt_hash)
+ [[ $hash == $expect ]] ||
+ error "d99 hash '$hash' != expected hash '$expect'"
+ fi
+
+ #set the stripe to be unknown hash type on read
+ #define OBD_FAIL_LMV_UNKNOWN_STRIPE 0x1901
+ $LCTL set_param fail_loc=0x1901 fail_val=99
for ((i = 0; i < 10; i++)); do
$CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
error "stat f-$i failed"
}
run_test 300s "test lfs mkdir -c without -i"
+test_300t() {
+ (( $MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "need MDS 2.14.55 or later"
+ (( $MDSCOUNT >= 2 )) || skip "needs at least 2 MDTs"
+
+ local testdir="$DIR/$tdir/striped_dir"
+ local dir1=$testdir/dir1
+ local dir2=$testdir/dir2
+
+ mkdir -p $testdir
+
+ $LFS setdirstripe -D -c -1 --max-inherit=3 $testdir ||
+ error "failed to set default stripe count for $testdir"
+
+ mkdir $dir1
+ local stripe_count=$($LFS getdirstripe -c $dir1)
+
+ (( $stripe_count == $MDSCOUNT )) || error "wrong stripe count"
+
+ local max_count=$((MDSCOUNT - 1))
+ local mdts=$(comma_list $(mdts_nodes))
+
+ do_nodes $mdts $LCTL set_param lod.*.max_mdt_stripecount=$max_count
+ stack_trap "do_nodes $mdts $LCTL set_param lod.*.max_mdt_stripecount=0"
+
+ mkdir $dir2
+ stripe_count=$($LFS getdirstripe -c $dir2)
+
+ (( $stripe_count == $max_count )) || error "wrong stripe count"
+}
+run_test 300t "test max_mdt_stripecount"
prepare_remote_file() {
mkdir $DIR/$tdir/src_dir ||
run_test 315 "read should be accounted"
test_316() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
- large_xattr_enabled || skip_env "ea_inode feature disabled"
+ (( $MDSCOUNT >= 2 )) || skip "needs >= 2 MDTs"
+ large_xattr_enabled || skip "ea_inode feature disabled"
- rm -rf $DIR/$tdir/d
- mkdir -p $DIR/$tdir/d
- chown nobody $DIR/$tdir/d
- touch $DIR/$tdir/d/file
+ mkdir_on_mdt0 $DIR/$tdir || error "mkdir $tdir failed"
+ mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
+ chown nobody $DIR/$tdir/d || error "chown $tdir/d failed"
+ touch $DIR/$tdir/d/$tfile || error "touch $tdir/d/$tfile failed"
- $LFS mv -m1 $DIR/$tdir/d || error "lfs mv failed"
+ $LFS migrate -m1 $DIR/$tdir/d || error "lfs migrate -m1 failed"
}
-run_test 316 "lfs mv"
+run_test 316 "lfs migrate of file with large_xattr enabled"
test_317() {
[ $MDS1_VERSION -lt $(version_code 2.11.53) ] &&
# Truncate to size $trunc_sz bytes. Strip tail blocks and leave only 8
# blocks. The block count must drop to 8.
#
- trunc_sz=$(($(stat --format=%s $DIR/$tfile) - \
+ trunc_sz=$(($(stat --format=%s $DIR/$tfile) -
((bs - grant_blk_size) + 1)))
$TRUNCATE $DIR/$tfile $trunc_sz ||
error "truncate $tfile to $trunc_sz failed"
run_test 318 "Verify async readahead tunables"
test_319() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
+ (( $MDSCOUNT >= 2 )) || skip "needs >= 2 MDTs"
local before=$(date +%s)
local evict
#define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
$LCTL set_param fail_val=5 fail_loc=0x8000032c
- $LFS mv -m1 $file &
+ $LFS migrate -m1 $mdir &
sleep 1
dd if=$file of=/dev/null
$LFS setstripe -c 1 -i 0 $DIR/$tfile
$LCTL set_param ldlm.namespaces.*.lru_size=clear
+ # Disabled: DIO does not push out buffered I/O pages, see LU-12587
# request a new lock on client
- dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
+ #dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
- dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
- local lock_count=$($LCTL get_param -n \
- ldlm.namespaces.$imp_name.lru_size)
- [[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
+ #dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+ #local lock_count=$($LCTL get_param -n \
+ # ldlm.namespaces.$imp_name.lru_size)
+ #[[ $lock_count -eq 0 ]] || error "lock should be cancelled by direct IO"
$LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
- # no lock cached, should use lockless IO and not enqueue new lock
- dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct conv=notrunc
+ # no lock cached, should use lockless DIO and not enqueue new lock
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct \
+ conv=notrunc ||
+ error "dio write failed"
lock_count=$($LCTL get_param -n \
ldlm.namespaces.$imp_name.lru_size)
[[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"
+
+ $LCTL set_param ldlm.namespaces.*-OST0000-osc-ffff*.lru_size=clear
+
+ # no lock cached, should use locked DIO append
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=direct oflag=append \
+ conv=notrunc || error "DIO append failed"
+ lock_count=$($LCTL get_param -n \
+ ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+ [[ $lock_count -ne 0 ]] || error "lock still must be held by DIO append"
}
run_test 398a "direct IO should cancel lock otherwise lockless"
test_398b() { # LU-4198
which fio || skip_env "no fio installed"
- $LFS setstripe -c -1 $DIR/$tfile
+ $LFS setstripe -c -1 -S 1M $DIR/$tfile
- local size=12
+ local size=48
dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size
local njobs=4
- echo "mix direct rw ${size}M to OST0 by fio with $njobs jobs..."
- fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE --direct=1 \
- --numjobs=$njobs --fallocate=none \
- --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
- --filename=$DIR/$tfile &
- bg_pid=$!
-
- echo "mix buffer rw ${size}M to OST0 by fio with $njobs jobs..."
- fio --name=rand-rw --rw=randrw --bs=$PAGE_SIZE \
- --numjobs=$njobs --fallocate=none \
- --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
- --filename=$DIR/$tfile || true
- wait $bg_pid
+ # Single page, multiple pages, stripe size, 4*stripe size
+ for bsize in $(( $PAGE_SIZE )) $(( 4*$PAGE_SIZE )) 1048576 4194304; do
+ echo "mix direct rw ${bsize} by fio with $njobs jobs..."
+ fio --name=rand-rw --rw=randrw --bs=$bsize --direct=1 \
+ --numjobs=$njobs --fallocate=none \
+ --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+ --filename=$DIR/$tfile &
+ bg_pid=$!
+
+ echo "mix buffer rw ${bsize} by fio with $njobs jobs..."
+ fio --name=rand-rw --rw=randrw --bs=$bsize \
+ --numjobs=$njobs --fallocate=none \
+ --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+ --filename=$DIR/$tfile || true
+ wait $bg_pid
+ done
+
+ evict=$(do_facet client $LCTL get_param \
+ osc.$FSNAME-OST*-osc-*/state |
+ awk -F"[ [,]" '/EVICTED ]$/ { if (t<$5) {t=$5;} } END { print t }')
+
+ [ -z "$evict" ] || [[ $evict -le $before ]] ||
+ (do_facet client $LCTL get_param \
+ osc.$FSNAME-OST*-osc-*/state;
+ error "eviction happened: $evict before:$before")
rm -f $DIR/$tfile
}
# Should not LBUG, just be killed by oom-killer
# dd will return 0 even allocation failure in some environment.
# So don't check return value
- sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
+ bash -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null"
cleanup_test411_cgroup $cgdir
return 0
run_test 411 "Slab allocation error with cgroup does not LBUG"
test_412() {
- [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
- if [ $MDS1_VERSION -lt $(version_code 2.10.55) ]; then
+ (( $MDSCOUNT > 1 )) || skip_env "needs >= 2 MDTs"
+ (( $MDS1_VERSION >= $(version_code 2.10.55) )) ||
skip "Need server version at least 2.10.55"
- fi
$LFS mkdir -i $((MDSCOUNT - 1)),$((MDSCOUNT - 2)) $DIR/$tdir ||
error "mkdir failed"
local stripe_count=$($LFS getdirstripe -T $DIR/$tdir)
[ $stripe_count -eq 2 ] ||
error "expect 2 get $stripe_count"
+
+ (( $MDS1_VERSION >= $(version_code 2.14.55) )) || return 0
+
+ local index
+ local index2
+
+ # subdirs should be on the same MDT as parent
+ for i in $(seq 0 $((MDSCOUNT - 1))); do
+ $LFS mkdir -i $i $DIR/$tdir/mdt$i || error "mkdir mdt$i failed"
+ mkdir $DIR/$tdir/mdt$i/sub || error "mkdir sub failed"
+ index=$($LFS getstripe -m $DIR/$tdir/mdt$i/sub)
+ (( index == i )) || error "mdt$i/sub on MDT$index"
+ done
+
+ # stripe offset -1, ditto
+ for i in {1..10}; do
+ $LFS mkdir -i -1 $DIR/$tdir/qos$i || error "mkdir qos$i failed"
+ index=$($LFS getstripe -m $DIR/$tdir/qos$i)
+ mkdir $DIR/$tdir/qos$i/sub || error "mkdir sub failed"
+ index2=$($LFS getstripe -m $DIR/$tdir/qos$i/sub)
+ (( index == index2 )) ||
+ error "qos$i on MDT$index, sub on MDT$index2"
+ done
+
+ local testdir=$DIR/$tdir/inherit
+
+ $LFS mkdir -i 1 --max-inherit=3 $testdir || error "mkdir inherit failed"
+ # inherit 2 levels
+ for i in 1 2; do
+ testdir=$testdir/s$i
+ mkdir $testdir || error "mkdir $testdir failed"
+ index=$($LFS getstripe -m $testdir)
+ (( index == 1 )) ||
+ error "$testdir on MDT$index"
+ done
+
+ # not inherit any more
+ testdir=$testdir/s3
+ mkdir $testdir || error "mkdir $testdir failed"
+ getfattr -d -m dmv $testdir | grep dmv &&
+ error "default LMV set on $testdir" || true
}
run_test 412 "mkdir on specific MDTs"
+TEST413_COUNT=${TEST413_COUNT:-200}
generate_uneven_mdts() {
local threshold=$1
local lmv_qos_maxage
local testdir=$DIR/$tdir-fillmdt
local start
- mkdir -p $testdir
-
i=0
while (( diff < threshold )); do
+ mkdir -p $testdir
# generate uneven MDTs, create till $threshold% diff
echo -n "weight diff=$diff% must be > $threshold% ..."
- echo "Fill MDT$min_index with 1000 files: loop $i"
+ echo "Fill MDT$min_index with $TEST413_COUNT files: loop $i"
testdir=$DIR/$tdir-fillmdt/$i
- [ -d $testdir ] || $LFS mkdir -i $min_index $testdir ||
+ [ -d $testdir ] && continue
+ $LFS mkdir -i $min_index $testdir ||
error "mkdir $testdir failed"
$LFS setstripe -E 1M -L mdt $testdir ||
error "setstripe $testdir failed"
start=$SECONDS
- for F in f.{0..999}; do
- dd if=/dev/zero of=$testdir/$F bs=64K count=1 > \
+ for ((F=0; F < TEST413_COUNT; F++)); do
+ dd if=/dev/zero of=$testdir/f.$F bs=128K count=1 > \
/dev/null 2>&1 || error "dd $F failed"
done
+ sync; sleep 1; sync
# wait for QOS to update
(( SECONDS < start + 1 )) && sleep $((start + 1 - SECONDS))
ffree=($(lctl get_param -n mdc.*[mM][dD][cC]-*.filesfree))
bavail=($(lctl get_param -n mdc.*[mM][dD][cC]-*.kbytesavail))
- max=$(((${ffree[max_index]} >> 8) * \
+ max=$(((${ffree[max_index]} >> 8) *
(${bavail[max_index]} * bsize >> 16)))
- min=$(((${ffree[min_index]} >> 8) * \
+ min=$(((${ffree[min_index]} >> 8) *
(${bavail[min_index]} * bsize >> 16)))
diff=$(((max - min) * 100 / min))
i=$((i + 1))
done
- echo "MDT filesfree available: ${ffree[@]}"
- echo "MDT blocks available: ${bavail[@]}"
+ echo "MDT filesfree available: ${ffree[*]}"
+ echo "MDT blocks available: ${bavail[*]}"
echo "weight diff=$diff%"
}
(( ${ffree[min_index]} < 10000000 )) ||
skip "too many free files in MDT$min_index"
- echo "MDT filesfree available: ${ffree[@]}"
- echo "MDT blocks available: ${bavail[@]}"
+ echo "MDT filesfree available: ${ffree[*]}"
+ echo "MDT blocks available: ${bavail[*]}"
echo "weight diff=$(((max - min) * 100 / min))%"
echo
echo "Mkdir (stripe_count $stripe_count) with balanced space usage:"
}
run_test 413d "inherit ROOT default LMV"
+test_413e() {
+ (( MDSCOUNT >= 2 )) ||
+ skip "We need at least 2 MDTs for this test"
+ (( MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "Need server version at least 2.14.55"
+
+ local testdir=$DIR/$tdir
+ local tmpfile=$TMP/temp.setdirstripe.stderr.$$
+ local max_inherit
+ local sub_max_inherit
+
+ mkdir -p $testdir || error "failed to create $testdir"
+
+ # set default max-inherit to -1 if stripe count is 0 or 1
+ $LFS setdirstripe -D -c 1 $testdir ||
+ error "failed to set default LMV"
+ max_inherit=$($LFS getdirstripe -D --max-inherit $testdir)
+ (( max_inherit == -1 )) ||
+ error "wrong max_inherit value $max_inherit"
+
+ # set default max_inherit to a fixed value if stripe count is not 0 or 1
+ $LFS setdirstripe -D -c -1 $testdir ||
+ error "failed to set default LMV"
+ max_inherit=$($LFS getdirstripe -D --max-inherit $testdir)
+ (( max_inherit > 0 )) ||
+ error "wrong max_inherit value $max_inherit"
+
+ # and the subdir will decrease the max_inherit by 1
+ mkdir -p $testdir/subdir-1 || error "failed to make subdir"
+ sub_max_inherit=$($LFS getdirstripe -D --max-inherit $testdir/subdir-1)
+ (( sub_max_inherit == max_inherit - 1)) ||
+ error "wrong max-inherit of subdir $sub_max_inherit"
+
+ # check specified --max-inherit and warning message
+ stack_trap "rm -f $tmpfile"
+ $LFS setdirstripe -D -c 2 --max-inherit=-1 $testdir 2> $tmpfile ||
+ error "failed to set default LMV"
+ max_inherit=$($LFS getdirstripe -D --max-inherit $testdir)
+ (( max_inherit == -1 )) ||
+ error "wrong max_inherit value $max_inherit"
+
+ # check the warning messages
+ if ! [[ $(cat $tmpfile) =~ "max-inherit=" ]]; then
+ error "failed to detect warning string"
+ fi
+}
+run_test 413e "check default max-inherit value"
+
+test_fs_dmv_inherit()
+{
+ local testdir=$DIR/$tdir
+
+ local count
+ local inherit
+ local inherit_rr
+
+ for i in 1 2 3; do
+ mkdir $testdir || error "mkdir $testdir failed"
+ count=$($LFS getdirstripe -D -c $testdir)
+ (( count == 1 )) ||
+ error "$testdir default LMV count mismatch $count != 1"
+ inherit=$($LFS getdirstripe -D -X $testdir)
+ (( inherit == 3 - i )) ||
+ error "$testdir default LMV max-inherit $inherit != $((3 - i))"
+ inherit_rr=$($LFS getdirstripe -D --max-inherit-rr $testdir)
+ (( inherit_rr == 3 - i )) ||
+ error "$testdir default LMV max-inherit-rr $inherit_rr != $((3 - i))"
+ testdir=$testdir/sub
+ done
+
+ mkdir $testdir || error "mkdir $testdir failed"
+ count=$($LFS getdirstripe -D -c $testdir)
+ (( count == 0 )) ||
+ error "$testdir default LMV count not zero: $count"
+}
+
+test_413f() {
+ (( MDSCOUNT >= 2 )) || skip "We need at least 2 MDTs for this test"
+
+ (( MDS1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "Need server version at least 2.14.55"
+
+ getfattr -d -m trusted.dmv --absolute-names $DIR > $TMP/dmv.ea ||
+ error "dump $DIR default LMV failed"
+ stack_trap "setfattr --restore=$TMP/dmv.ea"
+
+ $LFS setdirstripe -D -i -1 -c 1 -X 3 --max-inherit-rr 3 $DIR ||
+ error "set $DIR default LMV failed"
+
+ test_fs_dmv_inherit
+}
+run_test 413f "lfs getdirstripe -D list ROOT default LMV if it's not set on dir"
+
+test_413g() {
+ (( MDSCOUNT >= 2 )) || skip "We need at least 2 MDTs for this test"
+
+ mkdir -p $DIR/$tdir/l2/l3/l4 || error "mkdir $tdir/l1/l2/l3 failed"
+ getfattr -d -m trusted.dmv --absolute-names $DIR > $TMP/dmv.ea ||
+ error "dump $DIR default LMV failed"
+ stack_trap "setfattr --restore=$TMP/dmv.ea"
+
+ $LFS setdirstripe -D -i -1 -c 1 -X 3 --max-inherit-rr 3 $DIR ||
+ error "set $DIR default LMV failed"
+
+ FILESET="$FILESET/$tdir/l2/l3/l4" mount_client $MOUNT2 ||
+ error "mount $MOUNT2 failed"
+ stack_trap "umount_client $MOUNT2"
+
+ local saved_DIR=$DIR
+
+ export DIR=$MOUNT2
+
+ stack_trap "export DIR=$saved_DIR"
+
+ # first check filesystem-wide default LMV inheritance
+ test_fs_dmv_inherit || error "incorrect fs default LMV inheritance"
+
+ # then check subdirs are spread to all MDTs
+ createmany -d $DIR/s $((MDSCOUNT * 100)) || error "createmany failed"
+
+ local count=$($LFS getstripe -m $DIR/s* | sort -u | wc -l)
+
+ (( $count == $MDSCOUNT )) || error "dirs are spread to $count MDTs"
+}
+run_test 413g "enforce ROOT default LMV on subdir mount"
+
+test_413h() {
+ (( MDSCOUNT >= 2 )) ||
+ skip "We need at least 2 MDTs for this test"
+
+ (( MDS1_VERSION >= $(version_code 2.15.50.6) )) ||
+ skip "Need server version at least 2.15.50.6"
+
+ local lmv_qos_maxage=$($LCTL get_param -n lmv.*.qos_maxage)
+
+ stack_trap "$LCTL set_param \
+ lmv.*.qos_maxage=$lmv_qos_maxage > /dev/null"
+ $LCTL set_param lmv.*.qos_maxage=1
+
+ local depth=5
+ local rr_depth=4
+ local dir=$DIR/$tdir/l1/l2/l3/l4/l5
+ local count=$((MDSCOUNT * 20))
+
+ generate_uneven_mdts 50
+
+ mkdir -p $dir || error "mkdir $dir failed"
+ stack_trap "rm -rf $dir"
+ $LFS setdirstripe -D -c 1 -i -1 --max-inherit=$depth \
+ --max-inherit-rr=$rr_depth $dir
+
+ for ((d=0; d < depth + 2; d++)); do
+ log "dir=$dir:"
+ for ((sub=0; sub < count; sub++)); do
+ mkdir $dir/d$sub
+ done
+ $LFS getdirstripe -i $dir/d* | sort | uniq -c | sort -nr
+ local num=($($LFS getdirstripe -i $dir/d* | sort | uniq -c))
+ # subdirs within $rr_depth should be created round-robin
+ if (( d < rr_depth )); then
+ (( ${num[0]} != count )) ||
+ error "all objects created on MDT ${num[1]}"
+ fi
+
+ dir=$dir/d0
+ done
+}
+run_test 413h "don't stick to parent for round-robin dirs"
+
test_413z() {
local pids=""
local subdir
local pid
for subdir in $(\ls -1 -d $DIR/d413*-fillmdt/*); do
- unlinkmany $subdir/f. 1000 &
+ unlinkmany $subdir/f. $TEST413_COUNT &
pids="$pids $!"
done
total=500
# this test may be slow on ZFS
- [ "$mds1_FSTYPE" == "zfs" ] && total=100
+ [ "$mds1_FSTYPE" == "zfs" ] && total=50
# though this test is designed for striped directory, let's test normal
# directory too since lock is always saved as CoS lock.
}
run_test 432 "mv dir from outside Lustre"
+test_433() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+
+ [[ -n "$($LCTL list_param llite.*.inode_cache 2>/dev/null)" ]] ||
+ skip "inode cache not supported"
+
+ $LCTL set_param llite.*.inode_cache=0
+ stack_trap "$LCTL set_param llite.*.inode_cache=1"
+
+ local count=256
+ local before
+ local after
+
+ cancel_lru_locks mdc
+ test_mkdir $DIR/$tdir || error "mkdir $tdir"
+ createmany -m $DIR/$tdir/f $count
+ createmany -d $DIR/$tdir/d $count
+ ls -l $DIR/$tdir > /dev/null
+ stack_trap "rm -rf $DIR/$tdir"
+
+ before=$(num_objects)
+ cancel_lru_locks mdc
+ after=$(num_objects)
+
+ # sometimes even @before is less than 2 * count
+ while (( before - after < count )); do
+ sleep 1
+ after=$(num_objects)
+ wait=$((wait + 1))
+ (( wait % 5 == 0 )) && echo "wait $wait seconds objects: $after"
+ if (( wait > 60 )); then
+ error "inode slab grew from $before to $after"
+ fi
+ done
+
+ echo "lustre_inode_cache $before objs before lock cancel, $after after"
+}
+run_test 433 "ldlm lock cancel releases dentries and inodes"
+
prep_801() {
[[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
prep_801
mkdir $DIR/$tdir || error "(1) fail to mkdir"
- createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
+ createmany -d $DIR/$tdir/d 6 || error "(2) fail to mkdir"
touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
error "Fail to rm $DIR/$tdir/dir0"
for idx in $(seq $MDSCOUNT); do
- dev=$(mdsdevname $idx)
rc=0
stop mds${idx}
+ dev=$(mdsdevname $idx)
run_e2fsck $(facet_active_host mds$idx) $dev -n ||
rc=$?
start mds${idx} $dev $MDS_MOUNT_OPTS ||
changelog_users $SINGLEMDS | grep -q $cl_user ||
error "User $cl_user not found in changelog_users"
- local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
- save_lustre_params client "llite.*.xattr_cache" > $save
- lctl set_param llite.*.xattr_cache=0
- stack_trap "restore_lustre_params < $save; rm -f $save" EXIT
-
rm -rf $DIR/$tdir || error "rm $tdir failed"
mkdir_on_mdt0 $DIR/$tdir || error "mkdir $tdir failed"
touch $DIR/$tdir/trunc || error "touch $tdir/trunc failed"
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
+ test_mkdir -i0 -c1 $DIR/$tdir
+ $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
+ $LFS setstripe -c1 -i1 $DIR/$tdir/$tfile
stop $SINGLEMDS
+
+ # restore osp-syn threads
+ stack_trap "fail $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
+
+ local testid=$(echo $TESTNAME | tr '_' ' ')
+
+ do_facet mds1 dmesg | tac | sed "/$testid/,$ d" |
+ grep "run LFSCK" || error "run LFSCK is not suggested"
}
run_test 818 "unlink with failed llog"
}
run_test 820 "update max EA from open intent"
-test_822() {
- local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
-
- save_lustre_params mds1 \
- "osp.$FSNAME-OST*-osc-MDT0000.max_create_count" > $p
- do_facet $SINGLEMDS "$LCTL set_param -n \
- osp.$FSNAME-OST*MDT0000.max_create_count=0"
- do_facet $SINGLEMDS "$LCTL set_param -n \
- osp.$FSNAME-OST0000*MDT0000.max_create_count=20000"
-
- # wait for statfs update to clear OS_STATFS_NOPRECREATE
- local maxage=$(do_facet mds1 $LCTL get_param -n \
- osp.$FSNAME-OST0000*MDT0000.maxage)
- sleep $((maxage + 1))
-
- #define OBD_FAIL_NET_ERROR_RPC 0x532
- do_facet mds1 "$LCTL set_param fail_loc=0x80000532 fail_val=5"
-
- stack_trap "restore_lustre_params < $p; rm $p"
-
- local count=$(do_facet $SINGLEMDS "lctl get_param -n \
- osp.$FSNAME-OST0000*MDT0000.create_count")
- for i in $(seq 1 $count); do
- touch $DIR/$tfile.${i} || error "touch failed"
- done
-}
-run_test 822 "test precreate failure"
-
test_823() {
local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
local OST_MAX_PRECREATE=20000
+ (( $MDS1_VERSION >= $(version_code 2.14.56) )) ||
+ skip "Need MDS version at least 2.14.56"
+
save_lustre_params mds1 \
"osp.$FSNAME-OST*-osc-MDT0000.max_create_count" > $p
do_facet $SINGLEMDS "$LCTL set_param -n \
run_test 823 "Setting create_count > OST_MAX_PRECREATE is lowered to maximum"
test_831() {
+ [[ $MDS1_VERSION -lt $(version_code 2.14.56) ]] &&
+ skip "Need MDS version 2.14.56"
+
local sync_changes=$(do_facet $SINGLEMDS \
$LCTL get_param -n osp.$FSNAME-OST0000-osc-MDT0000.sync_changes)
# LUS-6253/LU-11185
test_901() {
+ local old
+ local count
local oldc
local newc
local olds
# some get_param have a bug to handle dot in param name
cancel_lru_locks MGC
- oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
- olds=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+ old=$(mount -t lustre | wc -l)
+ # 1 config+sptlrpc
+ # 2 params
+ # 3 nodemap
+ # 4 IR
+ old=$((old * 4))
+ oldc=0
+ count=0
+ while [ $old -ne $oldc ]; do
+ oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+ sleep 1
+ ((count++))
+ if [ $count -ge $TIMEOUT ]; then
+ error "too large timeout"
+ fi
+ done
umount_client $MOUNT || error "umount failed"
mount_client $MOUNT || error "mount failed"
cancel_lru_locks MGC
newc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
- news=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
[ $oldc -lt $newc ] && error "mgc lock leak ($oldc != $newc)"
- [ $olds -lt $news ] && error "mgs lock leak ($olds != $news)"
return 0
}
}
run_test 903 "Test long page discard does not cause evictions"
+test_904() {
+ [ "$mds1_FSTYPE" == "ldiskfs" ] || skip "ldiskfs only test"
+ do_facet mds1 $DEBUGFS -R features $(mdsdevname 1) |
+ grep -q project || skip "skip project quota not supported"
+
+ local testfile="$DIR/$tdir/$tfile"
+ local xattr="trusted.projid"
+ local projid
+ local mdts=$(comma_list $(mdts_nodes))
+ local saved=$(do_facet mds1 $LCTL get_param -n \
+ osd-ldiskfs.*MDT0000.enable_projid_xattr)
+
+ do_nodes $mdts $LCTL set_param osd-ldiskfs.*MDT*.enable_projid_xattr=0
+ stack_trap "do_nodes $mdts $LCTL set_param \
+ osd-ldiskfs.*MDT*.enable_projid_xattr=$saved"
+
+ mkdir -p $DIR/$tdir
+ touch $testfile
+ #hide projid xattr on server
+ $LFS project -p 1 $testfile ||
+ error "set $testfile project id failed"
+ getfattr -m - $testfile | grep $xattr &&
+ error "do not show trusted.projid when disabled on server"
+ do_nodes $mdts $LCTL set_param osd-ldiskfs.*MDT*.enable_projid_xattr=1
+ #should be hidden when projid is 0
+ $LFS project -p 0 $testfile ||
+ error "set $testfile project id failed"
+ getfattr -m - $testfile | grep $xattr &&
+ error "do not show trusted.projid with project ID 0"
+
+ #still can getxattr explicitly
+ projid=$(getfattr -n $xattr $testfile |
+ sed -n 's/^trusted\.projid="\(.*\)"/\1/p')
+ [ $projid == "0" ] ||
+ error "projid expected 0 not $projid"
+
+ #set the projid via setxattr
+ setfattr -n $xattr -v "1000" $testfile ||
+ error "setattr failed with $?"
+ projid=($($LFS project $testfile))
+ [ ${projid[0]} == "1000" ] ||
+ error "projid expected 1000 not $projid"
+
+ #check the new projid via getxattr
+ $LFS project -p 1001 $testfile ||
+ error "set $testfile project id failed"
+ getfattr -m - $testfile | grep $xattr ||
+ error "should show trusted.projid when project ID != 0"
+ projid=$(getfattr -n $xattr $testfile |
+ sed -n 's/^trusted\.projid="\(.*\)"/\1/p')
+ [ $projid == "1001" ] ||
+ error "projid expected 1001 not $projid"
+
+ #try to set invalid projid
+ setfattr -n $xattr -v "4294967295" $testfile &&
+ error "set invalid projid should fail"
+
+ #remove the xattr means setting projid to 0
+ setfattr -x $xattr $testfile ||
+ error "setfattr failed with $?"
+ projid=($($LFS project $testfile))
+ [ ${projid[0]} == "0" ] ||
+ error "projid expected 0 not $projid"
+
+ #should be hidden when parent has inherit flag and same projid
+ $LFS project -srp 1002 $DIR/$tdir ||
+ error "set $tdir project id failed"
+ getfattr -m - $testfile | grep $xattr &&
+ error "do not show trusted.projid with inherit flag"
+
+ #still can getxattr explicitly
+ projid=$(getfattr -n $xattr $testfile |
+ sed -n 's/^trusted\.projid="\(.*\)"/\1/p')
+ [ $projid == "1002" ] ||
+ error "projid expected 1002 not $projid"
+}
+run_test 904 "virtual project ID xattr"
+
+# LU-8582
+test_905() {
+ (( $OST1_VERSION >= $(version_code 2.8.54) )) ||
+ skip "lustre < 2.8.54 does not support ladvise"
+
+ remote_ost_nodsh && skip "remote OST with nodsh"
+ $LFS setstripe -c -1 -i 0 $DIR/$tfile || error "setstripe failed"
+
+ $LFS ladvise -a willread $DIR/$tfile || error "ladvise does not work"
+
+ #define OBD_FAIL_OST_OPCODE 0x253
+ # OST_LADVISE = 21
+ do_facet ost1 "$LCTL set_param fail_val=21 fail_loc=0x0253"
+ $LFS ladvise -a willread $DIR/$tfile &&
+ error "unexpected success of ladvise with fault injection"
+ $LFS ladvise -a willread $DIR/$tfile |&
+ grep -q "Operation not supported"
+ (( $? == 0 )) || error "unexpected stderr of ladvise with fault injection"
+}
+run_test 905 "bad or new opcode should not stuck client"
+
complete $SECONDS
[ -f $EXT2_DEV ] && rm $EXT2_DEV || true
check_and_cleanup_lustre