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 "
+# bug number: LU-8411 LU-9054 LU-13314
+ALWAYS_EXCEPT+=" 407 312 56ob"
if $SHARED_KEY; then
- # bug number: LU-9795 LU-9795 LU-9795 LU-9795 LU-12781
- ALWAYS_EXCEPT+=" 17n 60a 133g 300f 272a"
+ # bug number: LU-9795 LU-9795 LU-9795 LU-9795
+ ALWAYS_EXCEPT+=" 17n 60a 133g 300f"
fi
selinux_status=$(getenforce)
fi
# skip nfs tests on kernels >= 4.14.0 until they are fixed
-if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ];then
+if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then
# bug number: LU-12661
ALWAYS_EXCEPT+=" 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"
+fi
-# 5 12 (min)"
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
+# 5 12 8 12 (min)"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 135 136 300o"
if [ "$mds1_FSTYPE" = "zfs" ]; then
# bug number for skipped test:
[ $MDS1_VERSION -le $(version_code 2.3.55) ] &&
TESTS="4094 4095"
- # skip long symlink name for rhel6.5.
- # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
- grep -q '6.5' /etc/redhat-release &>/dev/null &&
- TESTS="59 60 61 4062 4063"
-
for i in $TESTS; do
local SYMNAME=$(str_repeat 'x' $i)
ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
run_test 27I "check that root dir striping does not break parent dir one"
test_27J() {
- [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.51) ]] &&
+ [[ $MDS1_VERSION -le $(version_code 2.12.51) ]] &&
skip "Need MDS version newer than 2.12.51"
test_mkdir $DIR/$tdir
run_test 27J "basic ops on file with foreign LOV"
test_27K() {
- [[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.12.49) ]] &&
+ [[ $MDS1_VERSION -le $(version_code 2.12.49) ]] &&
skip "Need MDS version newer than 2.12.49"
test_mkdir $DIR/$tdir
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_65n() {
[ -n "$FILESET" ] && skip "Not functional for FILESET set"
- [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.12.50) ]] ||
+ [[ $MDS1_VERSION -ge $(version_code 2.12.50) ]] ||
skip "Need MDS version at least 2.12.50"
[[ $PARALLEL != "yes" ]] || skip "skip parallel run"
local dir3=$MOUNT/$tdir-3
mkdir $dir3 || error "mkdir $dir3 failed"
- ! getfattr -n trusted.lov $dir3 &> /dev/null ||
- error "$dir3 shouldn't have LOV EA"
+ # $dir3 shouldn't have LOV EA, but "lfs getstripe -d $dir3" should show
+ # the root layout, which is the actual default layout that will be used
+ # when new files are created in $dir3.
+ local dir3_layout=$(get_layout_param $dir3)
+ local root_dir_layout=$(get_layout_param $MOUNT)
+ [[ "$dir3_layout" = "$root_dir_layout" ]] ||
+ error "$dir3 should show the default layout from $MOUNT"
# set OST pool on root directory
local pool=$TESTNAME
local dir4=$MOUNT/$tdir-4
mkdir $dir4 || error "mkdir $dir4 failed"
- ! getfattr -n trusted.lov $dir4 &> /dev/null ||
- error "$dir4 shouldn't have LOV EA"
+ local dir4_layout=$(get_layout_param $dir4)
+ root_dir_layout=$(get_layout_param $MOUNT)
+ echo "$LFS getstripe -d $dir4"
+ $LFS getstripe -d $dir4
+ echo "$LFS getstripe -d $MOUNT"
+ $LFS getstripe -d $MOUNT
+ [[ "$dir4_layout" = "$root_dir_layout" ]] ||
+ error "$dir4 should show the default layout from $MOUNT"
# new file created in $dir4 should inherit the pool from
# the filesystem default
local dir5=$dir4/$tdir-5
mkdir $dir5 || error "mkdir $dir5 failed"
- local dir4_layout=$(get_layout_param $dir4)
+ dir4_layout=$(get_layout_param $dir4)
local dir5_layout=$(get_layout_param $dir5)
[[ "$dir4_layout" = "$dir5_layout" ]] ||
error "$dir5 should inherit the default layout from $dir4"
}
run_test 101c "check stripe_size aligned read-ahead ================="
-set_read_ahead() {
- $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
- $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
-}
-
test_101d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
cancel_lru_locks osc
echo Disable read-ahead
- local old_READAHEAD=$(set_read_ahead 0)
+ local old_RA=$($LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1)
+ $LCTL set_param -n llite.*.max_read_ahead_mb=0
+ stack_trap "$LCTL set_param -n llite.*.max_read_ahead_mb $old_RA" EXIT
+ $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")
echo Cancel LRU locks on lustre client to flush the client cache
cancel_lru_locks osc
echo Enable read-ahead with ${ra_MB}MB
- set_read_ahead $ra_MB
+ $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")
echo "read-ahead disabled time read $raOFF"
echo "read-ahead enabled time read $raON"
- set_read_ahead $old_READAHEAD
rm -f $file
wait_delete_completed
}
run_test 123b "not panic with network error in statahead enqueue (bug 15027)"
+test_123c() {
+ [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
+
+ test_mkdir -i 0 -c 1 $DIR/$tdir.0
+ test_mkdir -i 1 -c 1 $DIR/$tdir.1
+ touch $DIR/$tdir.1/{1..3}
+ mv $DIR/$tdir.1/{1..3} $DIR/$tdir.0
+
+ remount_client $MOUNT
+
+ $MULTIOP $DIR/$tdir.0 Q
+
+ # let statahead to complete
+ ls -l $DIR/$tdir.0 > /dev/null
+
+ testid=$(echo $TESTNAME | tr '_' ' ')
+ dmesg | tac | sed "/$testid/,$ d" | grep "Can not initialize inode" &&
+ error "statahead warning" || true
+}
+run_test 123c "Can not initialize inode warning on DNE statahead"
+
test_124a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
$LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
remote_mds_nodsh && skip "remote MDS with nodsh"
remote_ost_nodsh && skip "remote OST with nodsh"
- # eventually, this can also be replaced with "lctl get_param -R",
- # but not until that option is always available on the server
local facet
for facet in mds1 ost1; do
- [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
- skip_noexit "Too old lustre on $facet"
- local facet_proc_dirs=$(do_facet $facet \
- \\\ls -d $proc_regexp 2>/dev/null)
- echo "${facet}_proc_dirs='$facet_proc_dirs'"
- [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
- do_facet $facet find $facet_proc_dirs \
- ! -name req_history \
- -exec cat '{}' \\\; &> /dev/null
-
- do_facet $facet find $facet_proc_dirs \
- ! -name req_history \
- -type f \
- -exec cat '{}' \\\; &> /dev/null ||
- error "proc file read failed"
-
- do_facet $facet find $facet_proc_dirs \
- -ignore_readdir_race \
- -type f \
- -not -name force_lbug \
- -not -name changelog_mask \
- -exec badarea_io '{}' \\\; ||
- error_133 "$facet find $facet_proc_dirs failed"
+ local facet_ver=$(lustre_version_code $facet)
+ if [ $facet_ver -ge $(version_code 2.7.65) ]; then
+ do_facet $facet "$LCTL get_param -R '*'" &> /dev/null
+ else
+ log "$facet: too old lustre for get_param -R"
+ 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' |
+ xargs badarea_io" ||
+ error_133 "$facet badarea_io failed"
+ else
+ skip_noexit "$facet: too old lustre for get_param -R"
+ fi
done
# remount the FS in case writes/reads /proc break the FS
}
run_test 134b "Server rejects lock request when reaching lock_limit_mb"
+test_135() {
+ remote_mds_nodsh && skip "remote MDS with nodsh"
+ [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
+ skip "Need MDS version at least 2.13.50"
+ local fname
+
+ mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+
+#define OBD_FAIL_PLAIN_RECORDS 0x1319
+ #set only one record at plain llog
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1319 fail_val=1
+
+ #fill already existed plain llog each 64767
+ #wrapping whole catalog
+ createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
+
+ createmany -o $DIR/$tdir/$tfile_ 64700
+ for (( i = 0; i < 64700; i = i + 2 ))
+ do
+ rm $DIR/$tdir/$tfile_$i &
+ rm $DIR/$tdir/$tfile_$((i + 1)) &
+ local pid=$!
+ wait $pid
+ done
+
+ #waiting osp synchronization
+ wait_delete_completed
+}
+run_test 135 "Race catalog processing"
+
+test_136() {
+ remote_mds_nodsh && skip "remote MDS with nodsh"
+ [[ $MDS1_VERSION -lt $(version_code 2.13.50) ]] &&
+ skip "Need MDS version at least 2.13.50"
+ local fname
+
+ mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+ $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
+
+ #fill already existed 2 plain llogs each 64767
+ #wrapping whole catalog
+ createmany -o -u $DIR/$tdir/$tfile- $((64767 * 1))
+ createmany -o -u $DIR/$tdir/$tfile- $((64767 * 3 / 2))
+ wait_delete_completed
+
+ createmany -o $DIR/$tdir/$tfile_ 10
+ sleep 25
+
+ do_facet $SINGLEMDS $LCTL set_param fail_val=3
+ for (( i = 0; i < 10; i = i + 3 ))
+ do
+ rm $DIR/$tdir/$tfile_$i &
+ rm $DIR/$tdir/$tfile_$((i + 1)) &
+ local pid=$!
+ wait $pid
+ sleep 7
+ rm $DIR/$tdir/$tfile_$((i + 2)) &
+ done
+
+ #waiting osp synchronization
+ wait_delete_completed
+}
+run_test 136 "Race catalog processing 2"
+
test_140() { #bug-17379
[ $PARALLEL == "yes" ] && skip "skip parallel run"
# generate some changelog records to accumulate on each MDT
test_mkdir -c $MDSCOUNT $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"
# check changelogs have been generated
+ local start=$SECONDS
+ local idle_time=$((MDSCOUNT * 5 + 5))
local nbcl=$(changelog_dump | wc -l)
[[ $nbcl -eq 0 ]] && error "no changelogs found"
- for param in "changelog_max_idle_time=10" \
+ for param in "changelog_max_idle_time=$idle_time" \
"changelog_gc=1" \
"changelog_min_gc_interval=2" \
"changelog_min_free_cat_entries=3"; do
do_nodes $mdts $LCTL set_param mdd.*.$param
done
- # force cl_user2 to be idle (1st part)
- sleep 9
+ # force cl_user2 to be idle (1st part), but also cancel the
+ # cl_user1 records so that it is not evicted later in the test.
+ local sleep1=$((idle_time / 2))
+ echo "$(date +%s): sleep1 $sleep1/${idle_time}s"
+ sleep $sleep1
# simulate changelog catalog almost full
#define OBD_FAIL_CAT_FREE_RECORDS 0x1313
"$user_rec1, but is $user_rec2"
done
- # force cl_user2 to be idle (2nd part) and to reach
- # changelog_max_idle_time
- sleep 2
+ # force cl_user2 idle (2nd part) to just exceed changelog_max_idle_time
+ local sleep2=$((idle_time - (SECONDS - start) + 1))
+ echo "$(date +%s): sleep2 $sleep2/${idle_time}s"
+ sleep $sleep2
- # generate one more changelog to trigger fail_loc
- createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) ||
- error "create $DIR/$tdir/${tfile}bis failed"
+ # Generate one more changelog to trigger GC at fail_loc for cl_user2.
+ # cl_user1 should be OK because it recently processed records.
+ echo "$(date +%s): creating $((MDSCOUNT * 2)) files"
+ createmany -m $DIR/$tdir/${tfile}b $((MDSCOUNT * 2)) ||
+ error "create $DIR/$tdir/${tfile}b failed"
# ensure gc thread is done
for i in $(mdts_nodes); do
skip "Need MDS version at least 2.12.56"
mount_client $MOUNT2 || error "mount_client on $MOUNT2 failed"
+ stack_trap "umount $MOUNT2" EXIT
changelog_register || error "first changelog_register failed"
+ stack_trap "changelog_deregister" EXIT
# generate some changelog
test_mkdir -c $MDSCOUNT $DIR/$tdir || error "mkdir $tdir failed"
# open the changelog device
exec 3>/dev/changelog-$FSNAME-MDT0000
+ stack_trap "exec 3>&-" EXIT
exec 4</dev/changelog-$FSNAME-MDT0000
+ stack_trap "exec 4<&-" EXIT
# umount the first lustre mount
umount $MOUNT
+ stack_trap "mount_client $MOUNT" EXIT
# read changelog
cat <&4 >/dev/null || error "read changelog failed"
printf 'clear:'$cl_user':0' >&3
- # close
- exec 3>&-
- exec 4<&-
-
- # cleanup
- changelog_deregister || error "changelog_deregister failed"
-
- umount $MOUNT2
- mount_client $MOUNT || error "mount_client on $MOUNT failed"
}
run_test 160j "client can be umounted while its chanangelog is being used"
"$FSNAME.sys.jobid_var" $new_jobenv
}
-test_205() { # Job stats
+test_205a() { # Job stats
[ $PARALLEL == "yes" ] && skip "skip parallel run"
[[ $MDS1_VERSION -ge $(version_code 2.7.1) ]] ||
skip "Need MDS version with at least 2.7.1"
verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
}
-run_test 205 "Verify job stats"
+run_test 205a "Verify job stats"
+
+# LU-13117
+test_205b() {
+ $LCTL set_param jobid_var=USER jobid_name="%e.%u"
+ env -i USERTESTJOBSTATS=foolish touch $DIR/$tfile.1
+ do_facet $SINGLEMDS $LCTL get_param mdt.*.job_stats |
+ grep job_id: | grep foolish &&
+ error "Unexpected jobid found"
+ true
+}
+run_test 205b "Verify job stats jobid parsing"
# LU-1480, LU-1773 and LU-1657
test_206() {
save_writethrough $p
set_cache writethrough on
- local pages_per_rpc=$($LCTL get_param \
- osc.*.max_pages_per_rpc)
+ local pages_per_rpc=$($LCTL get_param osc.*.max_pages_per_rpc)
local at_max=$($LCTL get_param -n at_max)
local timeout=$($LCTL get_param -n timeout)
local test_at="at_max"
error "md5sum differ: $old_md5, $new_md5"
[ $($LFS getstripe -c $dom) -eq 2 ] ||
- error "migrate stripe count bad: $(LFS getstripe -c $dom) != 2"
+ error "bad final stripe count: $($LFS getstripe -c $dom) != 2"
}
run_test 272a "DoM migration: new layout with the same DOM component"
run_test 300q "create remote directory under orphan directory"
test_300r() {
- [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ [ $MDS1_VERSION -lt $(version_code 2.7.55) ] &&
skip "Need MDS version at least 2.7.55" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
}
run_test 319 "lost lease lock on migrate error"
+test_398a() { # LU-4198
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile
+ $LCTL set_param ldlm.namespaces.*.lru_size=clear
+
+ # 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 oflag=direct conv=notrunc
+ local lock_count=$($LCTL get_param -n \
+ ldlm.namespaces.*-OST0000-osc-ffff*.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
+ lock_count=$($LCTL get_param -n \
+ ldlm.namespaces.*-OST0000-osc-ffff*.lru_size)
+ [[ $lock_count -eq 0 ]] || error "no lock should be held by direct IO"
+}
+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
+
+ local size=12
+ 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
+
+ rm -rf $DIR/$tfile
+}
+run_test 398b "DIO and buffer IO race"
+
+test_398c() { # LU-4198
+ which fio || skip_env "no fio installed"
+
+ saved_debug=$($LCTL get_param -n debug)
+ $LCTL set_param debug=0
+
+ local size=$(lctl get_param -n osc.$FSNAME-OST0000*.kbytesavail | head -1)
+ ((size /= 1024)) # by megabytes
+ ((size /= 2)) # write half of the OST at most
+ [ $size -gt 40 ] && size=40 #reduce test time anyway
+
+ $LFS setstripe -c 1 $DIR/$tfile
+
+ # it seems like ldiskfs reserves more space than necessary if the
+ # writing blocks are not mapped, so it extends the file firstly
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=$size && sync
+ cancel_lru_locks osc
+
+ # clear and verify rpc_stats later
+ $LCTL set_param osc.${FSNAME}-OST0000-osc-ffff*.rpc_stats=clear
+
+ local njobs=4
+ echo "writing ${size}M to OST0 by fio with $njobs jobs..."
+ fio --name=rand-write --rw=randwrite --bs=$PAGE_SIZE --direct=1 \
+ --numjobs=$njobs --fallocate=none --ioengine=libaio \
+ --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+ --filename=$DIR/$tfile
+ [ $? -eq 0 ] || error "fio write error"
+
+ [ $($LCTL get_param -n \
+ ldlm.namespaces.${FSNAME}-OST0000-osc-ffff*.lock_count) -eq 0 ] ||
+ error "Locks were requested while doing AIO"
+
+ # get the percentage of 1-page I/O
+ pct=$($LCTL get_param osc.${FSNAME}-OST0000-osc-ffff*.rpc_stats |
+ grep -A 1 'pages per rpc' | grep -v 'pages per rpc' |
+ awk '{print $7}')
+ [ $pct -le 50 ] || error "$pct% of I/O are 1-page"
+
+ echo "mix 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 --ioengine=libaio \
+ --iodepth=16 --allow_file_create=0 --size=$((size/njobs))M \
+ --filename=$DIR/$tfile
+ [ $? -eq 0 ] || error "fio mixed read write error"
+
+ rm -rf $DIR/$tfile
+ $LCTL set_param debug="$saved_debug"
+}
+run_test 398c "run fio to test AIO"
+
test_fake_rw() {
local read_write=$1
if [ "$read_write" = "write" ]; then
test_412() {
[ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs"
- if [ $(lustre_version_code mds1) -lt $(version_code 2.10.55) ]; then
+ if [ $MDS1_VERSION -lt $(version_code 2.10.55) ]; then
skip "Need server version at least 2.10.55"
fi
test_415() {
[ $PARALLEL == "yes" ] && skip "skip parallel run"
- [ $(lustre_version_code mds1) -lt $(version_code 2.11.52) ] &&
+ [ $MDS1_VERSION -lt $(version_code 2.11.52) ] &&
skip "Need server version at least 2.11.52"
# LU-11102
run_test 415 "lock revoke is not missing"
test_416() {
- [ $(lustre_version_code mds1) -lt $(version_code 2.11.55) ] &&
+ [ $MDS1_VERSION -lt $(version_code 2.11.55) ] &&
skip "Need server version at least 2.11.55"
# define OBD_FAIL_OSD_TXN_START 0x19a
}
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() {
- [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+ [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
skip "Need server version at least 2.9.55"
test_802a() {
[[ $mds1_FSTYPE = zfs ]] || skip "ZFS specific test"
- [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+ [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&
skip "Need server version at least 2.9.55"
run_test 810 "partial page writes on ZFS (LU-11663)"
test_811() {
- [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+ [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
skip "Need MDS version at least 2.11.56"
#define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
stop mds1
start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
- sleep 5
- [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
+ 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"
}
run_test 819b "too big niobuf in write"
+
+function test_820_start_ost() {
+ sleep 5
+
+ for num in $(seq $OSTCOUNT); do
+ start ost$num $(ostdevname $num) $OST_MOUNT_OPTS
+ done
+}
+
+test_820() {
+ [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
+
+ mkdir $DIR/$tdir
+ umount_client $MOUNT || error "umount failed"
+ for num in $(seq $OSTCOUNT); do
+ stop ost$num
+ done
+
+ # mount client with no active OSTs
+ # so that the client can't initialize max LOV EA size
+ # from OSC notifications
+ mount_client $MOUNT || error "mount failed"
+ # delay OST starting to keep this 0 max EA size for a while
+ test_820_start_ost &
+
+ # create a directory on MDS2
+ test_mkdir -i 1 -c1 $DIR/$tdir/mds2 ||
+ error "Failed to create directory"
+ # open intent should update default EA size
+ # see mdc_update_max_ea_from_body()
+ # notice this is the very first RPC to MDS2
+ cp /etc/services $DIR/$tdir/mds2 ||
+ error "Failed to copy files to mds$n"
+}
+run_test 820 "update max EA from open intent"
+
#
# tests that do cleanup/setup should be run at the end
#