# bug number for skipped tests: LU-2036
ALWAYS_EXCEPT=" 76 $ALWAYS_EXCEPT"
+is_sles11() # LU-4341
+{
+ if [ -r /etc/SuSE-release ]
+ then
+ local vers=$(grep VERSION /etc/SuSE-release | awk '{print $3}')
+ local patchlev=$(grep PATCHLEVEL /etc/SuSE-release |
+ awk '{ print $3 }')
+ if [ $vers -eq 11 ] && [ $patchlev -ge 3 ]; then
+ return 0
+ fi
+ fi
+ return 1
+}
+
+if is_sles11; then # LU-4341
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 170"
+fi
+
SRCDIR=$(cd $(dirname $0); echo $PWD)
export PATH=$PATH:/sbin
MEMHOG=${MEMHOG:-memhog}
DIRECTIO=${DIRECTIO:-directio}
ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
-UMOUNT=${UMOUNT:-"umount -d"}
STRIPES_PER_OBJ=-1
CHECK_GRANT=${CHECK_GRANT:-"yes"}
GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
init_logging
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24D 27m 64b 68 71 77f 78 115 124b 230d"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24D 27m 64b 68 71 77f 78 115 124b 300o"
if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
- # bug number for skipped test: LU-1593 LU-4536 LU-5242 LU-1957 LU-2805
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 65ic 132 180 184c"
+ # bug number for skipped test: LU-4536 LU-1957 LU-2805
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180 184c"
[ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba"
fi
echo "done"
}
-check_kernel_version() {
- WANT_VER=$1
- GOT_VER=$(lctl get_param -n version | awk '/kernel:/ {print $2}')
- case $GOT_VER in
- patchless|patchless_client) return 0;;
- *) [ $GOT_VER -ge $WANT_VER ] && return 0 ;;
- esac
- log "test needs at least kernel version $WANT_VER, running $GOT_VER"
- return 1
-}
-
check_swap_layouts_support()
{
$LCTL get_param -n llite.*.sbi_flags | grep -q layout ||
return 1
}
-if [ "$ONLY" == "cleanup" ]; then
- sh llmountcleanup.sh
- exit 0
-fi
-
check_and_setup_lustre
DIR=${DIR:-$MOUNT}
MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid |
awk '{ gsub(/_UUID/,""); print $1 }' | head -n1)
-LOVNAME=$($LCTL get_param -n llite.*.lov.common_name | tail -n 1)
-OSTCOUNT=$($LCTL get_param -n lov.$LOVNAME.numobd)
-STRIPECOUNT=$($LCTL get_param -n lov.$LOVNAME.stripecount)
-STRIPESIZE=$($LCTL get_param -n lov.$LOVNAME.stripesize)
-ORIGFREE=$($LCTL get_param -n lov.$LOVNAME.kbytesavail)
MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
[ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
test_7b() {
if [ ! -d $DIR/$tdir ]; then
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
fi
$MCREATE $DIR/$tdir/$tfile
echo -n foo > $DIR/$tdir/$tfile
mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2
$CHECKSTAT -t file $DIR/$tdir/${tfile}_2 ||
error "$tdir/${tfile_2} not a file after rename"
+ rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename"
}
run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
test_17l() { # LU-279
[[ -z "$(which getfattr 2>/dev/null)" ]] &&
skip "no getfattr command" && return 0
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
touch $DIR/$tdir/$tfile
ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do
test_17m() {
local short_sym="0123456789"
local WDIR=$DIR/${tdir}m
- local mds_index
- local devname
- local cmd
local i
- local rc=0
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- mkdir -p $WDIR
+ test_mkdir -p $WDIR
long_sym=$short_sym
# create a long symlink file
for ((i = 0; i < 4; ++i)); do
echo "recreate the 512 symlink files with a shorter string"
for ((i = 0; i < 512; ++i)); do
# rewrite the symlink file with a shorter string
- ln -sf ${long_sym} $WDIR/long-$i
- ln -sf ${short_sym} $WDIR/short-$i
+ ln -sf ${long_sym} $WDIR/long-$i || error "long_sym failed"
+ ln -sf ${short_sym} $WDIR/short-$i || error "short_sym failed"
done
- mds_index=$($LFS getstripe -M $WDIR)
- mds_index=$((mds_index+1))
- devname=$(mdsdevname $mds_index)
- cmd="$E2FSCK -fnvd $devname"
+ local mds_index=$(($($LFS getstripe -M $WDIR) + 1))
+ local devname=$(mdsdevname $mds_index)
- echo "stop and checking mds${mds_index}: $cmd"
+ echo "stop and checking mds${mds_index}:"
# e2fsck should not return error
stop mds${mds_index}
- do_facet mds${mds_index} $cmd || rc=$?
+ run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
+ rc=$?
start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed"
df $MOUNT > /dev/null 2>&1
- [ $rc -ne 0 ] && error "e2fsck should not report error upon "\
- "short/long symlink MDT: rc=$rc"
- return $rc
+ [ $rc -eq 0 ] ||
+ error "e2fsck detected error for short/long symlink: rc=$rc"
}
run_test 17m "run e2fsck against MDT which contains short/long symlink"
check_fs_consistency_17n() {
local mdt_index
- local devname
- local cmd
local rc=0
# 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 $(seq 1 2); do
- devname=$(mdsdevname $mdt_index)
- cmd="$E2FSCK -fnvd $devname"
-
- echo "stop and checking mds${mdt_index}: $cmd"
+ for mdt_index in 1 2; do
+ local devname=$(mdsdevname $mdt_index)
# e2fsck should not return error
stop mds${mdt_index}
- do_facet mds${mdt_index} $cmd || rc=$?
+ run_e2fsck $(facet_active_host mds$mdt_index) $devname -n ||
+ rc=$((rc + $?))
start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
- error "mount mds${mdt_index} failed"
+ error "mount mds$mdt_index failed"
df $MOUNT > /dev/null 2>&1
- [ $rc -ne 0 ] && break
done
return $rc
}
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
for ((i=0; i<10; i++)); do
$LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
error "create remote dir error $i"
check_fs_consistency_17n ||
error "e2fsck report error after create files under remote dir"
- for ((i=0;i<10;i++)); do
+ for ((i = 0; i < 10; i++)); do
rm -rf $DIR/$tdir/remote_dir_${i} ||
error "destroy remote dir error $i"
done
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] &&
skip "lustre < 2.4.50 does not support migrate mv " && return
- for ((i=0; i<10; i++)); do
+ for ((i = 0; i < 10; i++)); do
mkdir -p $DIR/$tdir/remote_dir_${i}
createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
error "create files under remote dir failed $i"
- $LFS mv -M 1 $DIR/$tdir/remote_dir_${i} ||
+ $LFS migrate --mdt-index 1 $DIR/$tdir/remote_dir_${i} ||
error "migrate remote dir error $i"
done
check_fs_consistency_17n || error "e2fsck report error after migration"
- for ((i=0;i<10;i++)); do
+ for ((i = 0; i < 10; i++)); do
rm -rf $DIR/$tdir/remote_dir_${i} ||
error "destroy remote dir error $i"
done
local WDIR=$DIR/${tdir}o
local mdt_index
- local mdtdevname
local rc=0
- mkdir -p $WDIR
+ test_mkdir -p $WDIR
mdt_index=$($LFS getstripe -M $WDIR)
mdt_index=$((mdt_index+1))
- mdtdevname=$(mdsdevname $mdt_index)
touch $WDIR/$tfile
- stop mds${mdt_index}
- start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS ||
- error "mount mds${mdt_index} failed"
+
+ #fail mds will wait the failover finish then set
+ #following fail_loc to avoid interfer the recovery process.
+ fail mds${mdt_index}
#define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
do_facet mds${mdt_index} lctl set_param fail_loc=0x194
run_test 24n "Statting the old file after renaming (Posix rename 2)"
test_24o() {
- check_kernel_version 37 || return 0
test_mkdir -p $DIR/d24o
rename_many -s random -v -n 10 $DIR/d24o
}
# Performance issue on ZFS see LU-4072 (c.f. LU-2887)
[ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NRFILES
cancel_lru_locks mdc
test_24x() {
[[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
+
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] &&
+ skip "Need MDS version at least 2.7.56" && return
+
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
- mkdir -p $DIR/$tdir/src_dir
+ test_mkdir -p $DIR/$tdir/src_dir
touch $DIR/$tdir/src_file
- mkdir -p $remote_dir/tgt_dir
+ test_mkdir -p $remote_dir/tgt_dir
touch $remote_dir/tgt_file
- mrename $remote_dir $DIR/ &&
- error "rename dir cross MDT works!"
-
- mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
- error "rename dir cross MDT works!"
+ mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
+ error "rename dir cross MDT failed!"
- mrename $DIR/$tdir/src_file $remote_dir/tgt_file &&
- error "rename file cross MDT works!"
+ mrename $DIR/$tdir/src_file $remote_dir/tgt_file ||
+ error "rename file cross MDT failed!"
- ln $DIR/$tdir/src_file $remote_dir/tgt_file1 &&
- error "ln file cross MDT should not work!"
+ touch $DIR/$tdir/ln_file
+ ln $DIR/$tdir/ln_file $remote_dir/ln_name ||
+ error "ln file cross MDT failed"
rm -rf $DIR/$tdir || error "Can not delete directories"
}
-run_test 24x "cross rename/link should be failed"
+run_test 24x "cross MDT rename/link"
test_24y() {
[[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
- mkdir -p $remote_dir/src_dir
+ test_mkdir -p $remote_dir/src_dir
touch $remote_dir/src_file
- mkdir -p $remote_dir/tgt_dir
+ test_mkdir -p $remote_dir/tgt_dir
touch $remote_dir/tgt_file
mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
}
run_test 24y "rename/link on the same dir should succeed"
-test_24z() {
- [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local MDTIDX=1
- local remote_src=$DIR/$tdir/remote_dir
- local remote_tgt=$DIR/$tdir/remote_tgt
-
- mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_src ||
- error "create remote directory failed"
-
- $LFS mkdir -i $MDTIDX $remote_tgt ||
- error "create remote directory failed"
-
- mrename $remote_src $remote_tgt &&
- error "rename remote dirs should not work!"
-
- # If target dir does not exists, it should succeed
- rm -rf $remote_tgt
- mrename $remote_src $remote_tgt ||
- error "rename remote dirs(tgt dir does not exists) failed!"
-
- rm -rf $DIR/$tdir || error "Can not delete directories"
-}
-run_test 24z "rename one remote dir to another remote dir should fail"
-
test_24A() { # LU-3182
local NFILES=5000
rm -rf $DIR/$tdir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NFILES
local t=$(ls $DIR/$tdir | wc -l)
local u=$(ls $DIR/$tdir | sort -u | wc -l)
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local count
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
error "create striped dir failed"
}
run_test 24D "readdir() returns correct number of entries after cursor reload"
+test_24E() {
+ [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+
+ mkdir -p $DIR/$tdir
+ mkdir $DIR/$tdir/src_dir
+ $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child ||
+ error "create remote source failed"
+
+ touch $DIR/$tdir/src_dir/src_child/a
+
+ $LFS mkdir -i 2 $DIR/$tdir/tgt_dir ||
+ error "create remote target dir failed"
+
+ $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child ||
+ error "create remote target child failed"
+
+ mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child ||
+ error "rename dir cross MDT failed!"
+
+ find $DIR/$tdir
+
+ $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child &&
+ error "src_child still exists after rename"
+
+ $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a ||
+ error "missing file(a) after rename"
+
+ rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24E "cross MDT rename/link"
+
test_25a() {
echo '== symlink sanity ============================================='
run_test 27d "create file with default settings ================"
test_27e() {
+ # LU-5839 adds check for existed layout before setting it
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.56) ]] &&
+ skip "Need MDS version at least 2.7.56" && return
test_mkdir -p $DIR/d27
$SETSTRIPE -c 2 $DIR/d27/f12 || error "setstripe failed"
$SETSTRIPE -c 2 $DIR/d27/f12 && error "setstripe succeeded twice"
run_test 27g "$GETSTRIPE with no objects"
test_27i() {
- touch $DIR/d27/fsome || error "touch failed"
- [[ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ]] || error "missing objects"
+ test_mkdir $DIR/$tdir
+ touch $DIR/$tdir/$tfile || error "touch failed"
+ [[ $($GETSTRIPE -c $DIR/$tdir/$tfile) -gt 0 ]] ||
+ error "missing objects"
}
run_test 27i "$GETSTRIPE with some objects"
test_27m() {
[[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" &&
return
+
+ ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
+ head -n1)
if [[ $ORIGFREE -gt $MAXFREE ]]; then
skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
return
done
OSTIDX=$(index_from_ostuuid $OST)
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file
for OSC in $MDS_OSCS; do
log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
seq=$(echo $seq | sed -e "s/^0x//g")
- if [ $seq == 0 ]; then
+ if [ $seq == 0 ] || [ $(facet_fstype ost$ost) == zfs ]; then
oid_hex=$(echo $oid)
else
oid_hex=$(echo $hex | sed -e "s/^0x//g")
$(facet_mntpt ost$ost)/$obj_file)
unmount_fstype ost$ost
start ost$ost $dev $OST_MOUNT_OPTS
+ clients_up
fi
[ -z "$ff" ] && error "$obj_file: no filter_fid info"
local ost_list=$(seq $first_ost $ost_step $last_ost)
local ost_range="$first_ost $last_ost $ost_step"
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
pool_add $POOL || error "pool_add failed"
pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT ||
}
run_test 27D "validate llapi_layout API"
+# Verify that default_easize is increased from its initial value after
+# accessing a widely striped file.
+test_27E() {
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ # 72 bytes is the minimum space required to store striping
+ # information for a file striped across one OST:
+ # (sizeof(struct lov_user_md_v3) +
+ # sizeof(struct lov_user_ost_data_v1))
+ local min_easize=72
+ $LCTL set_param -n llite.*.default_easize $min_easize ||
+ error "lctl set_param failed"
+ local easize=$($LCTL get_param -n llite.*.default_easize)
+
+ [ $easize -eq $min_easize ] ||
+ error "failed to set default_easize"
+
+ $LFS setstripe -c $OSTCOUNT $DIR/$tfile ||
+ error "setstripe failed"
+ cat $DIR/$tfile
+ rm $DIR/$tfile
+
+ easize=$($LCTL get_param -n llite.*.default_easize)
+
+ [ $easize -gt $min_easize ] ||
+ error "default_easize not updated"
+}
+run_test 27E "check that default extended attribute size properly increases"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
run_test 31d "remove of open directory ========================="
test_31e() { # bug 2904
- check_kernel_version 34 || return 0
openfilleddirunlink $DIR/d31e || error
}
run_test 31e "remove of open non-empty directory ==============="
}
test_31o() { # LU-2901
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
for LOOP in $(seq 100); do
rm -f $DIR/$tdir/$tfile*
for THREAD in $(seq 8); do
test_31p() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
$LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir
cleanup_test32_mount() {
trap 0
- $UMOUNT -d $DIR/$tdir/ext2-mountpoint
+ $UMOUNT $DIR/$tdir/ext2-mountpoint
}
test_32a() {
cleanup_testdir_mount() {
trap 0
- $UMOUNT -d $DIR/$tdir
+ $UMOUNT $DIR/$tdir
}
test_32q() {
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- mkdir -p $DIR/$tdir
+ test_mkdir -p $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
error "create" || true
$RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $remote_dir/f33 &&
error "open RDWR" || true
- $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 &&
- error "create" || true
+ $RUNAS $OPENFILE -f 1286739555 $remote_dir/f33 || true
}
run_test 33d "openfile with 444 modes and malformed flags under remote dir"
}
run_test 33e "mkdir and striped directory should have same mode"
+cleanup_33f() {
+ trap 0
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0
+}
+
+test_33f() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ chmod go+rwx $DIR/$tdir
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1
+ trap cleanup_33f EXIT
+
+ $RUNAS lfs mkdir -c$MDSCOUNT $DIR/$tdir/striped_dir ||
+ error "cannot create striped directory"
+
+ $RUNAS touch $DIR/$tdir/striped_dir/{0..16} ||
+ error "cannot create files in striped directory"
+
+ $RUNAS rm $DIR/$tdir/striped_dir/{0..16} ||
+ error "cannot remove files in striped directory"
+
+ $RUNAS rmdir $DIR/$tdir/striped_dir ||
+ error "cannot remove striped directory"
+
+ cleanup_33f
+}
+run_test 33f "nonroot user can create, access, and remove a striped directory"
+
TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
test_34a() {
rm -f $DIR/f34
test_36i() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
- mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
test_39o() {
TESTDIR=$DIR/$tdir/$tfile
[ -e $TESTDIR ] && rm -rf $TESTDIR
- test_mkdir -p $TESTDIR
+ mkdir -p $TESTDIR
cd $TESTDIR
links1=2
ls
local MDTIDX=1
TESTDIR=$DIR/$tdir/$tfile
[ -e $TESTDIR ] && rm -rf $TESTDIR
- mkdir -p $TESTDIR
+ test_mkdir -p $TESTDIR
cd $TESTDIR
links1=2
ls
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.63) ] &&
skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly" &&
return
- check_kernel_version 34 || return 0
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
cd $DIR/$tdir
- mv $DIR/$tdir $DIR/d48.new || error "move directory failed"
+ mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
test_mkdir $DIR/$tdir || error "recreate directory failed"
touch foo || error "'touch foo' failed after recreating cwd"
- test_mkdir $DIR/$tdir/bar ||
- error "'mkdir foo' failed after recreating cwd"
- if check_kernel_version 44; then
- touch .foo || error "'touch .foo' failed after recreating cwd"
- test_mkdir $DIR/$tdir/.bar ||
- error "'mkdir .foo' failed after recreating cwd"
- fi
+ test_mkdir bar || error "'mkdir foo' failed after recreating cwd"
+ touch .foo || error "'touch .foo' failed after recreating cwd"
+ test_mkdir .bar || error "'mkdir .foo' failed after recreating cwd"
ls . > /dev/null || error "'ls .' failed after recreating cwd"
ls .. > /dev/null || error "'ls ..' failed after removing cwd"
cd . || error "'cd .' failed after recreating cwd"
run_test 48a "Access renamed working dir (should return errors)="
test_48b() { # bug 2399
- check_kernel_version 34 || return 0
rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
cd $DIR/$tdir
rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
touch foo && error "'touch foo' worked after removing cwd"
- test_mkdir $DIR/$tdir/foo &&
- error "'mkdir foo' worked after removing cwd"
- if check_kernel_version 44; then
- touch .foo && error "'touch .foo' worked after removing cwd"
- test_mkdir $DIR/$tdir/.foo &&
- error "'mkdir .foo' worked after removing cwd"
- fi
+ test_mkdir foo && error "'mkdir foo' worked after removing cwd"
+ touch .foo && error "'touch .foo' worked after removing cwd"
+ test_mkdir .foo && error "'mkdir .foo' worked after removing cwd"
ls . > /dev/null && error "'ls .' worked after removing cwd"
ls .. > /dev/null || error "'ls ..' failed after removing cwd"
is_patchless || ( cd . && error "'cd .' worked after removing cwd" )
- test_mkdir $DIR/$tdir/. && error "'mkdir .' worked after removing cwd"
+ test_mkdir . && error "'mkdir .' worked after removing cwd"
rmdir . && error "'rmdir .' worked after removing cwd"
ln -s . foo && error "'ln -s .' worked after removing cwd"
cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
run_test 48b "Access removed working dir (should return errors)="
test_48c() { # bug 2350
- check_kernel_version 36 || return 0
#lctl set_param debug=-1
#set -vx
rm -rf $DIR/$tdir
$TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
$TRACE touch foo && error "touch foo worked after removing cwd"
$TRACE test_mkdir foo && error "'mkdir foo' worked after removing cwd"
- if check_kernel_version 44; then
- touch .foo && error "touch .foo worked after removing cwd"
- test_mkdir .foo && error "mkdir .foo worked after removing cwd"
- fi
+ touch .foo && error "touch .foo worked after removing cwd"
+ test_mkdir .foo && error "mkdir .foo worked after removing cwd"
$TRACE ls . && error "'ls .' worked after removing cwd"
$TRACE ls .. || error "'ls ..' failed after removing cwd"
is_patchless || ( $TRACE cd . &&
run_test 48c "Access removed working subdir (should return errors)"
test_48d() { # bug 2350
- check_kernel_version 36 || return 0
#lctl set_param debug=-1
#set -vx
rm -rf $DIR/$tdir
$TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed"
$TRACE touch foo && error "'touch foo' worked after removing parent"
$TRACE test_mkdir foo && error "mkdir foo worked after removing parent"
- if check_kernel_version 44; then
- touch .foo && error "'touch .foo' worked after removing parent"
- test_mkdir .foo &&
- error "mkdir .foo worked after removing parent"
- fi
+ touch .foo && error "'touch .foo' worked after removing parent"
+ test_mkdir .foo && error "mkdir .foo worked after removing parent"
$TRACE ls . && error "'ls .' worked after removing parent"
$TRACE ls .. && error "'ls ..' worked after removing parent"
is_patchless || ( $TRACE cd . &&
run_test 48d "Access removed parent subdir (should return errors)"
test_48e() { # bug 4134
- check_kernel_version 41 || return 0
#lctl set_param debug=-1
#set -vx
rm -rf $DIR/$tdir
loopdev="$DIR/loop54c"
trap 0
- $UMOUNT -d $DIR/$tdir || rc=$?
+ $UMOUNT $DIR/$tdir || rc=$?
losetup -d $loopdev || true
losetup -d $LOOPDEV || true
rm -rf $loopdev $DIR/$tfile $DIR/$tdir
run_test 54d "fifo device works in lustre ======================"
test_54e() {
- check_kernel_version 46 || return 0
f="$DIR/f54e"
string="aaaaaa"
cp -aL /dev/console $f
local file_size=$((stripe_size * OSTCOUNT))
local file_num=$((NUMDIRS * NUMFILES + NUMFILES))
local required_space=$((file_num * file_size))
- local free_space=$($LCTL get_param -n lov.$LOVNAME.kbytesavail)
+
+ local free_space=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
+ head -n1)
[[ $free_space -le $((required_space / 1024)) ]] &&
skip_env "need at least $required_space bytes free space," \
"have $free_space kbytes" && return
skip_env "need 2 OST, skipping test" && return
local dir0=$DIR/$tdir/$testnum
- mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p $dir0 || error "creating dir $dir0"
local ref1=/etc/passwd
local file1=$dir0/file1
test_56y() {
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
- skip "No HSM support on MDS of $(get_lustre_version)," \
- "need 2.4.53 at least" && return
- local res=""
+ skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" &&
+ return
+ local res=""
local dir0=$DIR/$tdir/$testnum
- mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p $dir0 || error "creating dir $dir0"
local f1=$dir0/file1
local f2=$dir0/file2
error "$LFS find did not return an error"
# Make a directory unsearchable. This should NOT be the last entry in
# directory order. Arbitrarily pick the 6th entry
- chmod 700 $(lfs find $DIR/$tdir -type d | sed '6!d')
+ chmod 700 $($LFS find $DIR/$tdir -type d | sed '6!d')
local count=$($RUNAS $LFS find $DIR/non_existent $DIR/$tdir | wc -l)
# The user should be able to see 10 directories and 9 files
[ $count == 19 ] || error "$LFS find did not continue after error"
}
run_test 56z "lfs find should continue after an error"
+test_56aa() { # LU-5937
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir
+
+ createmany -o $DIR/$tdir/striped_dir/${tfile}- 1024
+ local dirs=$(lfs find --size +8k $DIR/$tdir/)
+
+ [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
+}
+run_test 56aa "lfs find --size under striped dir"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# note test will not do anything if MDS is not local
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
do_facet mgs "! which run-llog.sh &> /dev/null" &&
- skip_env "missing subtest run-llog.sh" && return
+ do_facet mgs "! ls run-llog.sh &> /dev/null" &&
+ skip_env "missing subtest run-llog.sh" && return
+
log "$TEST60_HEAD - from kernel mode"
+ do_facet mgs "$LCTL set_param debug=warning; $LCTL dk > /dev/null"
do_facet mgs sh run-llog.sh
+ do_facet mgs $LCTL dk > $TMP/$tfile
+
+ # LU-6388: test llog_reader
+ local llog_reader=$(do_facet mgs "which llog_reader 2> /dev/null")
+ llog_reader=${llog_reader:-$LUSTRE/utils/llog_reader}
+ [ -z $(do_facet mgs ls -d $llog_reader 2> /dev/null) ] &&
+ skip_env "missing llog_reader" && return
+ local fstype=$(facet_fstype mgs)
+ [ $fstype != ldiskfs -a $fstype != zfs ] &&
+ skip_env "Only for ldiskfs or zfs type mgs" && return
+
+ local mntpt=$(facet_mntpt mgs)
+ local mgsdev=$(mgsdevname 1)
+ local fid_list
+ local fid
+ local rec_list
+ local rec
+ local rec_type
+ local obj_file
+ local path
+ local seq
+ local oid
+ local pass=true
+
+ #get fid and record list
+ fid_list=($(awk '/9_sub.*record/ { print $NF }' /$TMP/$tfile |
+ tail -n 4))
+ rec_list=($(awk '/9_sub.*record/ { print $((NF-3)) }' /$TMP/$tfile |
+ tail -n 4))
+ #remount mgs as ldiskfs or zfs type
+ stop mgs || error "stop mgs failed"
+ mount_fstype mgs || error "remount mgs failed"
+ for ((i = 0; i < ${#fid_list[@]}; i++)); do
+ fid=${fid_list[i]}
+ rec=${rec_list[i]}
+ seq=$(echo $fid | awk -F ':' '{ print $1 }' | sed -e "s/^0x//g")
+ oid=$(echo $fid | awk -F ':' '{ print $2 }' | sed -e "s/^0x//g")
+ oid=$((16#$oid))
+
+ case $fstype in
+ ldiskfs )
+ obj_file=$mntpt/O/$seq/d$((oid%32))/$oid ;;
+ zfs )
+ obj_file=$mntpt/oi.$(($((16#$seq))&127))/$fid ;;
+ esac
+ echo "obj_file is $obj_file"
+ do_facet mgs $llog_reader $obj_file
+
+ rec_type=$(do_facet mgs $llog_reader $obj_file | grep "type=" |
+ awk '{ print $3 }' | sed -e "s/^type=//g")
+ if [ $rec_type != $rec ]; then
+ echo "FAILED test_60a wrong record type $rec_type," \
+ "should be $rec"
+ pass=false
+ break
+ fi
+
+ #check obj path if record type is LLOG_LOGID_MAGIC
+ if [ "$rec" == "1064553b" ]; then
+ path=$(do_facet mgs $llog_reader $obj_file |
+ grep "path=" | awk '{ print $NF }' |
+ sed -e "s/^path=//g")
+ if [ $obj_file != $mntpt/$path ]; then
+ echo "FAILED test_60a wrong obj path" \
+ "$montpt/$path, should be $obj_file"
+ pass=false
+ break
+ fi
+ fi
+ done
+ rm -f $TMP/$tfile
+ #restart mgs before "error", otherwise it will block the next test
+ stop mgs || error "stop mgs failed"
+ start mgs $(mgsdevname) $MGS_MOUNT_OPTS || error "start mgs failed"
+ $pass || error "test failed, see FAILED test_60a messages for specifics"
}
-run_test 60a "llog sanity tests run from kernel module =========="
+run_test 60a "llog_test run from kernel module and test llog_reader =========="
test_60b() { # bug 6411
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
dmesg > $DIR/$tfile
- LLOG_COUNT=`dmesg | awk "/$TEST60_HEAD/{marker = 1; from_marker = 0;}
- /llog.test/ {
- if (marker)
- from_marker++
- from_begin++
- }
- END {
- if (marker)
- print from_marker
- else
- print from_begin
- }"`
- [[ $LLOG_COUNT -gt 50 ]] &&
+ LLOG_COUNT=$(dmesg | awk "/$TEST60_HEAD/ { marker = 1; from_marker = 0; }
+ /llog.test/ {
+ if (marker)
+ from_marker++
+ from_begin++
+ }
+ END {
+ if (marker)
+ print from_marker
+ else
+ print from_begin
+ }")
+ [[ $LLOG_COUNT -gt 100 ]] &&
error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
}
run_test 60b "limit repeated messages from CERROR/CWARN ========"
}
run_test 60d "test printk console message masking"
+test_60e() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ touch $DIR/$tfile
+#define OBD_FAIL_MDS_LLOG_CREATE_FAILED2 0x15b
+ do_facet mds1 lctl set_param fail_loc=0x15b
+ rm $DIR/$tfile
+}
+run_test 60e "no space while new llog is being created"
+
test_61() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
f="$DIR/f61"
dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
rm $DIR/$tfile
+ sync # sync lest earlier test intercept the fail_loc
+
#define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
lctl set_param fail_loc=0x80000406
$MULTIOP $DIR/$tfile Owy && \
test_65b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir
+ local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
+
$SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
error "setstripe"
touch $DIR/$tdir/f2
$LVERIFY $DIR/$tdir $DIR/$tdir/f2 || error "lverify failed"
}
-run_test 65b "directory setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1"
+run_test 65b "directory setstripe -S stripe_size*2 -i 0 -c 1"
test_65c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
if [[ $OSTCOUNT -gt 1 ]]; then
test_mkdir -p $DIR/$tdir
+ local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
+
$SETSTRIPE -S $(($STRIPESIZE * 4)) -i 1 \
-c $(($OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
touch $DIR/$tdir/f3
$LVERIFY $DIR/$tdir $DIR/$tdir/f3 || error "lverify failed"
fi
}
-run_test 65c "directory setstripe -S $((STRIPESIZE*4)) -i 1 -c $((OSTCOUNT-1))"
+run_test 65c "directory setstripe -S stripe_size*4 -i 1 -c $((OSTCOUNT-1))"
test_65d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir
+ local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
+ local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
+
if [[ $STRIPECOUNT -le 0 ]]; then
sc=1
elif [[ $STRIPECOUNT -gt 2000 ]]; then
$LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
error "lverify failed"
}
-run_test 65d "directory setstripe -S $STRIPESIZE -c stripe_count"
+run_test 65d "directory setstripe -S stripe_size -c stripe_count"
test_65e() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_65g() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir
+ local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
+
$SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
error "setstripe"
$SETSTRIPE -d $DIR/$tdir || error "setstripe"
test_65h() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir
+ local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
+
$SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
error "setstripe"
test_mkdir -p $DIR/$tdir/dd1
run_test 68b "support swapping to Lustre ========================"
# bug5265, obdfilter oa2dentry return -ENOENT
-# #define OBD_FAIL_OST_ENOENT 0x217
+# #define OBD_FAIL_SRV_ENOENT 0x217
test_69() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
test_71() {
- test_mkdir -p $DIR/$tdir
- sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
+ test_mkdir -p $DIR/$tdir
+ $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
+ sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
}
run_test 71 "Running dbench on lustre (don't segment fault) ===="
[[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
[[ $F78SIZE -gt 512 ]] && F78SIZE=512
[[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
- SMALLESTOST=$(lfs df $DIR | grep OST | awk '{ print $4 }' | sort -n |
+ SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n |
head -n1)
echo "Smallest OST: $SMALLESTOST"
[[ $SMALLESTOST -lt 10240 ]] &&
# some versions of cvs import exit(1) when asked to import links or
# files they can't read. ignore those files.
TOIGNORE=$(find . -type l -printf '-I %f\n' -o \
- ! -perm +4 -printf '-I %f\n')
+ ! -perm /4 -printf '-I %f\n')
$RUNAS cvs -d $DIR/d99cvsroot import -m "nomesg" $TOIGNORE \
d99reposname vtag rtag
}
for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do
local size=$((STRIPE_SIZE * num))
local file=file"$num-$offset-$count"
- stripe_size=$(lfs getstripe -S $PWD/$file)
+ stripe_size=$($LFS getstripe -S $PWD/$file)
[[ $stripe_size -ne $size ]] &&
error "$file: size $stripe_size != $size"
- stripe_count=$(lfs getstripe -c $PWD/$file)
+ stripe_count=$($LFS getstripe -c $PWD/$file)
# allow fewer stripes to be created, ORI-601
[[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
error "$file: count $stripe_count != $count"
- stripe_index=$(lfs getstripe -i $PWD/$file)
+ stripe_index=$($LFS getstripe -i $PWD/$file)
[[ $stripe_index -ne 0 ]] &&
stripe_index_all_zero=false
done
local xsize=${1:-1024} # in bytes
local file=$DIR/$tfile
- [ -z $(lctl get_param -n mdc.*.connect_flags | grep xattr) ] &&
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep xattr)" ] &&
skip "must have user_xattr" && return 0
[ -z "$(which setfattr 2>/dev/null)" ] &&
skip_env "could not find setfattr" && return 0
run_test 102p "check setxattr(2) correctly fails without permission"
test_102q() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) ] &&
+ skip "MDS needs to be at least 2.6.92" && return
orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check"
}
run_test 102q "flistxattr should not return trusted.link EAs for orphans"
test_102r() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.93) ] &&
+ skip "MDS needs to be at least 2.6.93" && return
touch $DIR/$tfile || error "touch"
setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr"
getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr"
rm $DIR/$tfile || error "rm"
+
+ #normal directory
+ mkdir -p $DIR/$tdir || error "mkdir"
+ setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
+ getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
+ setfattr -x user.$(basename $tdir) $DIR/$tdir ||
+ error "$testfile error deleting user.author1"
+ getfattr -d -m user.$(basename $tdir) 2> /dev/null |
+ grep "user.$(basename $tdir)" &&
+ error "$tdir did not delete user.$(basename $tdir)"
+ rmdir $DIR/$tdir || error "rmdir"
+
+ #striped directory
+ test_mkdir -p $DIR/$tdir || error "make striped dir"
+ setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir"
+ getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir"
+ setfattr -x user.$(basename $tdir) $DIR/$tdir ||
+ error "$testfile error deleting user.author1"
+ getfattr -d -m user.$(basename $tdir) 2> /dev/null |
+ grep "user.$(basename $tdir)" &&
+ error "$tdir did not delete user.$(basename $tdir)"
+ rmdir $DIR/$tdir || error "rm striped dir"
}
run_test 102r "set EAs with empty values"
test_116a() { # was previously test_116()
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
[[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return
echo -n "Free space priority "
test_116b() { # LU-2093
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ -z "$($LCTL get_param -n lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr |
- head -1 2>/dev/null)" ] && skip "no QOS" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
#define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
- local old_rr
- old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
- lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+ local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+ [ -z "$old_rr" ] && skip "no QOS" && return 0
do_facet $SINGLEMDS lctl set_param \
lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
mkdir -p $DIR/$tdir
reset_async
- #define OBD_FAIL_OST_ENOENT 0x217
+ #define OBD_FAIL_SRV_ENOENT 0x217
set_nodes_failloc "$(osts_nodes)" 0x217
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
}
run_test 124b "lru resize (performance test) ======================="
+test_124c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] &&
+ skip "no lru resize on server" && return 0
+
+ # cache ununsed locks on client
+ local nr=100
+ cancel_lru_locks mdc
+ test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+ createmany -o $DIR/$tdir/f $nr ||
+ error "failed to create $nr files in $DIR/$tdir"
+ ls -l $DIR/$tdir > /dev/null
+
+ local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
+ local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
+ local max_age=$($LCTL get_param -n $nsdir.lru_max_age)
+ local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period)
+ echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p"
+
+ # set lru_max_age to 1 sec
+ $LCTL set_param $nsdir.lru_max_age=1000 # jiffies
+ echo "sleep $((recalc_p * 2)) seconds..."
+ sleep $((recalc_p * 2))
+
+ local remaining=$($LCTL get_param -n $nsdir.lock_unused_count)
+ # restore lru_max_age
+ $LCTL set_param -n $nsdir.lru_max_age $max_age
+ [ $remaining -eq 0 ] || error "$remaining locks are not canceled"
+ unlinkmany $DIR/$tdir/f $nr
+}
+run_test 124c "LRUR cancel very aged locks"
+
test_125() { # 13358
[ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return
[ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return
do_facet $facet "test -e $LDPROC/$canondev/max_dir_size" ||
LDPROC=/sys/fs/ldiskfs
do_facet $facet "echo $1 >$LDPROC/$canondev/max_dir_size"
+ do_facet $facet "test -e $LDPROC/$canondev/warning_dir_size" ||
+ LDPROC=/sys/fs/ldiskfs
+ do_facet $facet "echo $2 >$LDPROC/$canondev/warning_dir_size"
+ done
+}
+
+check_mds_dmesg() {
+ local facets=$(get_facets MDS)
+ for facet in ${facets//,/ }; do
+ do_facet $facet "dmesg | tail -3 | grep -q $1" && return 0
done
+ return 1
}
test_129() {
remote_mds_nodsh && skip "remote MDS with nodsh" && return
ENOSPC=28
EFBIG=27
+ has_warning=0
rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
+ mkdir -p $DIR/$tdir
# block size of mds1
local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize)
- local MAX=$((MDSBLOCKSIZE * 3))
- set_dir_limits $MAX
+ local MAX=$((MDSBLOCKSIZE * 5))
+ set_dir_limits $MAX $MAX
local I=$(stat -c%s "$DIR/$tdir")
local J=0
- local STRIPE_COUNT=1
- [[ $MDSCOUNT -ge 2 ]] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir)
- MAX=$((MAX*STRIPE_COUNT))
while [[ $I -le $MAX ]]; do
$MULTIOP $DIR/$tdir/$J Oc
rc=$?
+ if [ $has_warning -eq 0 ]; then
+ check_mds_dmesg '"is approaching"' &&
+ has_warning=1
+ fi
#check two errors ENOSPC for new version of ext4 max_dir_size patch
#mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
#and EFBIG for previous versions
if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
- set_dir_limits 0
+ set_dir_limits 0 0
echo "return code $rc received as expected"
- multiop $DIR/$tdir/$J Oc ||
- error_exit "multiop failed w/o dir size limit"
+
+ createmany -o $DIR/$tdir/$J_file_ 1000 ||
+ error_exit "create failed w/o dir size limit"
+
+ check_mds_dmesg '"has reached"' ||
+ error_exit "has reached message should be output"
+
+ [ $has_warning ] ||
+ error_exit "warning message should be output"
I=$(stat -c%s "$DIR/$tdir")
fi
error_exit "current dir size $I, previous limit $MAX"
elif [ $rc -ne 0 ]; then
- set_dir_limits 0
+ set_dir_limits 0 0
error_exit "return code $rc received instead of expected " \
"$EFBIG or $ENOSPC, files in dir $I"
fi
I=$(stat -c%s "$DIR/$tdir")
done
- set_dir_limits 0
+ set_dir_limits 0 0
error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes"
}
run_test 129 "test directory size limit ========================"
}
run_test 131e "test read hitting hole"
-get_ost_param() {
- local token=$1
- local gl_sum=0
- for node in $(osts_nodes); do
- gl=$(do_node $node "$LCTL get_param -n ost.OSS.ost.stats" | awk '/'$token'/ {print $2}' | head -n 1)
- [ x$gl = x"" ] && gl=0
- gl_sum=$((gl_sum + gl))
- done
- echo $gl_sum
-}
-
-som_mode_switch() {
- local som=$1
- local gl1=$2
- local gl2=$3
-
- if [ x$som = x"enabled" ]; then
- [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected"
- MOUNT_OPTS=`echo $MOUNT_OPTS |
- sed 's/som_preview,\|,som_preview\|som_preview//g'`
- do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled"
- else
- [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected"
- MOUNT_OPTS="${MOUNT_OPTS:+$MOUNT_OPTS,}som_preview"
- do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled"
- fi
-
- # do remount to make new mount-conf parameters actual
- echo remounting...
- sync
- stopall
- setupall
-}
-
-test_132() { #1028, SOM
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- local mdtidx=$($LFS getstripe -M $DIR)
- local facet=mds$((mdtidx + 1))
-
- local MOUNTOPT_SAVE=$MOUNTOPT
-
- dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
- cancel_lru_locks osc
- som1=$(do_facet $facet "$LCTL get_param mdt.*.som" |
- awk -F= ' {print $2}' | head -n 1)
-
- gl1=$(get_ost_param "ldlm_glimpse_enqueue")
- stat $DIR/$tfile >/dev/null
- gl2=$(get_ost_param "ldlm_glimpse_enqueue")
- echo "====> SOM is "$som1", "$((gl2 - gl1))" glimpse RPC occured"
- rm $DIR/$tfile
- som_mode_switch $som1 $gl1 $gl2
-
- dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
- cancel_lru_locks osc
-
- som2=$(do_facet $facet "$LCTL get_param mdt.*.som" |
- awk -F= ' {print $2}' | head -n 1)
- if [ $som1 == $som2 ]; then
- error "som is still "$som2
- if [ x$som2 = x"enabled" ]; then
- som2="disabled"
- else
- som2="enabled"
- fi
- fi
-
- gl1=$(get_ost_param "ldlm_glimpse_enqueue")
- stat $DIR/$tfile >/dev/null
- gl2=$(get_ost_param "ldlm_glimpse_enqueue")
- echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured"
- som_mode_switch $som2 $gl1 $gl2
- MOUNT_OPTS=$MOUNT_OPTS_SAVE
-}
-run_test 132 "som avoids glimpse rpc"
-
check_stats() {
local res
local count
}
run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
-test_133f() {
- local proc_dirs
-
- local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
-/sys/fs/lustre/ /sys/fs/lnet/"
- local dir
- for dir in $dirs; do
- if [ -d $dir ]; then
- proc_dirs="$proc_dirs $dir"
- fi
- done
-
- local facet
+proc_dirs=""
+for dir in /proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
+ /sys/fs/lustre/ /sys/fs/lnet/ /sys/kernel/debug/lnet/ \
+ /sys/kernel/debug/lustre/; do
+ [[ -d $dir ]] && proc_dirs+=" $dir"
+done
+test_133f() {
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
# First without trusting modes.
find $proc_dirs -exec cat '{}' \; &> /dev/null
# Second verifying readability.
- find $proc_dirs \
- -type f \
- -exec cat '{}' \; &> /dev/null ||
- error "proc file read failed"
+ $LCTL get_param -R '*' &> /dev/null || error "proc file read failed"
+ # 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 $SINGLEMDS ost1; do
do_facet $facet find $proc_dirs \
! -name req_history \
run_test 133f "Check for LBUGs/Oopses/unreadable files in /proc"
test_133g() {
- local proc_dirs
-
- local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
-/sys/fs/lustre/ /sys/fs/lnet/"
- local dir
- for dir in $dirs; do
- if [ -d $dir ]; then
- proc_dirs="$proc_dirs $dir"
- fi
- done
-
- local facet
-
- # Second verifying readability.
+ # Second verifying writability.
find $proc_dirs \
-type f \
-not -name force_lbug \
error "find $proc_dirs failed"
[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] &&
- skip "Too old lustre on MDS"
+ skip "Too old lustre on MDS" && return
[ $(lustre_version_code ost1) -le $(version_code 2.5.54) ] &&
- skip "Too old lustre on ost1"
+ skip "Too old lustre on ost1" && return
+ local facet
for facet in $SINGLEMDS ost1; do
do_facet $facet find $proc_dirs \
-type f \
}
run_test 133g "Check for Oopses on bad io area writes/reads in /proc"
+test_134a() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] &&
+ skip "Need MDS version at least 2.7.54" && return
+
+ mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+ cancel_lru_locks mdc
+
+ local nsdir="ldlm.namespaces.*-MDT0000-mdc-*"
+ local unused=$($LCTL get_param -n $nsdir.lock_unused_count)
+ [ $unused -eq 0 ] || "$unused locks are not cleared"
+
+ local nr=1000
+ createmany -o $DIR/$tdir/f $nr ||
+ error "failed to create $nr files in $DIR/$tdir"
+ unused=$($LCTL get_param -n $nsdir.lock_unused_count)
+
+ #define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
+ do_facet mds1 $LCTL set_param fail_loc=0x327
+ do_facet mds1 $LCTL set_param fail_val=500
+ touch $DIR/$tdir/m
+
+ echo "sleep 10 seconds ..."
+ sleep 10
+ local lck_cnt=$($LCTL get_param -n $nsdir.lock_unused_count)
+
+ do_facet mds1 $LCTL set_param fail_loc=0
+ do_facet mds1 $LCTL set_param fail_val=0
+ [ $lck_cnt -lt $unused ] ||
+ error "No locks reclaimed, before:$unused, after:$lck_cnt"
+
+ rm $DIR/$tdir/m
+ unlinkmany $DIR/$tdir/f $nr
+}
+run_test 134a "Server reclaims locks when reaching lock_reclaim_threshold"
+
+test_134b() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] &&
+ skip "Need MDS version at least 2.7.54" && return
+
+ mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+ cancel_lru_locks mdc
+
+ local low_wm=$(do_facet mds1 $LCTL get_param -n \
+ ldlm.lock_reclaim_threshold_mb)
+ # disable reclaim temporarily
+ do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=0
+
+ #define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
+ do_facet mds1 $LCTL set_param fail_loc=0x328
+ do_facet mds1 $LCTL set_param fail_val=500
+
+ $LCTL set_param debug=+trace
+
+ local nr=600
+ createmany -o $DIR/$tdir/f $nr &
+ local create_pid=$!
+
+ echo "Sleep $TIMEOUT seconds ..."
+ sleep $TIMEOUT
+ if ! ps -p $create_pid > /dev/null 2>&1; then
+ do_facet mds1 $LCTL set_param fail_loc=0
+ do_facet mds1 $LCTL set_param fail_val=0
+ do_facet mds1 $LCTL set_param \
+ ldlm.lock_reclaim_threshold_mb=${low_wm}m
+ error "createmany finished incorrectly!"
+ fi
+ do_facet mds1 $LCTL set_param fail_loc=0
+ do_facet mds1 $LCTL set_param fail_val=0
+ do_facet mds1 $LCTL set_param ldlm.lock_reclaim_threshold_mb=${low_wm}m
+ wait $create_pid || return 1
+
+ unlinkmany $DIR/$tdir/f $nr
+}
+run_test 134b "Server rejects lock request when reaching lock_limit_mb"
+
test_140() { #bug-17379
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
[ -z "$FID" ] && error "path2fid unable to get $DIR/$tfile FID"
# check that we get the same pathname back
- local FOUND=$($LFS fid2path $MOUNT $FID)
+ local FOUND=$($LFS fid2path $MOUNT "$FID")
[ -z "$FOUND" ] && error "fid2path unable to get $FID path"
[ "$FOUND" != "$DIR/$tfile" ] &&
error "fid2path(path2fid($DIR/$tfile)) = $FOUND != $DIR/$tfile"
N=$((N + 1))
done
- $LFS fid2path $MOUNT $FID1 $FID2 $FID3 | while read PATHNAME; do
+ $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME;
+ do
[ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
N=$((N + 1))
rm -f $DIR/$tfile
touch $DIR/$tfile
- fid=$($LFS path2fid $DIR/$tfile)
+ local fid=$($LFS path2fid $DIR/$tfile)
# Open the file
fd=$(free_fd)
cmd="exec $fd<$DIR/$tfile"
eval $cmd
- fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
- echo $fid_list | grep $fid
+ local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
+ echo "$fid_list" | grep "$fid"
rc=$?
cmd="exec $fd>/dev/null"
}
run_test 154f "get parent fids by reading link ea"
+test_154g()
+{
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) ]] ||
+ { skip "Need MDS version at least 2.6.92"; return 0; }
+
+ mkdir -p $DIR/$tdir
+ llapi_fid_test -d $DIR/$tdir
+}
+run_test 154g "various llapi FID tests"
+
test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
local AFTER
local file="$DIR/$tfile"
- [ "$(facet_fstype ost1)" = "zfs" ] &&
- skip "LU-1956/LU-2261: stats unimplemented on OSD ZFS" &&
+ [ "$(facet_fstype ost1)" = "zfs" -a \
+ $(lustre_version_code ost1 -lt $(version_code 2.6.93)) ] &&
+ skip "LU-1956/LU-2261: stats not implemented on OSD ZFS" &&
return
roc_hit_init
- log "Turn on read and write cache"
- set_cache read on
- set_cache writethrough on
-
- log "Write data and read it back."
- log "Read should be satisfied from the cache."
- dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
- BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
-
- log "Read again; it should be satisfied from the cache."
- BEFORE=$AFTER
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ log "Turn on read and write cache"
+ set_cache read on
+ set_cache writethrough on
+ log "Write data and read it back."
+ log "Read should be satisfied from the cache."
+ dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+ BEFORE=$(roc_hit)
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == CPAGES"; then
+ error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
- log "Turn off the read cache and turn on the write cache"
- set_cache read off
- set_cache writethrough on
+ log "Read again; it should be satisfied from the cache."
+ BEFORE=$AFTER
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == CPAGES"; then
+ error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
- log "Read again; it should be satisfied from the cache."
- BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ log "Turn off the read cache and turn on the write cache"
+ set_cache read off
+ set_cache writethrough on
- log "Read again; it should not be satisfied from the cache."
- BEFORE=$AFTER
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ log "Read again; it should be satisfied from the cache."
+ BEFORE=$(roc_hit)
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == CPAGES"; then
+ error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
- log "Write data and read it back."
- log "Read should be satisfied from the cache."
- dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
- BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ log "Read again; it should not be satisfied from the cache."
+ BEFORE=$AFTER
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == 0"; then
+ error "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
- log "Read again; it should not be satisfied from the cache."
- BEFORE=$AFTER
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ log "Write data and read it back."
+ log "Read should be satisfied from the cache."
+ dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+ BEFORE=$(roc_hit)
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == CPAGES"; then
+ error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
+ log "Read again; it should not be satisfied from the cache."
+ BEFORE=$AFTER
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == 0"; then
+ error "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
- log "Turn off read and write cache"
- set_cache read off
- set_cache writethrough off
+ log "Turn off read and write cache"
+ set_cache read off
+ set_cache writethrough off
- log "Write data and read it back"
- log "It should not be satisfied from the cache."
- rm -f $file
- dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
- cancel_lru_locks osc
- BEFORE=`roc_hit`
- cat $file >/dev/null
- AFTER=`roc_hit`
+ log "Write data and read it back"
+ log "It should not be satisfied from the cache."
+ rm -f $file
+ dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+ cancel_lru_locks osc
+ BEFORE=$(roc_hit)
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == 0"; then
error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
- log "Turn on the read cache and turn off the write cache"
- set_cache read on
- set_cache writethrough off
+ log "Turn on the read cache and turn off the write cache"
+ set_cache read on
+ set_cache writethrough off
- log "Write data and read it back"
- log "It should not be satisfied from the cache."
- rm -f $file
- dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
- BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
+ log "Write data and read it back"
+ log "It should not be satisfied from the cache."
+ rm -f $file
+ dd if=/dev/urandom of=$file bs=4k count=$CPAGES || error "dd failed"
+ BEFORE=$(roc_hit)
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == 0"; then
error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
- log "Read again; it should be satisfied from the cache."
- BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ log "Read again; it should be satisfied from the cache."
+ BEFORE=$(roc_hit)
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == CPAGES"; then
+ error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
- rm -f $file
+ rm -f $file
}
-run_test 156 "Verification of tunables ============================"
+run_test 156 "Verification of tunables"
#Changelogs
err17935 () {
run_test 160b "Verify that very long rename doesn't crash in changelog"
test_160c() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
local rc=0
local server_version=$(lustre_version_code $SINGLEMDS)
}
run_test 160c "verify that changelog log catch the truncate event"
+test_160d() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ local server_version=$(lustre_version_code mds1)
+ local CL_MASK_PARAM="mdd.$MDT0.changelog_mask"
+
+ [[ $server_version -ge $(version_code 2.7.60) ]] ||
+ { skip "Need MDS version at least 2.7.60+"; return; }
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+
+ # Registration step
+ local USER=$(do_facet mds1 $LCTL --device $MDT0 \
+ changelog_register -n)
+
+ mkdir -p $DIR/$tdir/migrate_dir
+ $LFS changelog_clear $MDT0 $USER 0
+
+ $LFS migrate -m 1 $DIR/$tdir/migrate_dir || error "migrate fails"
+ $LFS changelog $MDT0
+ MIGRATES=$($LFS changelog $MDT0 | tail -5 | grep -c "MIGRT")
+ $LFS changelog_clear $MDT0 $USER 0
+ [ $MIGRATES -eq 1 ] ||
+ error "MIGRATE changelog mask count $MIGRATES != 1"
+
+ # Deregistration step
+ do_facet mds1 $LCTL --device $MDT0 changelog_deregister $USER
+}
+run_test 160d "verify that changelog log catch the migrate event"
+
test_161a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p -c1 $DIR/$tdir
echo "fid $fid resolves to path $path (expected $expected)"
}
-test_162() {
+test_162a() { # was test_162
# Make changes to filesystem
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p -c1 $DIR/$tdir/d2
return 0
}
-run_test 162 "path lookup sanity"
+run_test 162a "path lookup sanity"
test_162b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# LU-4239: Verify fid2path works with paths 100 or more directories deep
test_162c() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.51) ]] &&
+ skip "Need MDS version at least 2.7.51" && return
test_mkdir $DIR/$tdir.local
test_mkdir $DIR/$tdir.remote
local lpath=$tdir.local
run_test 181 "Test open-unlinked dir ========================"
test_182() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- # disable MDC RPC lock wouldn't crash client
local fcount=1000
- local tcount=4
+ local tcount=10
mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
-#define OBD_FAIL_MDC_RPCS_SEM 0x804
- $LCTL set_param fail_loc=0x804
- for (( i=0; i < $tcount; i++ )) ; do
+ $LCTL set_param mdc.*.rpc_stats=clear
+
+ for (( i = 0; i < $tcount; i++ )) ; do
mkdir $DIR/$tdir/$i
+ done
+
+ for (( i = 0; i < $tcount; i++ )) ; do
createmany -o $DIR/$tdir/$i/f- $fcount &
done
wait
- for (( i=0; i < $tcount; i++ )) ; do
+ for (( i = 0; i < $tcount; i++ )) ; do
unlinkmany $DIR/$tdir/$i/f- $fcount &
done
wait
- rm -rf $DIR/$tdir
+ $LCTL get_param mdc.*.rpc_stats
- $LCTL set_param fail_loc=0
+ rm -rf $DIR/$tdir
}
-run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
+run_test 182 "Test parallel modify metadata operations ================"
test_183() { # LU-2275
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local ref2=$dir0/ref2
local file1=$dir0/file1
local file2=$dir0/file2
- # create a file large enough for the concurent test
+ # create a file large enough for the concurrent test
dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
echo "ref file size: ref1($(stat -c %s $ref1))," \
}
run_test 184d "allow stripeless layouts swap"
+test_184e() {
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.94) ]] ||
+ { skip "Need MDS version at least 2.6.94"; return 0; }
+ check_swap_layouts_support && return 0
+ [ -z "$(which getfattr 2>/dev/null)" ] &&
+ skip "no getfattr command" && return 0
+
+ local file1=$DIR/$tdir/$tfile-1
+ local file2=$DIR/$tdir/$tfile-2
+ local file3=$DIR/$tdir/$tfile-3
+ local lovea
+
+ mkdir -p $DIR/$tdir
+ touch $file1 || error "create $file1 failed"
+ $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 ||
+ error "create $file2 failed"
+ $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
+ error "create $file3 failed"
+
+ $LFS swap_layouts $file1 $file2 ||
+ error "swap $file1 $file2 layouts failed"
+
+ lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted)
+ [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea"
+
+ echo 123 > $file1 || error "Should be able to write into $file1"
+
+ $LFS swap_layouts $file1 $file3 ||
+ error "swap $file1 $file3 layouts failed"
+
+ echo 123 > $file1 || error "Should be able to write into $file1"
+
+ rm -rf $file1 $file2 $file3
+}
+run_test 184e "Recreate layout after stripeless layout swaps"
test_185() { # LU-2441
# LU-3553 - no volatile file support in old servers
run_test 185 "Volatile file support"
test_187a() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.0) ] &&
+ skip "Need MDS version at least 2.3.0" && return
+
local dir0=$DIR/$tdir/$testnum
mkdir -p $dir0 || error "creating dir $dir0"
run_test 187a "Test data version change"
test_187b() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.0) ] &&
+ skip "Need MDS version at least 2.3.0" && return
+
local dir0=$DIR/$tdir/$testnum
mkdir -p $dir0 || error "creating dir $dir0"
elif [ -n "$JOB_ID" ]; then # Sun Grid Engine
JOBENV=JOB_ID
else
- JOBENV=FAKE_JOBID
+ $LCTL list_param jobid_name > /dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ JOBENV=nodelocal
+ else
+ JOBENV=FAKE_JOBID
+ fi
fi
verify_jobstats() {
- local cmd=$1
- local target=$2
+ local cmd=($1)
+ shift
+ local facets="$@"
+
+# we don't really need to clear the stats for this test to work, since each
+# command has a unique jobid, but it makes debugging easier if needed.
+# for facet in $facets; do
+# local dev=$(convert_facet2label $facet)
+# # clear old jobstats
+# do_facet $facet lctl set_param *.$dev.job_stats="clear"
+# done
+
+ # use a new JobID for each test, or we might see an old one
+ [ "$JOBENV" = "FAKE_JOBID" ] &&
+ FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
- # clear old jobstats
- do_facet $SINGLEMDS lctl set_param mdt.*.job_stats="clear"
- do_facet ost1 lctl set_param obdfilter.*.job_stats="clear"
+ JOBVAL=${!JOBENV}
- # use a new JobID for this test, or we might see an old one
- [ "$JOBENV" = "FAKE_JOBID" ] && FAKE_JOBID=test_id.$testnum.$RANDOM
+ [ "$JOBENV" = "nodelocal" ] && {
+ FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
+ $LCTL set_param jobid_name=$FAKE_JOBID
+ JOBVAL=$FAKE_JOBID
+ }
- JOBVAL=${!JOBENV}
- log "Test: $cmd"
+ log "Test: ${cmd[*]}"
log "Using JobID environment variable $JOBENV=$JOBVAL"
if [ $JOBENV = "FAKE_JOBID" ]; then
- FAKE_JOBID=$JOBVAL $cmd
+ FAKE_JOBID=$JOBVAL ${cmd[*]}
else
- $cmd
+ ${cmd[*]}
fi
- if [ "$target" = "mdt" -o "$target" = "both" ]; then
- FACET="$SINGLEMDS" # will need to get MDS number for DNE
- do_facet $FACET lctl get_param mdt.*.job_stats |
- grep $JOBVAL || error "No job stats found on MDT $FACET"
- fi
- if [ "$target" = "ost" -o "$target" = "both" ]; then
- FACET=ost1
- do_facet $FACET lctl get_param obdfilter.*.job_stats |
- grep $JOBVAL || error "No job stats found on OST $FACET"
- fi
+ # all files are created on OST0000
+ for facet in $facets; do
+ local stats="*.$(convert_facet2label $facet).job_stats"
+ if [ $(do_facet $facet lctl get_param $stats |
+ grep -c $JOBVAL) -ne 1 ]; then
+ do_facet $facet lctl get_param $stats
+ error "No jobstats for $JOBVAL found on $facet::$stats"
+ fi
+ done
}
jobstats_set() {
wait_update $HOSTNAME "$LCTL get_param -n jobid_var" $NEW_JOBENV
}
+cleanup_205() {
+ do_facet $SINGLEMDS \
+ $LCTL set_param mdt.*.job_cleanup_interval=$OLD_INTERVAL
+ [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV
+ do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $CL_USER
+}
+
test_205() { # Job stats
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
[ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
skip "Server doesn't support jobstats" && return 0
[[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return
- local cmd
OLD_JOBENV=$($LCTL get_param -n jobid_var)
if [ $OLD_JOBENV != $JOBENV ]; then
jobstats_set $JOBENV
- trap jobstats_set EXIT
+ trap cleanup_205 EXIT
fi
- local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
- changelog_register -n)
- echo "Registered as changelog user $user"
+ CL_USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n)
+ echo "Registered as changelog user $CL_USER"
+ OLD_INTERVAL=$(do_facet $SINGLEMDS \
+ lctl get_param -n mdt.*.job_cleanup_interval)
+ local interval_new=5
+ do_facet $SINGLEMDS \
+ $LCTL set_param mdt.*.job_cleanup_interval=$interval_new
+ local start=$SECONDS
+
+ local cmd
# mkdir
- cmd="mkdir $DIR/$tfile"
- verify_jobstats "$cmd" "mdt"
+ cmd="mkdir $DIR/$tdir"
+ verify_jobstats "$cmd" "$SINGLEMDS"
# rmdir
- cmd="rm -fr $DIR/$tfile"
- verify_jobstats "$cmd" "mdt"
+ cmd="rmdir $DIR/$tdir"
+ verify_jobstats "$cmd" "$SINGLEMDS"
+ # mkdir on secondary MDT
+ if [ $MDSCOUNT -gt 1 ]; then
+ cmd="lfs mkdir -i 1 $DIR/$tdir.remote"
+ verify_jobstats "$cmd" "mds2"
+ fi
# mknod
cmd="mknod $DIR/$tfile c 1 3"
- verify_jobstats "$cmd" "mdt"
+ verify_jobstats "$cmd" "$SINGLEMDS"
# unlink
cmd="rm -f $DIR/$tfile"
- verify_jobstats "$cmd" "mdt"
+ verify_jobstats "$cmd" "$SINGLEMDS"
+ # create all files on OST0000 so verify_jobstats can find OST stats
# open & close
cmd="$SETSTRIPE -i 0 -c 1 $DIR/$tfile"
- verify_jobstats "$cmd" "mdt"
+ verify_jobstats "$cmd" "$SINGLEMDS"
# setattr
cmd="touch $DIR/$tfile"
- verify_jobstats "$cmd" "both"
+ verify_jobstats "$cmd" "$SINGLEMDS ost1"
# write
cmd="dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 oflag=sync"
- verify_jobstats "$cmd" "ost"
+ verify_jobstats "$cmd" "ost1"
# read
+ cancel_lru_locks osc
cmd="dd if=$DIR/$tfile of=/dev/null bs=1M count=1 iflag=direct"
- verify_jobstats "$cmd" "ost"
+ verify_jobstats "$cmd" "ost1"
# truncate
cmd="$TRUNCATE $DIR/$tfile 0"
- verify_jobstats "$cmd" "both"
+ verify_jobstats "$cmd" "$SINGLEMDS ost1"
# rename
- cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename"
- verify_jobstats "$cmd" "mdt"
+ cmd="mv -f $DIR/$tfile $DIR/$tdir.rename"
+ verify_jobstats "$cmd" "$SINGLEMDS"
+ # jobstats expiry - sleep until old stats should be expired
+ local left=$((interval_new + 2 - (SECONDS - start)))
+ [ $left -ge 0 ] && echo "sleep $left for expiry" && sleep $((left + 1))
+ cmd="mkdir $DIR/$tdir.expire"
+ verify_jobstats "$cmd" "$SINGLEMDS"
+ [ $(do_facet $SINGLEMDS lctl get_param *.*.job_stats |
+ grep -c "job_id.*mkdir") -gt 1 ] && error "old jobstats not expired"
# Ensure that jobid are present in changelog (if supported by MDS)
if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ]
error "Unexpected jobids when jobid_var=$JOBENV"
fi
- # cleanup
- rm -f $DIR/jobstats_test_rename
-
- [ $OLD_JOBENV != $JOBENV ] && jobstats_set $OLD_JOBENV
+ cleanup_205
}
run_test 205 "Verify job stats"
# for now as only exclusive open is supported. After generic lease
# is done, this test suite should be revised. - Jinshan
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] ||
{ skip "Need MDS version at least 2.4.52"; return 0; }
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
echo "==== test 1: verify get lease work"
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
test_220() { #LU-325
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_mgs_nodsh && skip "remote MGS with nodsh" && return
local OSTIDX=0
- test_mkdir -p $DIR/$tdir
- local OST=$(lfs osts | grep ${OSTIDX}": " | \
- awk '{print $2}' | sed -e 's/_UUID$//')
+ # create on MDT0000 so the last_id and next_id are correct
+ mkdir $DIR/$tdir
+ local OST=$($LFS df $DIR | awk '/OST:'$OSTIDX'/ { print $1 }')
+ OST=${OST%_UUID}
# on the mdt's osc
local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
}
run_test 224b "Don't panic on bulk IO failure"
+test_224c() { # LU-6441
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ 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="$LCTL get_param -n at_max"
+ local param_at="$FSNAME.sys.at_max"
+ local test_timeout="$LCTL get_param -n timeout"
+ local param_timeout="$FSNAME.sys.timeout"
+
+ $LCTL set_param -n osc.*.max_pages_per_rpc=1024
+
+ set_conf_param_and_check client "$test_at" "$param_at" 0 ||
+ error "conf_param at_max=0 failed"
+ set_conf_param_and_check client "$test_timeout" "$param_timeout" 5 ||
+ error "conf_param timeout=5 failed"
+
+ #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
+ $LCTL set_param fail_loc=0x520
+ dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1
+ sync
+ $LCTL set_param fail_loc=0
+
+ set_conf_param_and_check client "$test_at" "$param_at" $at_max ||
+ error "conf_param at_max=$at_max failed"
+ set_conf_param_and_check client "$test_timeout" "$param_timeout" \
+ $timeout || error "conf_param timeout=$timeout failed"
+
+ $LCTL set_param -n $pages_per_rpc
+}
+run_test 224c "Don't hang if one of md lost during large bulk RPC"
+
MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)}
test_225a () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
if [ -z ${MDSSURVEY} ]; then
skip_env "mds-survey not found" && return
fi
test_225b () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
if [ -z ${MDSSURVEY} ]; then
skip_env "mds-survey not found" && return
fi
test_229() { # LU-2482, LU-3448
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
- skip "No HSM support on MDS of $(get_lustre_version)," \
- "need 2.4.53 at least" && return
+ skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" &&
+ return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
- mkdir -p $DIR/$tdir/test_230_local
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $DIR/$tdir/test_230_local
local mdt_idx=$($GETSTRIPE -M $DIR/$tdir/test_230_local)
[ $mdt_idx -ne 0 ] &&
error "create local directory on wrong MDT $mdt_idx"
local migrate_dir=$DIR/$tdir/migrate_dir
local other_dir=$DIR/$tdir/other_dir
- mkdir -p $migrate_dir
- mkdir -p $other_dir
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $migrate_dir
+ test_mkdir -i0 -c1 $other_dir
for ((i=0; i<10; i++)); do
mkdir -p $migrate_dir/dir_${i}
createmany -o $migrate_dir/dir_${i}/f 10 ||
ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
- $LFS mv -v -M $MDTIDX $migrate_dir ||
- error "migrate remote dir error"
+ $LFS migrate -m $MDTIDX $migrate_dir ||
+ error "fails on migrating remote dir to MDT1"
echo "migratate to MDT1, then checking.."
- for ((i=0; i<10; i++)); do
+ 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 ] ||
stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
[ $stripe_count = 2 ] ||
- error "dir strpe_count $d != 2 after migration."
+ error "dir strpe_count $d != 2 after migration."
stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
[ $stripe_count = 2 ] ||
- error "file strpe_count $d != 2 after migration."
+ error "file strpe_count $d != 2 after migration."
#migrate back to MDT0
MDTIDX=0
- $LFS mv -v -M $MDTIDX $migrate_dir ||
- error "migrate remote dir error"
+
+ $LFS migrate -m $MDTIDX $migrate_dir ||
+ error "fails on migrating remote dir to MDT0"
echo "migrate back to MDT0, checking.."
for file in $(find $migrate_dir); do
test_230c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
local mdt_index
local file
+ local migrate_dir=$DIR/$tdir/migrate_dir
#If migrating directory fails in the middle, all entries of
#the directory is still accessiable.
- mkdir -p $DIR/$tdir
- stat $DIR/$tdir
- createmany -o $DIR/$tdir/f 10 ||
- error "create files under ${tdir} failed"
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $migrate_dir
+ stat $migrate_dir
+ createmany -o $migrate_dir/f 10 ||
+ error "create files under ${migrate_dir} failed"
#failed after migrating 5 entries
#OBD_FAIL_MIGRATE_ENTRIES 0x1801
do_facet mds1 lctl set_param fail_loc=0x20001801
do_facet mds1 lctl set_param fail_val=5
- local t=`ls $DIR/$tdir | wc -l`
- $LFS mv -M $MDTIDX $DIR/$tdir &&
- error "migrate should failed after 5 entries"
- local u=`ls $DIR/$tdir | wc -l`
+ local t=$(ls $migrate_dir | wc -l)
+ $LFS migrate --mdt-index $MDTIDX $migrate_dir &&
+ error "migrate should fail after 5 entries"
+
+ mkdir $migrate_dir/dir &&
+ error "mkdir succeeds under migrating directory"
+ touch $migrate_dir/file &&
+ error "touch file succeeds under migrating directory"
+
+ local u=$(ls $migrate_dir | wc -l)
[ "$u" == "$t" ] || error "$u != $t during migration"
- for file in $(find $DIR/$tdir); do
+ for file in $(find $migrate_dir); do
stat $file || error "stat $file failed"
done
do_facet mds1 lctl set_param fail_loc=0
do_facet mds1 lctl set_param fail_val=0
- $LFS mv -M $MDTIDX $DIR/$tdir ||
+ $LFS migrate -m $MDTIDX $migrate_dir ||
error "migrate open files should failed with open files"
echo "Finish migration, then checking.."
- for file in $(find $DIR/$tdir); do
+ for file in $(find $migrate_dir); do
mdt_index=$($LFS getstripe -M $file)
[ $mdt_index == $MDTIDX ] ||
error "$file is not on MDT${MDTIDX}"
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
local mdt_index
+ local migrate_dir=$DIR/$tdir/migrate_dir
local i
local j
- mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $migrate_dir
for ((i=0; i<100; i++)); do
- mkdir -p $DIR/$tdir/dir_${i}
- createmany -o $DIR/$tdir/dir_${i}/f 100 ||
+ test_mkdir -i0 -c1 $migrate_dir/dir_${i}
+ createmany -o $migrate_dir/dir_${i}/f 100 ||
error "create files under remote dir failed $i"
done
- $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error"
+ $LFS migrate -m $MDTIDX $migrate_dir ||
+ error "migrate remote dir error"
echo "Finish migration, then checking.."
- for file in $(find $DIR/$tdir); do
+ for file in $(find $migrate_dir); do
mdt_index=$($LFS getstripe -M $file)
[ $mdt_index == $MDTIDX ] ||
error "$file is not on MDT${MDTIDX}"
}
run_test 230d "check migrate big directory"
-test_231a()
-{
- # For simplicity this test assumes that max_pages_per_rpc
- # is the same across all OSCs
- local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
- local bulk_size=$((max_pages * 4096))
+test_230e() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local i
+ local j
+ local a_fid
+ local b_fid
mkdir -p $DIR/$tdir
+ mkdir $DIR/$tdir/migrate_dir
+ mkdir $DIR/$tdir/other_dir
+ touch $DIR/$tdir/migrate_dir/a
+ ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/b
+ ls $DIR/$tdir/other_dir
- # clear the OSC stats
- $LCTL set_param osc.*.stats=0 &>/dev/null
+ $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
+ error "migrate dir fails"
- # Client writes $bulk_size - there must be 1 rpc for $max_pages.
- dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
- oflag=direct &>/dev/null || error "dd failed"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir)
+ [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
- local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
- if [ x$nrpcs != "x1" ]; then
- error "found $nrpc ost_write RPCs, not 1 as expected"
- fi
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir/a)
+ [ $mdt_index == 0 ] || error "a is not on MDT0"
- # Drop the OSC cache, otherwise we will read from it
- cancel_lru_locks osc
+ $LFS migrate -m 1 $DIR/$tdir/other_dir ||
+ error "migrate dir fails"
- # clear the OSC stats
- $LCTL set_param osc.*.stats=0 &>/dev/null
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/other_dir)
+ [ $mdt_index == 1 ] || error "other_dir is not on MDT1"
- # Client reads $bulk_size.
- dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
- iflag=direct &>/dev/null || error "dd failed"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir/a)
+ [ $mdt_index == 1 ] || error "a is not on MDT1"
- nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
- if [ x$nrpcs != "x1" ]; then
- error "found $nrpc ost_read RPCs, not 1 as expected"
- fi
-}
-run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/other_dir/b)
+ [ $mdt_index == 1 ] || error "b is not on MDT1"
-test_231b() {
- mkdir -p $DIR/$tdir
- local i
- for i in {0..1023}; do
- dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
- seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
- error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
- done
- sync
+ a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
+ b_fid=$($LFS path2fid $DIR/$tdir/other_dir/b)
+
+ [ "$a_fid" = "$b_fid" ] || error "different fid after migration"
+
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
}
-run_test 231b "must not assert on fully utilized OST request buffer"
+run_test 230e "migrate mulitple local link files"
+
+test_230f() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local a_fid
+ local ln_fid
-test_232() {
mkdir -p $DIR/$tdir
- #define OBD_FAIL_LDLM_OST_LVB 0x31c
- $LCTL set_param fail_loc=0x31c
+ mkdir $DIR/$tdir/migrate_dir
+ $LFS mkdir -i1 $DIR/$tdir/other_dir
+ touch $DIR/$tdir/migrate_dir/a
+ ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln1
+ ln $DIR/$tdir/migrate_dir/a $DIR/$tdir/other_dir/ln2
+ ls $DIR/$tdir/other_dir
+
+ # a should be migrated to MDT1, since no other links on MDT0
+ $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
+ error "migrate dir fails"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir)
+ [ $mdt_index == 1 ] || error "migrate_dir is not on MDT1"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir/a)
+ [ $mdt_index == 1 ] || error "a is not on MDT1"
+
+ # a should stay on MDT1, because it is a mulitple link file
+ $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
+ error "migrate dir fails"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir/a)
+ [ $mdt_index == 1 ] || error "a is not on MDT1"
+
+ $LFS migrate -m 1 $DIR/$tdir/migrate_dir ||
+ error "migrate dir fails"
+
+ a_fid=$($LFS path2fid $DIR/$tdir/migrate_dir/a)
+ ln_fid=$($LFS path2fid $DIR/$tdir/other_dir/ln1)
+ [ "$a_fid" = "$ln_fid" ] || error "different fid after migrate to MDT1"
+
+ rm -rf $DIR/$tdir/other_dir/ln1 || error "unlink ln1 fails"
+ rm -rf $DIR/$tdir/other_dir/ln2 || error "unlink ln2 fails"
+
+ # a should be migrated to MDT0, since no other links on MDT1
+ $LFS migrate -m 0 $DIR/$tdir/migrate_dir ||
+ error "migrate dir fails"
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir/a)
+ [ $mdt_index == 0 ] || error "a is not on MDT0"
- # ignore dd failure
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230f "migrate mulitple remote link files"
+
+test_230g() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir -p $DIR/$tdir/migrate_dir
+
+ $LFS migrate -m 1000 $DIR/$tdir/migrate_dir &&
+ error "migrating dir to non-exist MDT succeeds"
+ true
+}
+run_test 230g "migrate dir to non-exist MDT"
+
+test_230h() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] &&
+ skip "Need MDS version at least 2.7.64" && return
+ local mdt_index
+
+ mkdir -p $DIR/$tdir/migrate_dir
+
+ $LFS migrate -m1 $DIR &&
+ error "migrating mountpoint1 should fail"
+
+ $LFS migrate -m1 $DIR/$tdir/.. &&
+ error "migrating mountpoint2 should fail"
+
+ $LFS migrate -m1 $DIR/$tdir/migrate_dir/.. ||
+ error "migrating $tdir fail"
+
+ mdt_index=$($LFS getstripe -M $DIR/$tdir)
+ [ $mdt_index == 1 ] || error "$mdt_index != 1 after migration"
+
+ mdt_index=$($LFS getstripe -M $DIR/$tdir/migrate_dir)
+ [ $mdt_index == 1 ] || error "$mdt_index != 1 after migration"
+
+}
+run_test 230h "migrate .. and root"
+
+test_230i() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir -p $DIR/$tdir/migrate_dir
+
+ $LFS migrate -m 1 $DIR/$tdir/migrate_dir/ ||
+ error "migration fails with a tailing slash"
+
+ $LFS migrate -m 0 $DIR/$tdir/migrate_dir// ||
+ error "migration fails with two tailing slashes"
+}
+run_test 230i "lfs migrate -m tolerates trailing slashes"
+
+test_231a()
+{
+ # For simplicity this test assumes that max_pages_per_rpc
+ # is the same across all OSCs
+ local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
+ local bulk_size=$((max_pages * 4096))
+
+ mkdir -p $DIR/$tdir
+
+ # clear the OSC stats
+ $LCTL set_param osc.*.stats=0 &>/dev/null
+ stop_writeback
+
+ # Client writes $bulk_size - there must be 1 rpc for $max_pages.
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=$bulk_size count=1 \
+ oflag=direct &>/dev/null || error "dd failed"
+
+ sync; sleep 1; sync # just to be safe
+ local nrpcs=$($LCTL get_param osc.*.stats |awk '/ost_write/ {print $2}')
+ if [ x$nrpcs != "x1" ]; then
+ $LCTL get_param osc.*.stats
+ error "found $nrpcs ost_write RPCs, not 1 as expected"
+ fi
+
+ start_writeback
+ # Drop the OSC cache, otherwise we will read from it
+ cancel_lru_locks osc
+
+ # clear the OSC stats
+ $LCTL set_param osc.*.stats=0 &>/dev/null
+
+ # Client reads $bulk_size.
+ dd if=$DIR/$tdir/$tfile of=/dev/null bs=$bulk_size count=1 \
+ iflag=direct &>/dev/null || error "dd failed"
+
+ nrpcs=$($LCTL get_param osc.*.stats | awk '/ost_read/ { print $2 }')
+ if [ x$nrpcs != "x1" ]; then
+ $LCTL get_param osc.*.stats
+ error "found $nrpcs ost_read RPCs, not 1 as expected"
+ fi
+}
+run_test 231a "checking that reading/writing of BRW RPC size results in one RPC"
+
+test_231b() {
+ mkdir -p $DIR/$tdir
+ local i
+ for i in {0..1023}; do
+ dd if=/dev/zero of=$DIR/$tdir/$tfile conv=notrunc \
+ seek=$((2 * i)) bs=4096 count=1 &>/dev/null ||
+ error "dd of=$DIR/$tdir/$tfile seek=$((2 * i)) failed"
+ done
+ sync
+}
+run_test 231b "must not assert on fully utilized OST request buffer"
+
+test_232() {
+ mkdir -p $DIR/$tdir
+ #define OBD_FAIL_LDLM_OST_LVB 0x31c
+ $LCTL set_param fail_loc=0x31c
+
+ # ignore dd failure
dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1 || true
$LCTL set_param fail_loc=0
ln $DIR/$tfile $DIR/$tfile.lnk
touch $DIR/$tfile.new
mv $DIR/$tfile.new $DIR/$tfile
- local fid1=$(lfs path2fid $DIR/$tfile)
- local fid2=$(lfs path2fid $DIR/$tfile.lnk)
- local path1=$(lfs fid2path $FSNAME $fid1)
+ local fid1=$($LFS path2fid $DIR/$tfile)
+ local fid2=$($LFS path2fid $DIR/$tfile.lnk)
+ local path1=$($LFS fid2path $FSNAME "$fid1")
[ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
- local path2=$(lfs fid2path $FSNAME $fid2)
+ local path2=$($LFS fid2path $FSNAME "$fid2")
[ $tfile.lnk == $path2 ] ||
error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
rm -f $DIR/$tfile*
}
run_test 239 "osp_sync test"
+test_239a() { #LU-5297
+ touch $DIR/$tfile
+ #define OBD_FAIL_OSP_CHECK_INVALID_REC 0x2100
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2100
+ chgrp $RUNAS_GID $DIR/$tfile
+ wait_delete_completed
+}
+run_test 239a "process invalid osp sync record correctly"
+
+test_239b() { #LU-5297
+ touch $DIR/$tfile1
+ #define OBD_FAIL_OSP_CHECK_ENOMEM 0x2101
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2101
+ chgrp $RUNAS_GID $DIR/$tfile1
+ wait_delete_completed
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0
+ touch $DIR/$tfile2
+ chgrp $RUNAS_GID $DIR/$tfile2
+ wait_delete_completed
+}
+run_test 239b "process osp sync record with ENOMEM error correctly"
+
test_240() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
test_241_bio() {
for LOOP in $(seq $1); do
dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 2>/dev/null
- cancel_lru_locks osc
+ cancel_lru_locks osc || true
done
}
}
run_test 241 "bio vs dio"
+test_241b() {
+ dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
+ ls -la $DIR/$tfile
+ test_241_dio 1000 &
+ PID=$!
+ test_241_dio 1000
+ wait $PID
+}
+run_test 241b "dio vs dio"
+
test_242() {
mkdir -p $DIR/$tdir
touch $DIR/$tdir/$tfile
}
run_test 242 "mdt_readpage failure should not cause directory unreadable"
+test_243()
+{
+ test_mkdir -p $DIR/$tdir
+ group_lock_test -d $DIR/$tdir || error "A group lock test failed"
+}
+run_test 243 "various group lock tests"
+
+test_244()
+{
+ test_mkdir -p $DIR/$tdir
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
+ sendfile_grouplock $DIR/$tdir/$tfile || \
+ error "sendfile+grouplock failed"
+ rm -rf $DIR/$tdir
+}
+run_test 244 "sendfile with group lock tests"
+
+test_245() {
+ local flagname="multi_mod_rpcs"
+ local connect_data_name="max_mod_rpcs"
+ local out
+
+ # check if multiple modify RPCs flag is set
+ out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import |
+ grep "connect_flags:")
+ echo "$out"
+
+ echo "$out" | grep -qw $flagname
+ if [ $? -ne 0 ]; then
+ echo "connect flag $flagname is not set"
+ return
+ fi
+
+ # check if multiple modify RPCs data is set
+ out=$($LCTL get_param mdc.$FSNAME-MDT0000-*.import)
+ echo "$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"
+
+test_246() { # LU-7371
+ [ $(lustre_version_code ost1) -lt $(version_code 2.7.62) ] &&
+ skip "Need OST version >= 2.7.62" && return 0
+ do_facet ost1 $LCTL set_param fail_val=4095
+#define OBD_FAIL_OST_READ_SIZE 0x234
+ do_facet ost1 $LCTL set_param fail_loc=0x234
+ $LFS setstripe $DIR/$tfile -i 0 -c 1
+ dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
+ cancel_lru_locks $FSNAME-OST0000
+ dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
+}
+run_test 246 "Read file of size 4095 should return right length"
+
+test_250() {
+ [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \
+ && skip "no 16TB file size limit on ZFS" && return
+
+ $SETSTRIPE -c 1 $DIR/$tfile
+ # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes
+ local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1))
+ $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed"
+ dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \
+ conv=notrunc,fsync && error "append succeeded"
+ return 0
+}
+run_test 250 "Write above 16T limit"
+
+test_251() {
+ $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile
+
+ #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407
+ #Skip once - writing the first stripe will succeed
+ $LCTL set_param fail_loc=0xa0001407 fail_val=1
+ $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" &&
+ error "short write happened"
+
+ $LCTL set_param fail_loc=0xa0001407 fail_val=1
+ $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" &&
+ error "short read happened"
+
+ rm -f $DIR/$tfile
+}
+run_test 251 "Handling short read and write correctly"
+
+test_252() {
+ local tgt
+ local dev
+ local out
+ local uuid
+ local num
+ local gen
+
+ if [ "$(facet_fstype ost1)" != "ldiskfs" -o \
+ "$(facet_fstype mds1)" != "ldiskfs" ]; then
+ skip "can only run lr_reader on ldiskfs target"
+ return
+ fi
+
+ # check lr_reader on OST0000
+ tgt=ost1
+ dev=$(facet_device $tgt)
+ out=$(do_facet $tgt $LR_READER $dev)
+ [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
+ echo "$out"
+ uuid=$(echo "$out" | grep -i uuid | awk '{ print $2 }')
+ [ "$uuid" == "$(ostuuid_from_index 0)" ] ||
+ error "Invalid uuid returned by $LR_READER on target $tgt"
+ echo -e "uuid returned by $LR_READER is '$uuid'\n"
+
+ # check lr_reader -c on MDT0000
+ tgt=mds1
+ dev=$(facet_device $tgt)
+ if ! do_facet $tgt $LR_READER -h | grep -q OPTIONS; then
+ echo "$LR_READER does not support additional options"
+ return 0
+ fi
+ out=$(do_facet $tgt $LR_READER -c $dev)
+ [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
+ echo "$out"
+ num=$(echo "$out" | grep -c "mdtlov")
+ [ "$num" -eq $((MDSCOUNT - 1)) ] ||
+ error "Invalid number of mdtlov clients returned by $LR_READER"
+ echo -e "Number of mdtlov clients returned by $LR_READER is '$num'\n"
+
+ # check lr_reader -cr on MDT0000
+ out=$(do_facet $tgt $LR_READER -cr $dev)
+ [ $? -eq 0 ] || error "$LR_READER failed on target $tgt device $dev"
+ echo "$out"
+ echo "$out" | grep -q "^reply_data:$" ||
+ error "$LR_READER should have returned 'reply_data' section"
+ num=$(echo "$out" | grep -c "client_generation")
+ echo -e "Number of reply data returned by $LR_READER is '$num'\n"
+}
+run_test 252 "check lr_reader tool"
+
+test_256() {
+ local cl_user
+ local cat_sl
+ local mdt_dev
+
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ "$(facet_fstype mds1)" != "ldiskfs" ] &&
+ skip "non-ldiskfs backend" && return
+
+ mdt_dev=$(mdsdevname 1)
+ echo $mdt_dev
+ cl_user=$(do_facet mds1 \
+ "$LCTL get_param -n mdd.$MDT0.changelog_users | grep cl")
+ if [[ -n $cl_user ]]; then
+ skip "active changelog user"
+ return
+ fi
+
+ cl_user=$(do_facet mds1 $LCTL --device $MDT0 changelog_register -n)
+ echo "Registered as changelog user $cl_user"
+
+ rm -rf $DIR/$tdir
+ mkdir -p $DIR/$tdir
+
+ $LFS changelog_clear $MDT0 $cl_user 0
+
+ # change something
+ touch $DIR/$tdir/{1..10}
+
+ # stop the MDT
+ stop mds1 || error "Fail to stop MDT."
+
+ # remount the MDT
+ start mds1 $mdt_dev $MDS_MOUNT_OPTS || error "Fail to start MDT."
+
+ #after mount new plainllog is used
+ touch $DIR/$tdir/{11..19}
+ cat_sl=$(do_facet mds1 \
+ "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \
+ llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l")
+
+ if (( cat_sl != 2 )); then
+ do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user
+ error "Changelog catalog has wrong number of slots $cat_sl"
+ fi
+
+ $LFS changelog_clear $MDT0 $cl_user 0
+
+ cat_sl=$(do_facet mds1 \
+ "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \
+ llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l")
+
+ do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user
+
+ if (( cat_sl == 2 )); then
+ error "Empty plain llog was not deleted from changelog catalog"
+ fi
+ if (( cat_sl != 1 )); then
+ error "Active plain llog shouldn\`t be deleted from catalog"
+ fi
+}
+run_test 256 "Check llog delete for empty and not full state"
+
cleanup_test_300() {
trap 0
umask $SAVE_UMASK
local mode=$(stat -c%a $DIR/$tdir/striped_dir)
[ "$mode" = "755" ] || error "expect 755 got $mode"
+ $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 ||
+ error "getdirstripe failed"
stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
if [ "$stripe_count" != "2" ]; then
error "stripe_count is $stripe_count, expect 2"
[ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] ||
error "nlink error after rmdir"
+ chattr +i $DIR/$tdir/striped_dir
+ createmany -o $DIR/$tdir/striped_dir/f 10 &&
+ error "immutable flags not working under striped dir!"
+ chattr -i $DIR/$tdir/striped_dir
+
rmdir $DIR/$tdir/striped_dir ||
error "rmdir striped dir error"
run_test 300d "check default stripe under striped directory"
test_300e() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local stripe_count
$LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c ||
error "set striped dir under striped dir error"
- mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/b &&
- error "rename file under striped dir should fail"
-
- mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b &&
- error "rename dir under striped dir should fail"
+ mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
+ error "rename dir under striped dir fails"
- mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b &&
- error "rename dir under different stripes should fail"
+ mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b ||
+ error "rename dir under different stripes fails"
mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c ||
error "rename file under striped dir should succeed"
- mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_c ||
+ mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c ||
error "rename dir under striped dir should succeed"
rm -rf $DIR/$tdir
run_test 300e "check rename under striped directory"
test_300f() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local stripe_count
$LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b ||
error "create striped dir under striped dir fails"
- mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/b &&
- error "rename file under different striped dir should fail"
-
- mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b &&
+ mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b ||
error "rename dir under different striped dir should fail"
- mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b &&
+ mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b ||
error "rename striped dir under diff striped dir should fail"
mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a ||
error "rename file under diff striped dirs fails"
- mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_a ||
- error "rename dir under diff striped dirs fails"
-
rm -rf $DIR/$tdir
}
run_test 300f "check rename cross striped directory"
-test_300g() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+test_300_check_default_striped_dir()
+{
+ local dirname=$1
+ local default_count=$2
+ local default_index=$3
local stripe_count
+ local stripe_index
+ local dir_stripe_index
local dir
- mkdir $DIR/$tdir
- $LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \
- $DIR/$tdir/striped_dir ||
- error "set striped dir error"
-
- $LFS setdirstripe -D -c $MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ echo "checking $dirname $default_count $default_index"
+ $LFS setdirstripe -D -c $default_count -i $default_index \
+ -t all_char $DIR/$tdir/$dirname ||
error "set default stripe on striped dir error"
+ stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname)
+ [ $stripe_count -eq $default_count ] ||
+ error "expect $default_count get $stripe_count for $dirname"
- stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/striped_dir)
- [ $stripe_count -eq $MDSCOUNT ] ||
- error "default stripe wrong expect $MDSCOUNT get $stripe_count"
+ stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname)
+ [ $stripe_index -eq $default_index ] ||
+ error "expect $default_index get $stripe_index for $dirname"
- mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
+ mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} ||
+ error "create dirs failed"
- for dir in $(find $DIR/$tdir/striped_dir/*); do
+ createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed"
+ unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed"
+ for dir in $(find $DIR/$tdir/$dirname/*); do
stripe_count=$($LFS getdirstripe -c $dir)
- [ $stripe_count -eq $MDSCOUNT ] ||
- error "expect $MDSCOUNT get $stripe_count for $dir"
+ [ $stripe_count -eq $default_count ] ||
+ [ $stripe_count -eq 0 -o $default_count -eq 1 ] ||
+ error "stripe count $default_count != $stripe_count for $dir"
+
+ stripe_index=$($LFS getdirstripe -i $dir)
+ [ $default_index -eq -1 -o $stripe_index -eq $default_index ] ||
+ error "$stripe_index != $default_index for $dir"
+
+ #check default stripe
+ stripe_count=$($LFS getdirstripe -D -c $dir)
+ [ $stripe_count -eq $default_count ] ||
+ error "default count $default_count != $stripe_count for $dir"
+
+ stripe_index=$($LFS getdirstripe -D -i $dir)
+ [ $stripe_index -eq $default_index ] ||
+ error "default index $default_index != $stripe_index for $dir"
done
+ rmdir $DIR/$tdir/$dirname/* || error "rmdir failed"
+}
+
+test_300g() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local dir
+ local stripe_count
+ local stripe_index
+
+ mkdir $DIR/$tdir
+ mkdir $DIR/$tdir/normal_dir
+
+ test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
+ test_300_check_default_striped_dir normal_dir 1 0
+ test_300_check_default_striped_dir normal_dir 2 1
+ test_300_check_default_striped_dir normal_dir 2 -1
- rmdir $DIR/$tdir/striped_dir/* || error "rmdir1 failed"
- #change default stripe count to 2
- $LFS setdirstripe -D -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ #delete default stripe information
+ echo "delete default stripeEA"
+ $LFS setdirstripe -d $DIR/$tdir/normal_dir ||
error "set default stripe on striped dir error"
- mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
+ mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4}
+ for dir in $(find $DIR/$tdir/normal_dir/*); do
+ stripe_count=$($LFS getdirstripe -c $dir)
+ [ $stripe_count -eq 0 ] ||
+ error "expect 1 get $stripe_count for $dir"
+ stripe_index=$($LFS getdirstripe -i $dir)
+ [ $stripe_index -eq 0 ] ||
+ error "expect 0 get $stripe_index for $dir"
+ done
+}
+run_test 300g "check default striped directory for normal directory"
+
+test_300h() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local dir
+ local stripe_count
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \
+ $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
- rmdir $DIR/$tdir/striped_dir/* || error "rmdir2 failed"
+ test_300_check_default_striped_dir striped_dir $MDSCOUNT 1
+ test_300_check_default_striped_dir striped_dir 1 0
+ test_300_check_default_striped_dir striped_dir 2 1
+ test_300_check_default_striped_dir striped_dir 2 -1
- #change default stripe count to 1
- $LFS setdirstripe -D -c 1 -t all_char $DIR/$tdir/striped_dir ||
+ #delete default stripe information
+ $LFS setdirstripe -d $DIR/$tdir/striped_dir ||
error "set default stripe on striped dir error"
mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
for dir in $(find $DIR/$tdir/striped_dir/*); do
stripe_count=$($LFS getdirstripe -c $dir)
- [ $stripe_count -eq 1 ] ||
+ [ $stripe_count -eq 0 ] ||
error "expect 1 get $stripe_count for $dir"
done
- rmdir $DIR/$tdir/striped_dir/* || error "rmdir3 failed"
}
-run_test 300g "check default striped directory for striped directory"
+run_test 300h "check default striped directory for striped directory"
-test_300h() {
+test_300i() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
local stripe_count
return 0
}
-run_test 300h "client handle unknown hash type striped directory"
+run_test 300i "client handle unknown hash type striped directory"
+
+test_300j() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
+
+ mkdir $DIR/$tdir
+
+ #define OBD_FAIL_SPLIT_UPDATE_REC 0x1702
+ $LCTL set_param fail_loc=0x1702
+ $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ createmany -o $DIR/$tdir/striped_dir/f- 10 ||
+ error "create files under striped dir failed"
+
+ $LCTL set_param fail_loc=0
+
+ rm -rf $DIR/$tdir || error "unlink striped dir fails"
+
+ return 0
+}
+run_test 300j "test large update record"
+
+test_300k() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
+
+ mkdir $DIR/$tdir
+
+ #define OBD_FAIL_LARGE_STRIPE 0x1703
+ $LCTL set_param fail_loc=0x1703
+ $LFS setdirstripe -i 0 -c512 $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+ $LCTL set_param fail_loc=0
+
+ $LFS getdirstripe $DIR/$tdir/striped_dir ||
+ error "getstripeddir fails"
+ rm -rf $DIR/$tdir/striped_dir ||
+ error "unlink striped dir fails"
+
+ return 0
+}
+run_test 300k "test large striped directory"
+
+test_300l() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_index
+
+ test_mkdir -p $DIR/$tdir/striped_dir
+ chown $RUNAS_ID $DIR/$tdir/striped_dir ||
+ error "chown $RUNAS_ID failed"
+ $LFS setdirstripe -i 1 -D $DIR/$tdir/striped_dir ||
+ error "set default striped dir failed"
+
+ #define OBD_FAIL_MDS_STALE_DIR_LAYOUT 0x158
+ $LCTL set_param fail_loc=0x80000158
+ $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir || error "create dir fails"
+
+ stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/test_dir)
+ [ $stripe_index -eq 1 ] ||
+ error "expect 1 get $stripe_index for $dir"
+}
+run_test 300l "non-root user to create dir under striped dir with stale layout"
+
+test_300m() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -ge 2 ] && skip "Only for single MDT" && return
+
+ mkdir -p $DIR/$tdir/striped_dir
+ $LFS setdirstripe -D -c 1 $DIR/$tdir/striped_dir ||
+ error "set default stripes dir error"
+
+ mkdir $DIR/$tdir/striped_dir/a || error "mkdir a fails"
+
+ stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/a)
+ [ $stripe_count -eq 0 ] ||
+ error "expect 0 get $stripe_count for a"
+
+ $LFS setdirstripe -D -c 2 $DIR/$tdir/striped_dir ||
+ error "set default stripes dir error"
+
+ mkdir $DIR/$tdir/striped_dir/b || error "mkdir b fails"
+
+ stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir/b)
+ [ $stripe_count -eq 0 ] ||
+ error "expect 0 get $stripe_count for b"
+
+ $LFS setdirstripe -D -c1 -i2 $DIR/$tdir/striped_dir ||
+ error "set default stripes dir error"
+
+ mkdir $DIR/$tdir/striped_dir/c &&
+ error "default stripe_index is invalid, mkdir c should fails"
+
+ rm -rf $DIR/$tdir || error "rmdir fails"
+}
+run_test 300m "setstriped directory on single MDT FS"
+
+cleanup_300n() {
+ local list=$(comma_list $(mdts_nodes))
+
+ trap 0
+ do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
+}
+
+test_300n() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_index
+ local list=$(comma_list $(mdts_nodes))
+
+ trap cleanup_300n RETURN EXIT
+ mkdir -p $DIR/$tdir
+ chmod 777 $DIR/$tdir
+ $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT \
+ $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
+ error "create striped dir succeeds with gid=0"
+
+ do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
+ $RUNAS $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
+ error "create striped dir fails with gid=-1"
+
+ do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
+ $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D \
+ $DIR/$tdir/striped_dir > /dev/null 2>&1 &&
+ error "set default striped dir succeeds with gid=0"
+
+
+ do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=-1
+ $RUNAS $LFS setdirstripe -i 1 -c$MDSCOUNT -D $DIR/$tdir/striped_dir ||
+ error "set default striped dir fails with gid=-1"
+
+
+ do_nodes $list $LCTL set_param -n mdt.*.enable_remote_dir_gid=0
+ $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir ||
+ error "create test_dir fails"
+ $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir1 ||
+ error "create test_dir1 fails"
+ $RUNAS mkdir $DIR/$tdir/striped_dir/test_dir2 ||
+ error "create test_dir2 fails"
+ cleanup_300n
+}
+run_test 300n "non-root user to create dir under striped dir with default EA"
+
+test_300o() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.55) ] &&
+ skip "Need MDS version at least 2.7.55" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local numfree1
+ local numfree2
+
+ mkdir -p $DIR/$tdir
+
+ numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree)
+ numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree)
+ if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then
+ skip "not enough free inodes $numfree1 $numfree2"
+ return
+ fi
+
+ numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree)
+ numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree)
+ if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then
+ skip "not enough free space $numfree1 $numfree2"
+ return
+ fi
+
+ $LFS setdirstripe -c2 $DIR/$tdir/striped_dir ||
+ error "setdirstripe fails"
+
+ createmany -d $DIR/$tdir/striped_dir/d 131000 ||
+ error "create dirs fails"
+
+ $LCTL set_param ldlm.namespaces.*mdc-*.lru_size=0
+ ls $DIR/$tdir/striped_dir > /dev/null ||
+ error "ls striped dir fails"
+ unlinkmany -d $DIR/$tdir/striped_dir/d 131000 ||
+ error "unlink big striped dir fails"
+}
+run_test 300o "unlink big sub stripe(> 65000 subdirs)"
+
+test_300p() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir -p $DIR/$tdir
+
+ #define OBD_FAIL_OUT_ENOSPC 0x1704
+ do_facet mds2 lctl set_param fail_loc=0x80001704
+ $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir > /dev/null 2>&1 &&
+ error "create striped directory should fail"
+
+ [ -e $DIR/$tdir/bad_striped_dir ] && error "striped dir exists"
+
+ $LFS setdirstripe -c2 $DIR/$tdir/bad_striped_dir
+ true
+}
+run_test 300p "create striped directory without space"
+
+test_300q() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ local fd=$(free_fd)
+ local cmd="exec $fd<$tdir"
+ cd $DIR
+ $LFS mkdir -c $MDSCOUNT $tdir || error "create $tdir fails"
+ eval $cmd
+ cmd="exec $fd<&-"
+ trap "eval $cmd" EXIT
+ cd $tdir || error "cd $tdir fails"
+ rmdir ../$tdir || error "rmdir $tdir fails"
+ mkdir local_dir && error "create dir succeeds"
+ $LFS setdirstripe -i1 remote_dir && error "create remote dir succeeds"
+ eval $cmd
+ return 0
+}
+run_test 300q "create remote directory under orphan directory"
+
+prepare_remote_file() {
+ mkdir $DIR/$tdir/src_dir ||
+ error "create remote source failed"
+
+ cp /etc/hosts $DIR/$tdir/src_dir/a || error
+ touch $DIR/$tdir/src_dir/a
+
+ $LFS mkdir -i 1 $DIR/$tdir/tgt_dir ||
+ error "create remote target dir failed"
+
+ touch $DIR/$tdir/tgt_dir/b
+
+ mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b ||
+ error "rename dir cross MDT failed!"
+
+ $CHECKSTAT -t file $DIR/$tdir/src_dir/a &&
+ error "src_child still exists after rename"
+
+ $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b ||
+ error "missing file(a) after rename"
+
+ diff /etc/hosts $DIR/$tdir/tgt_dir/b ||
+ error "diff after rename"
+}
+
+test_310a() {
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local remote_file=$DIR/$tdir/tgt_dir/b
+
+ mkdir -p $DIR/$tdir
+
+ prepare_remote_file || error "prepare remote file failed"
+
+ #open-unlink file
+ $OPENUNLINK $remote_file $remote_file || error
+ $CHECKSTAT -a $remote_file || error
+}
+run_test 310a "open unlink remote file"
+
+test_310b() {
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local remote_file=$DIR/$tdir/tgt_dir/b
+
+ mkdir -p $DIR/$tdir
+
+ prepare_remote_file || error "prepare remote file failed"
+
+ ln $remote_file $DIR/$tfile || error "link failed for remote file"
+ $MULTIOP $DIR/$tfile Ouc || error "mulitop failed"
+ $CHECKSTAT -t file $remote_file || error "check file failed"
+}
+run_test 310b "unlink remote file with multiple links while open"
+
+test_310c() {
+ [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ local remote_file=$DIR/$tdir/tgt_dir/b
+
+ mkdir -p $DIR/$tdir
+
+ prepare_remote_file || error "prepare remote file failed"
+
+ ln $remote_file $DIR/$tfile || error "link failed for remote file"
+ multiop_bg_pause $remote_file O_uc ||
+ error "mulitop failed for remote file"
+ MULTIPID=$!
+ $MULTIOP $DIR/$tfile Ouc
+ kill -USR1 $MULTIPID
+ wait $MULTIPID
+}
+run_test 310c "open-unlink remote file with multiple links"
test_400a() { # LU-1606, was conf-sanity test_74
local extra_flags=''
}
run_test 400b "packaged headers can be compiled"
+test_401a() { #LU-7437
+ #count the number of parameters by "list_param -R"
+ local params=$($LCTL list_param -R '*' 2>/dev/null | wc -l)
+ #count the number of parameters by listing proc files
+ local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
+ sort -u | wc -l)
+
+ [ $params -eq $procs ] ||
+ error "found $params parameters vs. $procs proc files"
+
+ # test the list_param -D option only returns directories
+ params=$($LCTL list_param -R -D '*' 2>/dev/null | wc -l)
+ #count the number of parameters by listing proc directories
+ procs=$(find -L $proc_dirs -mindepth 1 -type d -printf '%P\n' 2>/dev/null |
+ sort -u | wc -l)
+
+ [ $params -eq $procs ] ||
+ error "found $params parameters vs. $procs proc files"
+}
+run_test 401a "Verify if 'lctl list_param -R' can list parameters recursively"
+
+test_401b() {
+ local save=$($LCTL get_param -n jobid_var)
+ local tmp=testing
+
+ $LCTL set_param foo=bar jobid_var=$tmp bar=baz &&
+ error "no error returned when setting bad parameters"
+
+ local jobid_new=$($LCTL get_param -n foe jobid_var baz)
+ [[ "$jobid_new" == "$tmp" ]] || error "jobid tmp $jobid_new != $tmp"
+
+ $LCTL set_param -n fog=bam jobid_var=$save bat=fog
+ local jobid_old=$($LCTL get_param -n foe jobid_var bag)
+ [[ "$jobid_old" == "$save" ]] || error "jobid new $jobid_old != $save"
+}
+run_test 401b "Verify 'lctl {get,set}_param' continue after error"
+
+test_402() {
+ $LFS setdirstripe -i 0 $DIR/$tdir || error "setdirstripe -i 0 failed"
+#define OBD_FAIL_MDS_FLD_LOOKUP 0x15c
+ do_facet mds1 "lctl set_param fail_loc=0x8000015c"
+ touch $DIR/$tdir/$tfile && error "touch should fail with ENOENT" ||
+ echo "Touch failed - OK"
+}
+run_test 402 "Return ENOENT to lod_generate_and_set_lovea"
+
#
# tests that do cleanup/setup should be run at the end
#