export PARALLEL=${PARALLEL:-"no"}
TRACE=${TRACE:-""}
-LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
LUSTRE=${LUSTRE:-$(dirname $0)/..}
+LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
. $LUSTRE/tests/test-framework.sh
init_test_env $@
ALWAYS_EXCEPT+=" 411"
fi
-# 5 12 (min)"
+# 5 12 8 12 (min)"
[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
if [ "$mds1_FSTYPE" = "zfs" ]; then
}
run_test 27ce "more stripes than OSTs with -o"
+test_27cf() {
+ local osp_proc="osp.$FSNAME-OST0000-osc-MDT000*.active"
+ local pid=0
+
+ test_mkdir -p $DIR/$tdir || error "failed to mkdir $DIR/$tdir"
+ do_facet $SINGLEMDS "$LCTL set_param -n $osp_proc=0"
+ stack_trap "do_facet $SINGLEMDS $LCTL set_param -n $osp_proc=1" EXIT
+ wait_update_facet $SINGLEMDS "$LCTL get_param -n $osp_proc | grep 1" ||
+ error "failed to set $osp_proc=0"
+
+ $LFS setstripe -o 0 $DIR/$tdir/$tfile &
+ pid=$!
+ sleep 1
+ do_facet $SINGLEMDS "$LCTL set_param -n $osp_proc=1"
+ wait_update_facet $SINGLEMDS "$LCTL get_param -n $osp_proc | grep 0" ||
+ error "failed to set $osp_proc=1"
+ wait $pid
+ [[ $pid -ne 0 ]] ||
+ error "should return error due to $osp_proc=0"
+}
+run_test 27cf "'setstripe -o' on inactive OSTs should return error"
+
test_27d() {
test_mkdir $DIR/$tdir
$LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
}
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"
+
+ test_mkdir -c $MDSCOUNT -H crush $DIR/$tdir ||
+ error "mkdir $tdir failed"
+ touch $DIR/$tdir/$tfile || error "touch $tfile failed"
+
+ local index=$($LFS getstripe -m $DIR/$tdir/$tfile)
+ local index2
+
+ 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"
+ index2=$($LFS getstripe -m $fname)
+ [ $index -eq $index2 ] ||
+ error "$fname MDT index mismatch $index != $index2"
+ done
+
+ local failed=0
+ for i in {1..50}; do
+ for fname in $(mktemp -u $DIR/$tdir/.$tfile.XXXXXX) \
+ $(mktemp $DIR/$tdir/$tfile.XXXXXXXX); do
+ touch $fname || error "touch $fname failed"
+ index2=$($LFS getstripe -m $fname)
+ if [[ $index != $index2 ]]; then
+ failed=$((failed + 1))
+ echo "$fname MDT index mismatch $index != $index2"
+ fi
+ done
+ done
+ echo "$failed MDT index mismatches"
+ (( failed < 4 )) || error "MDT index mismatch $failed times"
+
+}
+run_test 33h "temp file is located on the same MDT as target"
+
TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
test_34a() {
rm -f $DIR/f34
}
run_test 39p "remote directory cached attributes updated after create ========"
+test_39r() {
+ [ $OST1_VERSION -ge $(version_code 2.13.52) ] ||
+ skip "no atime update on old OST"
+ if [ "$ost1_FSTYPE" != ldiskfs ]; then
+ skip_env "ldiskfs only test"
+ fi
+
+ local saved_adiff
+ saved_adiff=$(do_facet ost1 \
+ lctl get_param -n obdfilter.*OST0000.atime_diff)
+ stack_trap "do_facet ost1 \
+ lctl set_param obdfilter.*.atime_diff=$saved_adiff"
+
+ do_facet ost1 "lctl set_param obdfilter.*.atime_diff=5"
+
+ $LFS setstripe -i 0 $DIR/$tfile
+ dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 ||
+ error "can't write initial file"
+ cancel_lru_locks osc
+
+ # exceed atime_diff and access file
+ sleep 6
+ dd if=$DIR/$tfile of=/dev/null || error "can't udpate atime"
+
+ local atime_cli=$(stat -c %X $DIR/$tfile)
+ echo "client atime: $atime_cli"
+ # allow atime update to be written to device
+ do_facet ost1 "$LCTL set_param -n osd*.*OST*.force_sync 1"
+ sleep 5
+
+ local ostdev=$(ostdevname 1)
+ local fid=($(lfs getstripe -y $DIR/$tfile |
+ awk '/l_fid:/ { print $2 }' | tr ':' ' '))
+ local objpath="O/0/d$((${fid[1]} % 32))/$((${fid[1]}))"
+ local cmd="debugfs -c -R \\\"stat $objpath\\\" $ostdev"
+
+ echo "OST atime: $(do_facet ost1 "$cmd" |& grep atime)"
+ local atime_ost=$(do_facet ost1 "$cmd" |&
+ awk -F'[: ]' '/atime:/ { print $4 }')
+ (( atime_cli == atime_ost )) ||
+ error "atime on client $atime_cli != ost $atime_ost"
+}
+run_test 39r "lazy atime update on OST"
test_39q() { # LU-8041
local testdir=$DIR/$tdir
}
run_test 56ra "check lfs find -size -lazy works for data on OSTs"
+test_56rb() {
+ local dir=$DIR/$tdir
+ local tmp=$TMP/$tfile.log
+ local mdt_idx;
+
+ test_mkdir -p $dir || error "failed to mkdir $dir"
+ $LFS setstripe -c 1 -i 0 $dir/$tfile ||
+ error "failed to setstripe $dir/$tfile"
+ dd if=/dev/zero of=$dir/$tfile bs=1M count=1
+
+ stack_trap "rm -f $tmp" EXIT
+ $LFS find --size +100K --ost 0 $dir 2>&1 | tee $tmp
+ [ -z "$(cat $tmp | grep "obd_uuid: ")" ] ||
+ error "failed to find --size +100K --ost 0 $dir"
+ $LFS find --size +100K --mdt $mdt_idx $dir 2>&1 | tee $tmp
+ [ -z "$(cat $tmp | grep "obd_uuid: ")" ] ||
+ error "failed to find --size +100K --mdt $mdt_idx $dir"
+}
+run_test 56rb "check lfs find --size --ost/--mdt works"
+
test_56s() { # LU-611 #LU-9369
[[ $OSTCOUNT -lt 2 ]] && skip_env "need at least 2 OSTs"
echo "done."
echo -n "Removing test file from pool '$pool'..."
- $LFS migrate $file1 &> /dev/null ||
+ # "lfs migrate $file" won't remove the file from the pool
+ # until some striping information is changed.
+ $LFS migrate -c 1 $file1 &> /dev/null ||
error "cannot remove from pool"
[ "$($LFS getstripe -p $file1)" ] &&
error "pool still set"
test_56wc() {
local file1="$DIR/$tdir/file1"
+ local parent_ssize
+ local parent_scount
+ local cur_ssize
+ local cur_scount
+ local orig_ssize
echo -n "Creating test dir..."
test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
- local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
$LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
- error "cannot set stripe"
+ error "cannot set stripe by '-S 1M -c 1'"
echo "done"
echo -n "Setting initial stripe for test file..."
$LFS setstripe -S 512K -c 1 "$file1" &> /dev/null ||
error "cannot set stripe"
- [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
- error "stripe size not set"
+ cur_ssize=$($LFS getstripe -S "$file1")
+ [ $cur_ssize -eq 524288 ] || error "setstripe -S $cur_ssize != 524288"
echo "done."
# File currently set to -S 512K -c 1
echo -n "Verifying -S option is passed through to lfs migrate..."
$LFS_MIGRATE -y -S 1M "$file1" &> /dev/null ||
error "migration failed"
- [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
- error "file was not restriped"
+ cur_ssize=$($LFS getstripe -S "$file1")
+ [ $cur_ssize -eq 1048576 ] || error "migrate -S $cur_ssize != 1048576"
echo "done."
# File currently set to -S 1M -c 1
error "long option without argument not supported"
$LFS_MIGRATE -y --stripe-size 512K "$file1" &> /dev/null ||
error "long option with argument not supported"
- [ $($LFS getstripe -S "$file1") -eq 524288 ] ||
- error "file not restriped with --stripe-size option"
+ cur_ssize=$($LFS getstripe -S "$file1")
+ [ $cur_ssize -eq 524288 ] ||
+ error "migrate --stripe-size $cur_ssize != 524288"
echo "done."
# File currently set to -S 512K -c 1
echo -n "Verifying explicit stripe count can be set..."
$LFS_MIGRATE -y -c 2 "$file1" &> /dev/null ||
error "migrate failed"
- [ $($LFS getstripe -c "$file1") -eq 2 ] ||
- error "file not restriped to explicit count"
+ cur_scount=$($LFS getstripe -c "$file1")
+ [ $cur_scount -eq 2 ] || error "migrate -c $cur_scount != 2"
echo "done."
fi
# Ensure parent striping is used if -R is set, and no stripe
# count or size is specified
echo -n "Setting stripe for parent directory..."
- $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
- error "cannot set stripe"
+ $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
+ error "cannot set stripe '-S 2M -c 1'"
echo "done."
echo -n "Verifying restripe option uses parent stripe settings..."
+ parent_ssize=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
+ parent_scount=$($LFS getstripe -c $DIR/$tdir 2>/dev/null)
$LFS_MIGRATE -y -R "$file1" &> /dev/null ||
error "migrate failed"
- [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
- error "file not restriped to parent settings"
- [ $($LFS getstripe -c "$file1") -eq 1 ] ||
- error "file not restriped to parent settings"
+ cur_ssize=$($LFS getstripe -S "$file1")
+ [ $cur_ssize -eq $parent_ssize ] ||
+ error "migrate -R stripe_size $cur_ssize != $parent_ssize"
+ cur_scount=$($LFS getstripe -c "$file1")
+ [ $cur_scount -eq $parent_scount ] ||
+ error "migrate -R stripe_count $cur_scount != $parent_scount"
echo "done."
# File currently set to -S 1M -c 1
# Ensure striping is preserved if -R is not set, and no stripe
# count or size is specified
echo -n "Verifying striping size preserved when not specified..."
- local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
+ orig_ssize=$($LFS getstripe -S "$file1" 2>/dev/null)
$LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
error "cannot set stripe on parent directory"
$LFS_MIGRATE -y "$file1" &> /dev/null ||
error "migrate failed"
- [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
- error "file was restriped"
+ cur_ssize=$($LFS getstripe -S "$file1")
+ [ $cur_ssize -eq $orig_ssize ] ||
+ error "migrate by default $cur_ssize != $orig_ssize"
echo "done."
# Ensure file name properly detected when final option has no argument
}
run_test 56xc "lfs migration autostripe"
+test_56xd() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
+
+ local dir=$DIR/$tdir
+ local f_mgrt=$dir/$tfile.mgrt
+ local f_yaml=$dir/$tfile.yaml
+ local f_copy=$dir/$tfile.copy
+ local layout_yaml="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
+ local layout_copy="-c 2 -S 2M -i 1"
+ local yamlfile=$dir/yamlfile
+ local layout_before;
+ local layout_after;
+
+ test_mkdir "$dir" || error "cannot create dir $dir"
+ $LFS setstripe $layout_yaml $f_yaml ||
+ error "cannot setstripe $f_yaml with layout $layout_yaml"
+ $LFS getstripe --yaml $f_yaml > $yamlfile
+ $LFS setstripe $layout_copy $f_copy ||
+ error "cannot setstripe $f_copy with layout $layout_copy"
+ touch $f_mgrt
+ dd if=/dev/zero of=$f_mgrt bs=1M count=4
+
+ # 1. test option --yaml
+ $LFS_MIGRATE -y --yaml $yamlfile $f_mgrt ||
+ error "cannot migrate $f_mgrt with --yaml $yamlfile"
+ layout_before=$(get_layout_param $f_yaml)
+ layout_after=$(get_layout_param $f_mgrt)
+ [ "$layout_after" == "$layout_before" ] ||
+ error "lfs_migrate --yaml: $layout_after != $layout_before"
+
+ # 2. test option --copy
+ $LFS_MIGRATE -y --copy $f_copy $f_mgrt ||
+ error "cannot migrate $f_mgrt with --copy $f_copy"
+ layout_before=$(get_layout_param $f_copy)
+ layout_after=$(get_layout_param $f_mgrt)
+ [ "$layout_after" == "$layout_before" ] ||
+ error "lfs_migrate --copy: $layout_after != $layout_before"
+}
+run_test 56xd "check lfs_migrate --yaml and --copy support"
+
+test_56xe() {
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs"
+
+ local dir=$DIR/$tdir
+ local f_comp=$dir/$tfile
+ local layout="-E 1M -S 512K -c 1 -E -1 -S 1M -c 2 -i 0"
+ local layout_before=""
+ local layout_after=""
+
+ test_mkdir "$dir" || error "cannot create dir $dir"
+ $LFS setstripe $layout $f_comp ||
+ error "cannot setstripe $f_comp with layout $layout"
+ layout_before=$(get_layout_param $f_comp)
+ dd if=/dev/zero of=$f_comp bs=1M count=4
+
+ # 1. migrate a comp layout file by lfs_migrate
+ $LFS_MIGRATE -y $f_comp || error "cannot migrate $f_comp by lfs_migrate"
+ layout_after=$(get_layout_param $f_comp)
+ [ "$layout_before" == "$layout_after" ] ||
+ error "lfs_migrate: $layout_before != $layout_after"
+
+ # 2. migrate a comp layout file by lfs migrate
+ $LFS migrate $f_comp || error "cannot migrate $f_comp by lfs migrate"
+ layout_after=$(get_layout_param $f_comp)
+ [ "$layout_before" == "$layout_after" ] ||
+ error "lfs migrate: $layout_before != $layout_after"
+}
+run_test 56xe "migrate a composite layout file"
+
test_56y() {
[ $MDS1_VERSION -lt $(version_code 2.4.53) ] &&
skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53"
test_64a () {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
- df $DIR
- lctl get_param -n osc.*[oO][sS][cC][_-]*.cur* | grep "[0-9]"
+ lfs df $DIR
+ lctl get_param osc.*[oO][sS][cC][_-]*.cur* | grep "=[1-9]"
}
run_test 64a "verify filter grant calculations (in kernel) ====="
test_76() { # Now for bug 20433, added originally in bug 1443
[ $PARALLEL == "yes" ] && skip "skip parallel run"
- local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
-
cancel_lru_locks osc
- BEFORE_INODES=$(num_inodes)
- echo "before inodes: $BEFORE_INODES"
- local COUNT=1000
- [ "$SLOW" = "no" ] && COUNT=100
- for i in $(seq $COUNT); do
+ local cpus=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
+ local before=$(num_inodes)
+ local count=$((512 * cpus))
+ [ "$SLOW" = "no" ] && count=$((64 * cpus))
+
+ echo "before inodes: $before"
+ for i in $(seq $count); do
touch $DIR/$tfile
rm -f $DIR/$tfile
done
cancel_lru_locks osc
- AFTER_INODES=$(num_inodes)
- echo "after inodes: $AFTER_INODES"
- local wait=0
- while [[ $((AFTER_INODES-1*${CPUS:-1})) -gt $BEFORE_INODES ]]; do
- sleep 2
- AFTER_INODES=$(num_inodes)
- wait=$((wait+2))
- echo "wait $wait seconds inodes: $AFTER_INODES"
- if [ $wait -gt 30 ]; then
- error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
+ local after=$(num_inodes)
+ echo "after inodes: $after"
+ while (( after > before + 8 * ${cpus:-1} )); do
+ sleep 1
+ after=$(num_inodes)
+ wait=$((wait + 1))
+ (( wait % 5 == 0 )) && echo "wait $wait seconds inodes: $after"
+ if (( wait > 30 )); then
+ error "inode slab grew from $before to $after"
fi
done
}
[ $PARALLEL == "yes" ] && skip "skip parallel run"
local file=$DIR/$tfile
- local sz_MB=${FILESIZE_101d:-500}
+ local sz_MB=${FILESIZE_101d:-80}
local ra_MB=${READAHEAD_MB:-40}
local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
$LCTL get_param -n llite.*.max_read_ahead_mb
echo Reading the test file $file with read-ahead disabled
- local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
+ local sz_KB=$((sz_MB * 1024 / 4))
+ local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=4k count=$sz_KB")
echo Cancel LRU locks on lustre client to flush the client cache
cancel_lru_locks osc
$LCTL set_param -n llite.*.max_read_ahead_mb=$ra_MB
echo Reading the test file $file with read-ahead enabled
- local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
+ local raON=$(do_and_time "dd if=$file of=/dev/null bs=4k count=$sz_KB")
echo "read-ahead disabled time read $raOFF"
- echo "read-ahead enabled time read $raON"
+ echo "read-ahead enabled time read $raON"
rm -f $file
wait_delete_completed
}
run_test 101h "Readahead should cover current read window"
+test_101i() {
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 ||
+ error "dd 10M file failed"
+
+ local max_per_file_mb=$($LCTL get_param -n \
+ llite.*.max_read_ahead_per_file_mb 2>/dev/null)
+ cancel_lru_locks osc
+ stack_trap "$LCTL set_param llite.*.max_read_ahead_per_file_mb=$max_per_file_mb"
+ $LCTL set_param llite.*.max_read_ahead_per_file_mb=1 ||
+ error "set max_read_ahead_per_file_mb to 1 failed"
+
+ echo "Reset readahead stats"
+ $LCTL set_param llite.*.read_ahead_stats=0
+
+ dd if=$DIR/$tfile of=/dev/null bs=2M
+
+ $LCTL get_param llite.*.read_ahead_stats
+ local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
+ awk '/misses/ { print $2 }')
+ [ $miss -eq 5 ] || error "expected misses 5 but got $miss"
+ rm -f $DIR/$tfile
+}
+run_test 101i "allow current readahead to exceed reservation"
+
+test_101j() {
+ $LFS setstripe -i 0 -c 1 $DIR/$tfile ||
+ error "setstripe $DIR/$tfile failed"
+ local file_size=$((1048576 * 16))
+ local old_ra=$($LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1)
+ stack_trap "$LCTL set_param -n llite.*.max_read_ahead_mb $old_ra" EXIT
+
+ echo Disable read-ahead
+ $LCTL set_param -n llite.*.max_read_ahead_mb=0
+
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=$(($file_size / 1048576))
+ for blk in $PAGE_SIZE 1048576 $file_size; do
+ cancel_lru_locks osc
+ echo "Reset readahead stats"
+ $LCTL set_param -n llite.*.read_ahead_stats=0
+ local count=$(($file_size / $blk))
+ dd if=$DIR/$tfile bs=$blk count=$count of=/dev/null
+ local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
+ get_named_value 'failed to fast read' |
+ cut -d" " -f1 | calc_total)
+ $LCTL get_param -n llite.*.read_ahead_stats
+ [ $miss -eq $count ] || error "expected $count got $miss"
+ done
+
+ rm -f $p $DIR/$tfile
+}
+run_test 101j "A complete read block should be submitted when no RA"
+
setup_test102() {
test_mkdir $DIR/$tdir
chown $RUNAS_ID $DIR/$tdir
fi
if [ $facet_ver -ge $(version_code 2.5.54) ]; then
do_facet $facet "$LCTL list_param -R '*' | grep '=' |
- tr -d= | egrep -v 'force_lbug|changelog_mask' |
+ tr -d = | egrep -v 'force_lbug|changelog_mask' |
xargs badarea_io" ||
error_133 "$facet badarea_io failed"
else
local fname
mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
- $SETSTRIPE -c 1 -i 0 $DIR/$tdir || error "failed to set striping"
+ $LFS setstripe -c 1 -i 0 $DIR/$tdir || error "failed to set striping"
#set only one record at plain llog
#define OBD_FAIL_CATALOG_FULL_CHECK 0x131a
do_facet $SINGLEMDS $LCTL set_param fail_loc=0x131a fail_val=1
local i
# generate some changelog records to accumulate on each MDT
- test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
+ # use fnv1a because created files should be evenly distributed
+ test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+ error "test_mkdir $tdir failed"
log "$(date +%s): creating first files"
createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
error "create $DIR/$tdir/$tfile failed"
local i
# generate some changelog records to accumulate on each MDT
- test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+ # use fnv1a because created files should be evenly distributed
+ test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+ error "mkdir $tdir failed"
createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
error "create $DIR/$tdir/$tfile failed"
local i
# generate some changelog records to accumulate on each MDT
- test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed"
+ # use fnv1a because created files should be evenly distributed
+ test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+ error "test_mkdir $tdir failed"
createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
error "create $DIR/$tdir/$tfile failed"
changelog_register || error "first changelog_register failed"
# generate some changelog records to accumulate on each MDT
- test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+ # use fnv1a because created files should be evenly distributed
+ test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+ error "mkdir $tdir failed"
createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) ||
error "create $DIR/$tdir/$tfile failed"
stack_trap "changelog_deregister" EXIT
# generate some changelog
- test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
+ # use fnv1a because created files should be evenly distributed
+ test_mkdir -c $MDSCOUNT -H fnv_1a_64 $DIR/$tdir ||
+ error "mkdir $tdir failed"
createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
error "create $DIR/$tdir/${tfile}bis failed"
error "User $cl_user not found in changelog_users"
printf 'clear:'$cl_user':0' >&3
-
}
run_test 160j "client can be umounted while its chanangelog is being used"
ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
+ local len
+ local lnktgt
+
+ # inline symlink
+ for len in 58 59 60; do
+ lnktgt=$(str_repeat 'l' $len)
+ touch $migrate_dir/$lnktgt
+ ln -s $lnktgt $migrate_dir/${len}char_ln
+ done
+
+ # PATH_MAX
+ for len in 4094 4095; do
+ lnktgt=$(str_repeat 'l' $len)
+ ln -s $lnktgt $migrate_dir/${len}char_ln
+ done
+
+ # NAME_MAX
+ for len in 254 255; do
+ touch $migrate_dir/$(str_repeat 'l' $len)
+ done
+
$LFS migrate -m $MDTIDX $migrate_dir ||
error "fails on migrating remote dir to MDT1"
for ((i = 0; i < 10; i++)); do
for file in $(find $migrate_dir/dir_${i}); do
mdt_index=$($LFS getstripe -m $file)
- [ $mdt_index == $MDTIDX ] ||
+ # broken symlink getstripe will fail
+ [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
error "$file is not on MDT${MDTIDX}"
done
done
echo "migrate back to MDT0, checking.."
for file in $(find $migrate_dir); do
mdt_index=$($LFS getstripe -m $file)
- [ $mdt_index == $MDTIDX ] ||
+ [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
error "$file is not on MDT${MDTIDX}"
done
old_count=$((MDSCOUNT - old_index))
new_index=$((RANDOM % MDSCOUNT))
new_count=$((MDSCOUNT - new_index))
- new_hash="all_char"
+ new_hash=1 # for all_char
[ $old_count -gt 1 ] && old_count=$((old_count - RANDOM % old_count))
[ $new_count -gt 1 ] && new_count=$((new_count - RANDOM % new_count))
}
run_test 230m "xattrs not changed after dir migration"
+test_230n() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
+ [[ $MDS1_VERSION -ge $(version_code 2.13.53) ]] ||
+ skip "Need MDS version at least 2.13.53"
+
+ $LFS mkdir -i 0 $DIR/$tdir || error "mkdir $tdir failed"
+ cat /etc/hosts > $DIR/$tdir/$tfile
+ $LFS mirror extend -N1 $DIR/$tdir/$tfile || error "Mirroring failed"
+ $LFS migrate -m 1 $DIR/$tdir || error "Migration failed"
+
+ cmp /etc/hosts $DIR/$tdir/$tfile ||
+ error "File data mismatch after migration"
+}
+run_test 230n "Dir migration with mirrored file"
+
test_231a()
{
# For simplicity this test assumes that max_pages_per_rpc
}
run_test 278 "Race starting MDS between MDTs stop/start"
+test_280() {
+ [ $MGS_VERSION -lt $(version_code 2.13.52) ] &&
+ skip "Need MGS version at least 2.13.52"
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+ combined_mgs_mds || skip "needs combined MGS/MDT"
+
+ umount_client $MOUNT
+#define OBD_FAIL_MDS_LLOG_UMOUNT_RACE 0x15e
+ do_facet mgs $LCTL set_param fail_loc=0x8000015e fail_val=0
+
+ mount_client $MOUNT &
+ sleep 1
+ stop mgs || error "stop mgs failed"
+ #for a race mgs would crash
+ start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
+ mount_client $MOUNT || error "mount client failed"
+}
+run_test 280 "Race between MGS umount and client llog processing"
+
cleanup_test_300() {
trap 0
umask $SAVE_UMASK
#local striped directory
$LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir ||
error "set striped dir error"
+ #look at the directories for debug purposes
+ ls -l $DIR/$tdir
+ $LFS getdirstripe $DIR/$tdir
+ ls -l $DIR/$tdir/striped_dir
+ $LFS getdirstripe $DIR/$tdir/striped_dir
createmany -o $DIR/$tdir/striped_dir/f 10 ||
error "create 10 files failed"
#remote striped directory
$LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir ||
error "set striped dir error"
+ #look at the directories for debug purposes
+ ls -l $DIR/$tdir
+ $LFS getdirstripe $DIR/$tdir
+ ls -l $DIR/$tdir/remote_striped_dir
+ $LFS getdirstripe $DIR/$tdir/remote_striped_dir
createmany -o $DIR/$tdir/remote_striped_dir/f 10 ||
error "create 10 files failed"
chown nobody $DIR/$tdir/d
touch $DIR/$tdir/d/file
- $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
+ $LFS mv -m1 $DIR/$tdir/d || error "lfs mv failed"
}
run_test 316 "lfs mv"
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=0 ||
+ error "set max_read_ahead_async_active should succeed"
$LCTL set_param llite.*.max_read_ahead_async_active=512
max_active=$($LCTL get_param -n \
local prefix=/usr/include/lustre
local prog
+ # Oleg removes c files in his test rig so test if any c files exist
+ [ -z "$(ls -A $LUSTRE_TESTS_API_DIR)" ] && \
+ skip_env "Needed c test files are missing"
+
if ! [[ -d $prefix ]]; then
# Assume we're running in tree and fixup the include path.
extra_flags+=" -I$LUSTRE/../lnet/include/uapi -I$LUSTRE/include/uapi -I$LUSTRE/include"
fi
for prog in $LUSTRE_TESTS_API_DIR/*.c; do
- $CC -Wall -Werror $extra_flags -o $out $prog -llustreapi ||
+ $CC -Wall -Werror -std=c99 $extra_flags -o $out $prog -llustreapi ||
error "client api broken"
done
rm -f $out
continue # lustre_ioctl.h is internal header
fi
- $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
+ $CC -Wall -Werror -std=c99 -include $header -c -x c /dev/null -o $out ||
error "cannot compile '$header'"
done
rm -f $out
}
run_test 422 "kill a process with RPC in progress"
+stat_test() {
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+}
+
+test_423() {
+ local _stats
+ # ensure statfs cache is expired
+ sleep 2;
+
+ _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
+ [[ ${_stats} -ne 1 ]] && error "statfs wrong"
+
+ return 0
+}
+run_test 423 "statfs should return a right data"
+
prep_801() {
[[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
error "truncate $tdir/trunc failed"
local bs=1048576
- dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 ||
+ dd if=/dev/zero of=$DIR/$tdir/single_dd bs=$bs count=1 conv=fsync ||
error "write $tfile failed"
# multi-client wirtes
wait ${pids[$i]}
done
- sleep 5
+ do_rpc_nodes "$CLIENTS" cancel_lru_locks osc
+ do_nodes "$CLIENTS" "sync ; sleep 5 ; sync"
$LSOM_SYNC -u $cl_user -m $FSNAME-MDT0000 $MOUNT
check_lsom_data $DIR/$tdir/trunc
check_lsom_data $DIR/$tdir/single_dd
}
run_test 810 "partial page writes on ZFS (LU-11663)"
-test_811() {
- [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
- skip "Need MDS version at least 2.11.56"
-
- #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
- do_facet mds1 $LCTL set_param fail_loc=0x165
- $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
-
- stop mds1
- start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
-
- wait_update_facet mds1 "pgrep orph_.*-MDD | wc -l" "0" ||
- error "MDD orphan cleanup thread not quit"
-}
-run_test 811 "orphan name stub can be cleaned up in startup"
-
test_812a() {
[ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
skip "OST < 2.12.51 doesn't support this fail_loc"
}
run_test 901 "don't leak a mgc lock on client umount"
+# LU-13377
+test_902() {
+ [ $CLIENT_VERSION -lt $(version_code 2.13.52) ] &&
+ skip "client does not have LU-13377 fix"
+ #define OBD_FAIL_LLITE_SHORT_COMMIT 0x1415
+ $LCTL set_param fail_loc=0x1415
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
+ cancel_lru_locks osc
+ rm -f $DIR/$tfile
+}
+run_test 902 "test short write doesn't hang lustre"
+
complete $SECONDS
[ -f $EXT2_DEV ] && rm $EXT2_DEV || true
check_and_cleanup_lustre