set -e
ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 13297 2108 9789 3637 9789 3561 5188
-ALWAYS_EXCEPT=" 42a 42b 42c 42d 45 68b $SANITY_EXCEPT"
+# bug number for skipped test: LU-9693 LU-6493 LU-9693 3561 5188
+ALWAYS_EXCEPT=" 42a 42b 42c 45 68b $SANITY_EXCEPT"
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
-# with LOD/OSP landing
-# bug number for skipped tests: LU-2036 LU-8411
-ALWAYS_EXCEPT=" 76 407 $ALWAYS_EXCEPT"
+# skipped tests: LU-8411 LU-9096 LU-9054 LU-10199
+ALWAYS_EXCEPT=" 407 253 312 56xb $ALWAYS_EXCEPT"
+
+# Check Grants after these tests
+GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
is_sles11() # LU-4341
{
export PATH=$PATH:/sbin
TMP=${TMP:-/tmp}
+OSC=${OSC:-"osc"}
CC=${CC:-cc}
CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
init_logging
-# 5 12 (min)"
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24D 27m 64b 68 71 115 300o"
+# 5 12 (min)"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="27m 64b 68 71 115 300o"
if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
- # bug number for skipped test: LU-4536 LU-1957
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180"
+ # bug number for skipped test: LU-1957
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 180"
# 13 (min)"
[ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
fi
$LCTL get_param mdc.*.import | grep "target: $FSNAME-MDT" ||
error "bad target"
}
-run_test 0c "check import proc ============================="
+run_test 0c "check import proc"
test_1() {
- test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
- test_mkdir -p $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
- test_mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
+ test_mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir/d2
+ mkdir $DIR/$tdir/d2 && error "we expect EEXIST, but not returned"
$CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a dir"
rmdir $DIR/$tdir/d2
rmdir $DIR/$tdir
$CHECKSTAT -a $DIR/$tdir || error "$tdir was not removed"
}
-run_test 1 "mkdir; remkdir; rmdir =============================="
+run_test 1 "mkdir; remkdir; rmdir"
test_2() {
- test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+ test_mkdir $DIR/$tdir
touch $DIR/$tdir/$tfile || error "touch $tdir/$tfile failed"
$CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
rm -r $DIR/$tdir
$CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$file is not removed"
}
-run_test 2 "mkdir; touch; rmdir; check file ===================="
+run_test 2 "mkdir; touch; rmdir; check file"
test_3() {
- test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+ test_mkdir $DIR/$tdir
$CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
touch $DIR/$tdir/$tfile
$CHECKSTAT -t file $DIR/$tdir/$tfile || error "$tdir/$tfile not a file"
rm -r $DIR/$tdir
$CHECKSTAT -a $DIR/$tdir || error "$tdir is not removed"
}
-run_test 3 "mkdir; touch; rmdir; check dir ====================="
+run_test 3 "mkdir; touch; rmdir; check dir"
# LU-4471 - failed rmdir on remote directories still removes directory on MDT0
test_4() {
- local MDTIDX=1
-
- test_mkdir $DIR/$tdir ||
- error "Create remote directory failed"
+ test_mkdir -i 1 $DIR/$tdir
touch $DIR/$tdir/$tfile ||
error "Create file under remote directory failed"
run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
test_5() {
- test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
- test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
+ test_mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir/d2
chmod 0707 $DIR/$tdir/d2 || error "chmod 0707 $tdir/d2 failed"
$CHECKSTAT -t dir -p 0707 $DIR/$tdir/d2 || error "$tdir/d2 not mode 707"
$CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
}
-run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2 ============"
+run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2"
test_6a() {
touch $DIR/$tfile || error "touch $DIR/$tfile failed"
$CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
}
-run_test 6e "touch f6e; chgrp f6e; $RUNAS chgrp f6e (should return error) =="
+run_test 6e "touch+chgrp $tfile; $RUNAS chgrp $tfile (should return error)"
test_6g() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- test_mkdir $DIR/$tdir || error "mkdir $tfile failed"
+ test_mkdir $DIR/$tdir
chmod 777 $DIR/$tdir || error "chmod 0777 $tdir failed"
$RUNAS mkdir $DIR/$tdir/d || error "mkdir $tdir/d failed"
chmod g+s $DIR/$tdir/d || error "chmod g+s $tdir/d failed"
- test_mkdir $DIR/$tdir/d/subdir || error "mkdir $tdir/d/subdir failed"
+ test_mkdir $DIR/$tdir/d/subdir
$CHECKSTAT -g \#$RUNAS_GID $DIR/$tdir/d/subdir ||
error "$tdir/d/subdir should be GID $RUNAS_GID"
if [[ $MDSCOUNT -gt 1 ]]; then
error "$tdir.remote should be mode 02755"
fi
}
-run_test 6g "Is new dir in sgid dir inheriting group?"
+run_test 6g "verify new dir in sgid dir inherits group"
test_6h() { # bug 7331
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
$CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/$tfile ||
error "$tdir/$tfile should be UID $RUNAS_UID GID $RUNAS_GID"
}
-run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)"
+run_test 6h "$RUNAS chown RUNAS_ID.0 .../$tfile (should return error)"
test_7a() {
test_mkdir $DIR/$tdir
rm -rf $DIR/$tdir/$tfile
$CHECKSTAT -a $DIR/$tdir/$tfile || error "$tdir/$tfile not removed"
}
-run_test 16 "touch .../d16/f; rm -rf .../d16/f ================="
+run_test 16 "touch .../d16/f; rm -rf .../d16/f"
test_17a() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
touch $DIR/$tdir/$tfile
ln -s $DIR/$tdir/$tfile $DIR/$tdir/l-exist
ls -l $DIR/$tdir
rm -f $DIR/$tdir/l-exist
$CHECKSTAT -a $DIR/$tdir/l-exist || error "$tdir/l-exist not removed"
}
-run_test 17a "symlinks: create, remove (real) =================="
+run_test 17a "symlinks: create, remove (real)"
test_17b() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
ln -s no-such-file $DIR/$tdir/l-dangle
ls -l $DIR/$tdir
$CHECKSTAT -l no-such-file $DIR/$tdir/l-dangle ||
rm -f $DIR/$tdir/l-dangle
$CHECKSTAT -a $DIR/$tdir/l-dangle || error "$tdir/l-dangle not removed"
}
-run_test 17b "symlinks: create, remove (dangling) =============="
+run_test 17b "symlinks: create, remove (dangling)"
test_17c() { # bug 3440 - don't save failed open RPC for replay
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
ln -s foo $DIR/$tdir/$tfile
cat $DIR/$tdir/$tfile && error "opened non-existent symlink" || true
}
-run_test 17c "symlinks: open dangling (should return error) ===="
+run_test 17c "symlinks: open dangling (should return error)"
test_17d() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
ln -s foo $DIR/$tdir/$tfile
touch $DIR/$tdir/$tfile || error "creating to new symlink"
}
-run_test 17d "symlinks: create dangling ========================"
+run_test 17d "symlinks: create dangling"
test_17e() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local foo=$DIR/$tdir/$tfile
ln -s $foo $foo || error "create symlink failed"
ls -l $foo || error "ls -l failed"
ls $foo && error "ls not failed" || true
}
-run_test 17e "symlinks: create recursive symlink (should return error) ===="
+run_test 17e "symlinks: create recursive symlink (should return error)"
test_17f() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
ls -l $DIR/$tdir
}
-run_test 17f "symlinks: long and very long symlink name ========================"
+run_test 17f "symlinks: long and very long symlink name"
# str_repeat(S, N) generate a string that is string S repeated N times
str_repeat() {
# Long symlinks and LU-2241
test_17g() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local TESTS="59 60 61 4094 4095"
# Fix for inode size boundary in 2.1.4
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local mdt_idx
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
if [[ $MDSCOUNT -gt 1 ]]; then
mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
else
mdt_idx=0
fi
- $SETSTRIPE -c -1 $DIR/$tdir
-#define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
- do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
- touch $DIR/$tdir/$tfile || true
+ $LFS setstripe -c -1 $DIR/$tdir
+ #define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
+ do_facet mds$((mdt_idx + 1)) lctl set_param fail_loc=0x80000141
+ touch $DIR/$tdir/$tfile || true
}
run_test 17h "create objects: lov_free_memmd() doesn't lbug"
rsync --help | grep -q xattr ||
skip_env "$(rsync --version | head -n1) does not support xattrs"
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return 0
- test_mkdir -p $DIR/$tdir
- test_mkdir -p $DIR/$tdir.new
+ test_mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir.new
touch $DIR/$tdir/$tfile
ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
rsync -av -X $DIR/$tdir/ $DIR/$tdir.new ||
error "rsync failed with xattrs enabled"
}
-run_test 17k "symlinks: rsync with xattrs enabled ========================="
+run_test 17k "symlinks: rsync with xattrs enabled"
test_17l() { # LU-279
[[ -z "$(which getfattr 2>/dev/null)" ]] &&
skip "no getfattr command" && return 0
- test_mkdir -p $DIR/$tdir
+ test_mkdir $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
done
done
}
-run_test 17l "Ensure lgetxattr's returned xattr size is consistent ========"
+run_test 17l "Ensure lgetxattr's returned xattr size is consistent"
# LU-1540
test_17m() {
local short_sym="0123456789"
- local WDIR=$DIR/${tdir}m
+ local wdir=$DIR/$tdir
local i
remote_mds_nodsh && skip "remote MDS with nodsh" && return
skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
- skip "only for ldiskfs MDT" && return 0
+ skip "ldiskfs only test" && return 0
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $WDIR
+ test_mkdir $wdir
long_sym=$short_sym
# create a long symlink file
for ((i = 0; i < 4; ++i)); do
long_sym=${long_sym}${long_sym}
done
- echo "create 512 short and long symlink files under $WDIR"
+ echo "create 512 short and long symlink files under $wdir"
for ((i = 0; i < 256; ++i)); do
- ln -sf ${long_sym}"a5a5" $WDIR/long-$i
- ln -sf ${short_sym}"a5a5" $WDIR/short-$i
+ ln -sf ${long_sym}"a5a5" $wdir/long-$i
+ ln -sf ${short_sym}"a5a5" $wdir/short-$i
done
echo "erase them"
- rm -f $WDIR/*
+ rm -f $wdir/*
sync
wait_delete_completed
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 || error "long_sym failed"
- ln -sf ${short_sym} $WDIR/short-$i || error "short_sym failed"
+ ln -sf ${long_sym} $wdir/long-$i || error "long_sym failed"
+ ln -sf ${short_sym} $wdir/short-$i || error "short_sym failed"
done
- local mds_index=$(($($LFS getstripe -M $WDIR) + 1))
+ local mds_index=$(($($LFS getstripe -M $wdir) + 1))
local devname=$(mdsdevname $mds_index)
echo "stop and checking mds${mds_index}:"
run_e2fsck $(facet_active_host mds${mds_index}) $devname -n
rc=$?
- start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed"
+ start mds${mds_index} $devname $MDS_MOUNT_OPTS ||
+ error "start mds${mds_index} failed"
df $MOUNT > /dev/null 2>&1
[ $rc -eq 0 ] ||
error "e2fsck detected error for short/long symlink: rc=$rc"
skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
- skip "only for ldiskfs MDT" && return 0
+ skip "ldiskfs only test" && return 0
[[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ] &&
skip "Need MDS version at least 2.3.64" && return
- local WDIR=$DIR/${tdir}o
+ local wdir=$DIR/${tdir}o
local mdt_index
local rc=0
- test_mkdir -p $WDIR
- mdt_index=$($LFS getstripe -M $WDIR)
- mdt_index=$((mdt_index+1))
-
- touch $WDIR/$tfile
+ test_mkdir $wdir
+ touch $wdir/$tfile
+ mdt_index=$($LFS getstripe -M $wdir/$tfile)
+ mdt_index=$((mdt_index + 1))
+ cancel_lru_locks mdc
#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
- ls -l $WDIR/$tfile && rc=1
+ ls -l $wdir/$tfile && rc=1
do_facet mds${mdt_index} lctl set_param fail_loc=0
- [[ $rc -ne 0 ]] && error "stat file should fail"
- true
+ [[ $rc -eq 0 ]] || error "stat file should fail"
}
run_test 17o "stat file with incompat LMA feature"
test_20() {
touch $DIR/$tfile
rm $DIR/$tfile
- log "1 done"
touch $DIR/$tfile
rm $DIR/$tfile
- log "2 done"
touch $DIR/$tfile
rm $DIR/$tfile
- log "3 done"
$CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
}
-run_test 20 "touch .../f ; ls -l ... ==========================="
+run_test 20 "touch .../f ; ls -l ..."
test_21() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
[ -f $DIR/$tdir/dangle ] && rm -f $DIR/$tdir/dangle
ln -s dangle $DIR/$tdir/link
echo foo >> $DIR/$tdir/link
$CHECKSTAT -f -t file $DIR/$tdir/link ||
error "$tdir/link not linked to a file"
}
-run_test 21 "write to dangling link ============================"
+run_test 21 "write to dangling link"
test_22() {
- WDIR=$DIR/$tdir
- test_mkdir -p $DIR/$tdir
- chown $RUNAS_ID:$RUNAS_GID $WDIR
- (cd $WDIR || error "cd $WDIR failed";
- $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \
- $RUNAS tar xf -)
- ls -lR $WDIR/etc || error "ls -lR $WDIR/etc failed"
- $CHECKSTAT -t dir $WDIR/etc || error "checkstat -t dir failed"
- $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $WDIR/etc || error "checkstat -u failed"
-}
-run_test 22 "unpack tar archive as non-root user ==============="
+ local wdir=$DIR/$tdir
+ test_mkdir $wdir
+ chown $RUNAS_ID:$RUNAS_GID $wdir
+ (cd $wdir || error "cd $wdir failed";
+ $RUNAS tar cf - /etc/hosts /etc/sysconfig/network |
+ $RUNAS tar xf -)
+ ls -lR $wdir/etc || error "ls -lR $wdir/etc failed"
+ $CHECKSTAT -t dir $wdir/etc || error "checkstat -t dir failed"
+ $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $wdir/etc ||
+ error "checkstat -u failed"
+}
+run_test 22 "unpack tar archive as non-root user"
# was test_23
test_23a() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local file=$DIR/$tdir/$tfile
openfile -f O_CREAT:O_EXCL $file || error "$file create failed"
openfile -f O_CREAT:O_EXCL $file &&
error "$file recreate succeeded" || true
}
-run_test 23a "O_CREAT|O_EXCL in subdir =========================="
+run_test 23a "O_CREAT|O_EXCL in subdir"
test_23b() { # bug 18988
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local file=$DIR/$tdir/$tfile
- rm -f $file
- echo foo > $file || error "write filed"
- echo bar >> $file || error "append filed"
- $CHECKSTAT -s 8 $file || error "wrong size"
- rm $file
+ rm -f $file
+ echo foo > $file || error "write filed"
+ echo bar >> $file || error "append filed"
+ $CHECKSTAT -s 8 $file || error "wrong size"
+ rm $file
}
-run_test 23b "O_APPEND check =========================="
+run_test 23b "O_APPEND check"
# rename sanity
test_24a() {
run_test 24n "Statting the old file after renaming (Posix rename 2)"
test_24o() {
- test_mkdir -p $DIR/d24o
- rename_many -s random -v -n 10 $DIR/d24o
+ test_mkdir $DIR/$tdir
+ rename_many -s random -v -n 10 $DIR/$tdir
}
-run_test 24o "rename of files during htree split ==============="
+run_test 24o "rename of files during htree split"
test_24p() {
test_mkdir $DIR/R12a
}
simple_cleanup_common() {
+ local rc=0
trap 0
+ [ -z "$DIR" -o -z "$tdir" ] && return 0
+
+ local start=$SECONDS
rm -rf $DIR/$tdir
+ rc=$?
wait_delete_completed
+ echo "cleanup time $((SECONDS - start))"
+ return $rc
}
max_pages_per_rpc() {
- $LCTL get_param -n mdc.*.max_pages_per_rpc | head -n1
+ local mdtname="$(printf "MDT%04x" ${1:-0})"
+ $LCTL get_param -n mdc.*$mdtname*.max_pages_per_rpc
}
test_24v() {
- local NRFILES=100000
- local FREE_INODES=$(mdt_free_inodes 0)
- [[ $FREE_INODES -lt $NRFILES ]] &&
- skip "not enough free inodes $FREE_INODES required $NRFILES" &&
- return
-
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- trap simple_cleanup_common EXIT
-
+ local nrfiles=${COUNT:-100000}
# Performance issue on ZFS see LU-4072 (c.f. LU-2887)
- [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
+ [ $(facet_fstype $SINGLEMDS) = "zfs" ] && nrfiles=${COUNT:-10000}
- test_mkdir -p $DIR/$tdir
- createmany -m $DIR/$tdir/$tfile $NRFILES
+ local fname="$DIR/$tdir/$tfile"
+ test_mkdir "$(dirname $fname)"
+ # assume MDT0000 has the fewest inodes
+ local stripes=$($LFS getdirstripe -c $(dirname $fname))
+ local free_inodes=$(($(mdt_free_inodes 0) * stripes))
+ [[ $free_inodes -lt $nrfiles ]] && nrfiles=$free_inodes
+
+ trap simple_cleanup_common EXIT
+
+ createmany -m "$fname" $nrfiles
cancel_lru_locks mdc
lctl set_param mdc.*.stats clear
- ls $DIR/$tdir >/dev/null || error "error in listing large dir"
-
+ # was previously test_24D: LU-6101
+ # readdir() returns correct number of entries after cursor reload
+ local num_ls=$(ls $DIR/$tdir | wc -l)
+ local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l)
+ local num_all=$(ls -a $DIR/$tdir | wc -l)
+ if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \
+ $num_all -ne $((nrfiles + 2)) ]; then
+ error "Expected $nrfiles files, got $num_ls " \
+ "($num_uniq unique $num_all .&..)"
+ fi
# LU-5 large readdir
- # DIRENT_SIZE = 32 bytes for sizeof(struct lu_dirent) +
- # 8 bytes for name(filename is mostly 5 in this test) +
- # 8 bytes for luda_type
+ # dirent_size = 32 bytes for sizeof(struct lu_dirent) +
+ # N bytes for name (len($nrfiles) rounded to 8 bytes) +
+ # 8 bytes for luda_type (4 bytes rounded to 8 bytes)
# take into account of overhead in lu_dirpage header and end mark in
- # each page, plus one in RPC_NUM calculation.
- DIRENT_SIZE=48
- RPC_SIZE=$(($(max_pages_per_rpc) * $(page_size)))
- RPC_NUM=$(((NRFILES * DIRENT_SIZE + RPC_SIZE - 1) / RPC_SIZE + 1))
- mds_readpage=$(lctl get_param mdc.*MDT0000*.stats |
- awk '/^mds_readpage/ {print $2}')
- [[ $mds_readpage -gt $RPC_NUM ]] &&
- error "large readdir doesn't take effect"
+ # each page, plus one in rpc_num calculation.
+ local dirent_size=$((32 + (${#tfile} | 7) + 1 + 8))
+ local page_entries=$((($(page_size) - 24) / dirent_size))
+ local mdt_idx=$($LFS getdirstripe -i $(dirname $fname))
+ local rpc_pages=$(max_pages_per_rpc $mdt_idx)
+ local rpc_max=$((nrfiles / (page_entries * rpc_pages) + stripes))
+ local mds_readpage=$(calc_stats mdc.*.stats mds_readpage)
+ echo "readpages: $mds_readpage rpc_max: $rpc_max"
+ (( $mds_readpage < $rpc_max - 2 || $mds_readpage > $rpc_max + 1)) &&
+ error "large readdir doesn't take effect: " \
+ "$mds_readpage should be about $rpc_max"
simple_cleanup_common
}
-run_test 24v "list directory with large files (handle hash collision, bug: 17560)"
+run_test 24v "list large directory (test hash collision, b=17560)"
test_24w() { # bug21506
SZ1=234852
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
- test_mkdir -p $DIR/$tdir/src_dir
+ test_mkdir $DIR/$tdir/src_dir
touch $DIR/$tdir/src_file
- test_mkdir -p $remote_dir/tgt_dir
+ test_mkdir $remote_dir/tgt_dir
touch $remote_dir/tgt_file
mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir ||
test_24y() {
[[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
+ local mdtidx=1
- test_mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_dir ||
+ test_mkdir $DIR/$tdir
+ $LFS mkdir -i $mdtidx $remote_dir ||
error "create remote directory failed"
- test_mkdir -p $remote_dir/src_dir
+ test_mkdir $remote_dir/src_dir
touch $remote_dir/src_file
- test_mkdir -p $remote_dir/tgt_dir
+ test_mkdir $remote_dir/tgt_dir
touch $remote_dir/tgt_file
mrename $remote_dir/src_dir $remote_dir/tgt_dir ||
local NFILES=5000
rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ trap simple_cleanup_common EXIT
createmany -m $DIR/$tdir/$tfile $NFILES
local t=$(ls $DIR/$tdir | wc -l)
local u=$(ls $DIR/$tdir | sort -u | wc -l)
error "Expected $NFILES files, got $t ($u unique $v .&..)"
fi
- rm -rf $DIR/$tdir || error "Can not delete directories"
+ simple_cleanup_common || error "Can not delete directories"
}
run_test 24A "readdir() returns correct number of entries."
}
run_test 24C "check .. in striped dir"
-test_24D() { # LU-6101
- local NFILES=50000
-
- rm -rf $DIR/$tdir
- 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)
- local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
- if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
- error "Expected $NFILES files, got $t ($u unique $v .&..)"
- fi
-
- rm -rf $DIR/$tdir || error "Can not delete directories"
-}
-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
run_test 26a "multiple component symlink ======================="
test_26b() {
- test_mkdir -p $DIR/d26b/d26-2
- ln -s d26b/d26-2/foo $DIR/s26-2
+ test_mkdir -p $DIR/$tdir/d26-2
+ ln -s $tdir/d26-2/foo $DIR/s26-2
touch $DIR/s26-2 || error
}
run_test 26b "multiple component symlink at end of lookup ======"
ln -s s26.2-2 $DIR/s26.2-3
chmod 0666 $DIR/s26.2-3/foo
}
-run_test 26c "chain of symlinks ================================"
+run_test 26c "chain of symlinks"
# recursive symlinks (bug 439)
test_26d() {
ln -s d26-3/foo $DIR/d26-3
}
-run_test 26d "create multiple component recursive symlink ======"
+run_test 26d "create multiple component recursive symlink"
test_26e() {
[ ! -h $DIR/d26-3 ] && test_26d
rm $DIR/d26-3
}
-run_test 26e "unlink multiple component recursive symlink ======"
+run_test 26e "unlink multiple component recursive symlink"
# recursive symlinks (bug 7022)
test_26f() {
- test_mkdir -p $DIR/$tdir
- test_mkdir $DIR/$tdir/$tfile || error "mkdir $DIR/$tdir/$tfile failed"
+ test_mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir/$tfile
cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
- test_mkdir -p lndir/bar1 || error "mkdir lndir/bar1 failed"
- test_mkdir $DIR/$tdir/$tfile/$tfile || error "mkdir $tfile failed"
+ test_mkdir -p lndir/bar1
+ test_mkdir $DIR/$tdir/$tfile/$tfile
cd $tfile || error "cd $tfile failed"
ln -s .. dotdot || error "ln dotdot failed"
ln -s dotdot/lndir lndir || error "ln lndir failed"
rm -r $tfile || error "rm $tfile failed"
$CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
}
-run_test 26f "rm -r of a directory which has recursive symlink ="
+run_test 26f "rm -r of a directory which has recursive symlink"
test_27a() {
- echo '== stripe sanity =============================================='
- test_mkdir -p $DIR/d27 || error "mkdir failed"
- $GETSTRIPE $DIR/d27
- $SETSTRIPE -c 1 $DIR/d27/f0 || error "setstripe failed"
- $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed"
- log "== test_27a: write to one stripe file ========================="
- cp /etc/hosts $DIR/d27/f0 || error
+ test_mkdir $DIR/$tdir
+ $LFS getstripe $DIR/$tdir
+ $LFS setstripe -c 1 $DIR/$tdir/$tfile || error "setstripe failed"
+ $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
+ cp /etc/hosts $DIR/$tdir/$tfile || error
}
-run_test 27a "one stripe file =================================="
+run_test 27a "one stripe file"
test_27b() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
- test_mkdir -p $DIR/d27
- $SETSTRIPE -c 2 $DIR/d27/f01 || error "setstripe failed"
- $GETSTRIPE -c $DIR/d27/f01
- [ $($GETSTRIPE -c $DIR/d27/f01) -eq 2 ] ||
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
+ $LFS getstripe -c $DIR/$tdir/$tfile
+ [ $($LFS getstripe -c $DIR/$tdir/$tfile) -eq 2 ] ||
error "two-stripe file doesn't have two stripes"
- dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
}
run_test 27b "create and write to two stripe file"
test_27d() {
- test_mkdir -p $DIR/d27
- $SETSTRIPE -c 0 -i -1 -S 0 $DIR/d27/fdef || error "setstripe failed"
- $CHECKSTAT -t file $DIR/d27/fdef || error "checkstat failed"
- dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4 || error
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 0 -i -1 -S 0 $DIR/$tdir/$tfile ||
+ error "setstripe failed"
+ $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
}
-run_test 27d "create file with default settings ================"
+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"
- $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed"
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 2 $DIR/$tdir/$tfile || error "setstripe failed"
+ $LFS setstripe -c 2 $DIR/$tdir/$tfile && error "setstripe worked twice"
+ $CHECKSTAT -t file $DIR/$tdir/$tfile || error "checkstat failed"
}
-run_test 27e "setstripe existing file (should return error) ======"
+run_test 27e "setstripe existing file (should return error)"
test_27f() {
test_mkdir $DIR/$tdir
- $SETSTRIPE -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
+ $LFS setstripe -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
error "$SETSTRIPE $DIR/$tdir/$tfile failed"
$CHECKSTAT -t file $DIR/$tdir/$tfile &&
error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
- $GETSTRIPE $DIR/$tdir/$tfile || error "$GETSTRIPE failed"
+ $LFS getstripe $DIR/$tdir/$tfile || error "$LFS getstripe failed"
}
run_test 27f "setstripe with bad stripe size (should return error)"
test_27g() {
- test_mkdir -p $DIR/d27
- $MCREATE $DIR/d27/fnone || error "mcreate failed"
- $GETSTRIPE $DIR/d27/fnone 2>&1 | grep "no stripe info" ||
- error "$DIR/d27/fnone has object"
+ test_mkdir $DIR/$tdir
+ $MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
+ $LFS getstripe $DIR/$tdir/$tfile 2>&1 | grep "no stripe info" ||
+ error "$DIR/$tdir/$tfile has object"
}
-run_test 27g "$GETSTRIPE with no objects"
+run_test 27g "$LFS getstripe with no objects"
test_27i() {
test_mkdir $DIR/$tdir
touch $DIR/$tdir/$tfile || error "touch failed"
- [[ $($GETSTRIPE -c $DIR/$tdir/$tfile) -gt 0 ]] ||
+ [[ $($LFS getstripe -c $DIR/$tdir/$tfile) -gt 0 ]] ||
error "missing objects"
}
-run_test 27i "$GETSTRIPE with some objects"
+run_test 27i "$LFS getstripe with some objects"
test_27j() {
- test_mkdir -p $DIR/d27
- $SETSTRIPE -i $OSTCOUNT $DIR/d27/f27j && error "setstripe failed"||true
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -i $OSTCOUNT $DIR/$tdir/$tfile &&
+ error "setstripe failed" || true
}
run_test 27j "setstripe with bad stripe offset (should return error)"
test_27k() { # bug 2844
- test_mkdir -p $DIR/d27
- FILE=$DIR/d27/f27k
- LL_MAX_BLKSIZE=$((4 * 1024 * 1024))
- [ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27
- $SETSTRIPE -S 67108864 $FILE || error "setstripe failed"
- BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE"
- dd if=/dev/zero of=$FILE bs=4k count=1
- BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE"
-}
-run_test 27k "limit i_blksize for broken user apps ============="
+ test_mkdir $DIR/$tdir
+ local file=$DIR/$tdir/$tfile
+ local ll_max_blksize=$((4 * 1024 * 1024))
+ $LFS setstripe -S 67108864 $file || error "setstripe failed"
+ local blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
+ [ $blksize -le $ll_max_blksize ] || error "1:$blksize > $ll_max_blksize"
+ dd if=/dev/zero of=$file bs=4k count=1
+ blksize=$(stat $file | awk '/IO Block:/ { print $7 }')
+ [ $blksize -le $ll_max_blksize ] || error "2:$blksize > $ll_max_blksize"
+}
+run_test 27k "limit i_blksize for broken user apps"
test_27l() {
- test_mkdir -p $DIR/d27
- mcreate $DIR/f27l || error "creating file"
- $RUNAS $SETSTRIPE -c 1 $DIR/f27l && \
+ mcreate $DIR/$tfile || error "creating file"
+ $RUNAS $LFS setstripe -c 1 $DIR/$tfile &&
error "setstripe should have failed" || true
}
run_test 27l "check setstripe permissions (should return error)"
test_27m() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" &&
- return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail |
head -n1)
return
fi
trap simple_cleanup_common EXIT
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_1
- dd if=/dev/zero of=$DIR/$tdir/f27m_1 bs=1024 count=$MAXFREE &&
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.1
+ dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=1024 count=$MAXFREE &&
error "dd should fill OST0"
i=2
- while $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_$i; do
+ while $LFS setstripe -i 0 -c 1 $DIR/$tdir/$tfile.$i; do
i=$((i + 1))
[ $i -gt 256 ] && break
done
i=$((i + 1))
- touch $DIR/$tdir/f27m_$i
- [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] &&
+ touch $DIR/$tdir/$tfile.$i
+ [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
+ awk '{print $1}'| grep -w "0") ] &&
error "OST0 was full but new created file still use it"
i=$((i + 1))
- touch $DIR/$tdir/f27m_$i
- [ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] &&
+ touch $DIR/$tdir/$tfile.$i
+ [ $($LFS getstripe $DIR/$tdir/$tfile.$i | grep -A 10 obdidx |
+ awk '{print $1}'| grep -w "0") ] &&
error "OST0 was full but new created file still use it"
simple_cleanup_common
}
-run_test 27m "create file while OST0 was full =================="
+run_test 27m "create file while OST0 was full"
sleep_maxage() {
- local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
- sleep $DELAY
+ local delay=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage |
+ head -n 1 | awk '{ print $1 * 2 }')
+ sleep $delay
}
# OSCs keep a NOSPC flag that will be reset after ~5s (qos_maxage)
}
test_27n() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
reset_enospc
rm -f $DIR/$tdir/$tfile
exhaust_precreations 0 0x80000215
- $SETSTRIPE -c -1 $DIR/$tdir
+ $LFS setstripe -c -1 $DIR/$tdir
touch $DIR/$tdir/$tfile || error
- $GETSTRIPE $DIR/$tdir/$tfile
+ $LFS getstripe $DIR/$tdir/$tfile
reset_enospc
}
-run_test 27n "create file with some full OSTs =================="
+run_test 27n "create file with some full OSTs"
test_27o() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
reset_enospc
rm -rf $DIR/$tdir/*
}
-run_test 27o "create file with all full OSTs (should error) ===="
+run_test 27o "create file with all full OSTs (should error)"
test_27p() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
reset_enospc
rm -f $DIR/$tdir/$tfile
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$MCREATE $DIR/$tdir/$tfile || error "mcreate failed"
$TRUNCATE $DIR/$tdir/$tfile 80000000 || error "truncate failed"
exhaust_precreations 0 0x80000215
echo foo >> $DIR/$tdir/$tfile || error "append failed"
$CHECKSTAT -s 80000004 $DIR/$tdir/$tfile || error "checkstat failed"
- $GETSTRIPE $DIR/$tdir/$tfile
+ $LFS getstripe $DIR/$tdir/$tfile
reset_enospc
}
-run_test 27p "append to a truncated file with some full OSTs ==="
+run_test 27p "append to a truncated file with some full OSTs"
test_27q() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
reset_enospc
rm -f $DIR/$tdir/$tfile
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
- $TRUNCATE $DIR/$tdir/$tfile 80000000 ||error "truncate $DIR/$tdir/$tfile failed"
+ $TRUNCATE $DIR/$tdir/$tfile 80000000 ||
+ error "truncate $DIR/$tdir/$tfile failed"
$CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
exhaust_all_precreations 0x215
reset_enospc
}
-run_test 27q "append to truncated file with all OSTs full (should error) ==="
+run_test 27q "append to truncated file with all OSTs full (should error)"
test_27r() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
rm -f $DIR/$tdir/$tfile
exhaust_precreations 0 0x80000215
- $SETSTRIPE -i 0 -c 2 $DIR/$tdir/$tfile # && error
+ $LFS setstripe -i 0 -c 2 $DIR/$tdir/$tfile # && error
reset_enospc
}
run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
test_27s() { # bug 10725
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local stripe_size=$((4096 * 1024 * 1024)) # 2^32
local stripe_count=0
[ $OSTCOUNT -eq 1 ] || stripe_count=2
- $SETSTRIPE -S $stripe_size -c $stripe_count $DIR/$tdir &&
+ $LFS setstripe -S $stripe_size -c $stripe_count $DIR/$tdir &&
error "stripe width >= 2^32 succeeded" || true
}
run_test 27t "check that utils parse path correctly"
test_27u() { # bug 4900
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local index
local list=$(comma_list $(mdts_nodes))
#define OBD_FAIL_MDS_OSC_PRECREATE 0x139
do_nodes $list $LCTL set_param fail_loc=0x139
test_mkdir -p $DIR/$tdir
- rm -rf $DIR/$tdir/*
+ trap simple_cleanup_common EXIT
createmany -o $DIR/$tdir/t- 1000
do_nodes $list $LCTL set_param fail_loc=0
TLOG=$TMP/$tfile.getstripe
- $GETSTRIPE $DIR/$tdir > $TLOG
+ $LFS getstripe $DIR/$tdir > $TLOG
OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
unlinkmany $DIR/$tdir/t- 1000
+ trap 0
[[ $OBJS -gt 0 ]] &&
- error "$OBJS objects created on OST-0. See $TLOG" || pass
+ error "$OBJS objects created on OST-0. See $TLOG" ||
+ rm -f $TLOG
}
-run_test 27u "skip object creation on OSC w/o objects =========="
+run_test 27u "skip object creation on OSC w/o objects"
test_27v() { # bug 4900
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
- exhaust_all_precreations 0x215
- reset_enospc
+ exhaust_all_precreations 0x215
+ reset_enospc
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file
+ $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
touch $DIR/$tdir/$tfile
#define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
sleep $((TIMEOUT / 2 - PROCESS))
reset_enospc
}
-run_test 27v "skip object creation on slow OST ================="
+run_test 27v "skip object creation on slow OST"
test_27w() { # bug 10997
- test_mkdir -p $DIR/$tdir || error "mkdir failed"
- $SETSTRIPE -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
- [ $($GETSTRIPE -S $DIR/$tdir/f0) -ne 65536 ] &&
- error "stripe size $size != 65536" || true
- [ $($GETSTRIPE -d $DIR/$tdir | grep -c "stripe_count") -ne 1 ] &&
- error "$GETSTRIPE -d $DIR/$tdir failed" || true
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -S 65536 $DIR/$tdir/f0 || error "setstripe failed"
+ [ $($LFS getstripe -S $DIR/$tdir/f0) -ne 65536 ] &&
+ error "stripe size $size != 65536" || true
+ [ $($LFS getstripe -d $DIR/$tdir | grep -c "stripe_count") -eq 0 ] &&
+ error "$LFS getstripe -d $DIR/$tdir no 'stripe_count'" || true
}
-run_test 27w "check $SETSTRIPE -S option"
+run_test 27w "check $LFS setstripe -S and getstrip -d options"
test_27wa() {
[[ $OSTCOUNT -lt 2 ]] &&
skip_env "skipping multiple stripe count/offset test" && return
- test_mkdir -p $DIR/$tdir || error "mkdir failed"
- for i in $(seq 1 $OSTCOUNT); do
- offset=$((i - 1))
- $SETSTRIPE -c $i -i $offset $DIR/$tdir/f$i ||
- error "setstripe -c $i -i $offset failed"
- count=$($GETSTRIPE -c $DIR/$tdir/f$i)
- index=$($GETSTRIPE -i $DIR/$tdir/f$i)
- [ $count -ne $i ] && error "stripe count $count != $i" || true
- [ $index -ne $offset ] &&
- error "stripe offset $index != $offset" || true
- done
+ test_mkdir $DIR/$tdir
+ for i in $(seq 1 $OSTCOUNT); do
+ offset=$((i - 1))
+ $LFS setstripe -c $i -i $offset $DIR/$tdir/f$i ||
+ error "setstripe -c $i -i $offset failed"
+ count=$($LFS getstripe -c $DIR/$tdir/f$i)
+ index=$($LFS getstripe -i $DIR/$tdir/f$i)
+ [ $count -ne $i ] && error "stripe count $count != $i" || true
+ [ $index -ne $offset ] &&
+ error "stripe offset $index != $offset" || true
+ done
}
-run_test 27wa "check $SETSTRIPE -c -i options"
+run_test 27wa "check $LFS setstripe -c -i options"
test_27x() {
remote_ost_nodsh && skip "remote OST with nodsh" && return
- [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
OFFSET=$(($OSTCOUNT - 1))
OSTIDX=0
local OST=$(ostname_from_index $OSTIDX)
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe per file
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 1 $DIR/$tdir # 1 stripe per file
do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 1
sleep_maxage
createmany -o $DIR/$tdir/$tfile $OSTCOUNT
- for i in `seq 0 $OFFSET`; do
- [ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}' | grep -w "$OSTIDX"` ] &&
+ for i in $(seq 0 $OFFSET); do
+ [ $($LFS getstripe $DIR/$tdir/$tfile$i | grep -A 10 obdidx |
+ awk '{print $1}' | grep -w "$OSTIDX") ] &&
error "OST0 was degraded but new created file still use it"
done
do_facet ost$((OSTIDX + 1)) lctl set_param -n obdfilter.$OST.degraded 0
run_test 27x "create files while OST0 is degraded"
test_27y() {
- [[ $OSTCOUNT -lt 2 ]] &&
- skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- remote_ost_nodsh && skip "remote OST with nodsh" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
- local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
- osc.$mdtosc.prealloc_last_id)
- local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
- osc.$mdtosc.prealloc_next_id)
- local fcount=$((last_id - next_id))
+ local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
+ local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
+ osc.$mdtosc.prealloc_last_id)
+ local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
+ osc.$mdtosc.prealloc_next_id)
+ local fcount=$((last_id - next_id))
[[ $fcount -eq 0 ]] && skip "not enough space on OST0" && return
[[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
done
OSTIDX=$(index_from_ostuuid $OST)
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 1 $DIR/$tdir # 1 stripe / file
for OSC in $MDS_OSCS; do
OST=$(osc_to_ost $OSC)
done
# all osp devices get activated, hence -1 stripe count restored
- local stripecnt=0
+ local stripe_count=0
# sleep 2*lod_qos_maxage seconds waiting for lod qos to notice osp
# devices get activated.
sleep_maxage
- $SETSTRIPE -c -1 $DIR/$tfile
- stripecnt=$($GETSTRIPE -c $DIR/$tfile)
+ $LFS setstripe -c -1 $DIR/$tfile
+ stripe_count=$($LFS getstripe -c $DIR/$tfile)
rm -f $DIR/$tfile
- [ $stripecnt -ne $OSTCOUNT ] &&
- error "Of $OSTCOUNT OSTs, only $stripecnt is available"
+ [ $stripe_count -ne $OSTCOUNT ] &&
+ error "Of $OSTCOUNT OSTs, only $stripe_count is available"
return 0
}
run_test 27y "create files while OST0 is degraded and the rest inactive"
fi
local obj_file="O/$seq/d$((oid %32))/$oid_hex"
- local ff
+ local ff=""
#
# Don't unmount/remount the OSTs if we don't need to do that.
# LU-2577 changes filter_fid to be smaller, so debugfs needs
# update too, until that use mount/ll_decode_filter_fid/mount.
# Re-enable when debugfs will understand new filter_fid.
#
- if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then
+ if [ $(facet_fstype ost$ost) == ldiskfs ]; then
ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
$dev 2>/dev/null" | grep "parent=")
- else
+ fi
+ if [ -z "$ff" ]; then
stop ost$ost
mount_fstype ost$ost
ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
# /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
# fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
- local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
- local ff_pseq=$(echo $ff_parent | cut -d: -f1)
- local ff_poid=$(echo $ff_parent | cut -d: -f2)
+ #
+ # fid: parent=[0x200000400:0x1e:0x0] stripe=1 stripe_count=2 \
+ # stripe_size=1048576 component_id=1 component_start=0 \
+ # component_end=33554432
+ local ff_parent=$(sed -e 's/.*parent=.//' <<<$ff)
+ local ff_pseq=$(cut -d: -f1 <<<$ff_parent)
+ local ff_poid=$(cut -d: -f2 <<<$ff_parent)
local ff_pstripe
- if echo $ff_parent | grep -q 'stripe='; then
- ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+ if grep -q 'stripe=' <<<$ff; then
+ ff_pstripe=$(sed -e 's/.*stripe=//' -e 's/ .*//' <<<$ff)
else
- #
# $LL_DECODE_FILTER_FID does not print "stripe="; look
- # into f_ver in this case. See the comment on
- # ff_parent.
- #
- ff_pstripe=$(echo $ff_parent | cut -d: -f3 |
- sed -e 's/\]//')
+ # into f_ver in this case. See comment on ff_parent.
+ ff_pstripe=$(cut -d: -f3 <<<$ff_parent | sed -e 's/]//')
fi
- # compare lmm_seq and filter_fid->ff_parent.f_seq
- [ $ff_pseq = $lmm_seq ] ||
- error "FF parent SEQ $ff_pseq != $lmm_seq"
- # compare lmm_object_id and filter_fid->ff_parent.f_oid
- [ $ff_poid = $lmm_oid ] ||
- error "FF parent OID $ff_poid != $lmm_oid"
+ # compare lmm_seq and filter_fid->ff_parent.f_seq
+ [ $ff_pseq = $lmm_seq ] ||
+ error "FF parent SEQ $ff_pseq != $lmm_seq"
+ # compare lmm_object_id and filter_fid->ff_parent.f_oid
+ [ $ff_poid = $lmm_oid ] ||
+ error "FF parent OID $ff_poid != $lmm_oid"
(($ff_pstripe == $stripe_nr)) ||
- error "FF stripe $ff_pstripe != $stripe_nr"
+ error "FF stripe $ff_pstripe != $stripe_nr"
- stripe_nr=$((stripe_nr + 1))
- done
+ stripe_nr=$((stripe_nr + 1))
+ [ $(lustre_version_code client) -lt $(version_code 2.9.55) ] &&
+ continue
+ if grep -q 'stripe_count=' <<<$ff; then
+ local ff_scnt=$(sed -e 's/.*stripe_count=//' \
+ -e 's/ .*//' <<<$ff)
+ [ $lmm_count = $ff_scnt ] ||
+ error "FF stripe count $lmm_count != $ff_scnt"
+ fi
+ done
}
test_27z() {
- remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
- $SETSTRIPE -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
- { error "setstripe -c -1 failed"; return 1; }
- # We need to send a write to every object to get parent FID info set.
- # This _should_ also work for setattr, but does not currently.
- # touch $DIR/$tdir/$tfile-1 ||
- dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
- { error "dd $tfile-1 failed"; return 2; }
- $SETSTRIPE -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
- { error "setstripe -c -1 failed"; return 3; }
- dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
- { error "dd $tfile-2 failed"; return 4; }
+ $LFS setstripe -c 1 -i 0 -S 64k $DIR/$tdir/$tfile-1 ||
+ { error "setstripe -c -1 failed"; return 1; }
+ # We need to send a write to every object to get parent FID info set.
+ # This _should_ also work for setattr, but does not currently.
+ # touch $DIR/$tdir/$tfile-1 ||
+ dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
+ { error "dd $tfile-1 failed"; return 2; }
+ $LFS setstripe -c -1 -i $((OSTCOUNT - 1)) -S 1M $DIR/$tdir/$tfile-2 ||
+ { error "setstripe -c -1 failed"; return 3; }
+ dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
+ { error "dd $tfile-2 failed"; return 4; }
- # make sure write RPCs have been sent to OSTs
- sync; sleep 5; sync
+ # make sure write RPCs have been sent to OSTs
+ sync; sleep 5; sync
- check_seq_oid $DIR/$tdir/$tfile-1 || return 5
- check_seq_oid $DIR/$tdir/$tfile-2 || return 6
+ check_seq_oid $DIR/$tdir/$tfile-1 || return 5
+ check_seq_oid $DIR/$tdir/$tfile-2 || return 6
}
run_test 27z "check SEQ/OID on the MDT and OST filesystems"
run_test 27A "check filesystem-wide default LOV EA values"
test_27B() { # LU-2523
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
touch $DIR/$tdir/f0
# open f1 with O_LOV_DELAY_CREATE
local i
local j
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
cd $DIR/$tdir
for i in $(seq 0 $((OSTCOUNT - 1))); do
# set stripe across all OSTs starting from OST$i
local ost_list=$(seq $first_ost $ost_step $last_ost)
local ost_range="$first_ost $last_ost $ost_step"
- test_mkdir -p $DIR/$tdir
+ if ! combined_mgs_mds ; then
+ mount_mgs_client
+ fi
+
+ test_mkdir $DIR/$tdir
pool_add $POOL || error "pool_add failed"
pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
local skip27D
- [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.64) ] &&
- skip27D = "-s 29"
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ] &&
+ skip27D += "-s 29"
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.9.55) -o \
+ $(lustre_version_code client) -lt $(version_code 2.9.55) ] &&
+ skip27D += "-s 30,31"
llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D ||
error "llapi_layout_test failed"
- cleanup_pools || error "cleanup_pools failed"
+ destroy_test_pools || error "destroy test pools failed"
+
+ if ! combined_mgs_mds ; then
+ umount_mgs_client
+ fi
}
run_test 27D "validate llapi_layout API"
run_test 27E "check that default extended attribute size properly increases"
test_27F() { # LU-5346/LU-7975
-
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.51) ]] &&
skip "Need MDS version at least 2.8.51" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
rm -f $DIR/$tdir/f0
$SETSTRIPE -c 2 $DIR/$tdir
}
test_31o() { # LU-2901
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
for LOOP in $(seq 100); do
rm -f $DIR/$tdir/$tfile*
for THREAD in $(seq 8); do
ls -al $DIR/$tdir/ext2-mountpoint/../d2/test_dir || error
cleanup_test32_mount
}
-run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir ========="
+run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir"
test_32e() {
- [ -e $DIR/d32e ] && rm -fr $DIR/d32e
- test_mkdir -p $DIR/d32e/tmp
- TMP_DIR=$DIR/d32e/tmp
- ln -s $DIR/d32e $TMP_DIR/symlink11
- ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
- $CHECKSTAT -t link $DIR/d32e/tmp/symlink11 || error
- $CHECKSTAT -t link $DIR/d32e/symlink01 || error
+ rm -fr $DIR/$tdir
+ test_mkdir -p $DIR/$tdir/tmp
+ local tmp_dir=$DIR/$tdir/tmp
+ ln -s $DIR/$tdir $tmp_dir/symlink11
+ ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
+ $CHECKSTAT -t link $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
+ $CHECKSTAT -t link $DIR/$tdir/symlink01 || error "symlink01 bad"
}
-run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir ===="
+run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir"
test_32f() {
- [ -e $DIR/d32f ] && rm -fr $DIR/d32f
- test_mkdir -p $DIR/d32f/tmp
- TMP_DIR=$DIR/d32f/tmp
- ln -s $DIR/d32f $TMP_DIR/symlink11
- ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
- ls $DIR/d32f/tmp/symlink11 || error
- ls $DIR/d32f/symlink01 || error
+ rm -fr $DIR/$tdir
+ test_mkdir -p $DIR/$tdir/tmp
+ local tmp_dir=$DIR/$tdir/tmp
+ ln -s $DIR/$tdir $tmp_dir/symlink11
+ ln -s $tmp_dir/symlink11 $tmp_dir/../symlink01
+ ls $DIR/$tdir/tmp/symlink11 || error "symlink11 bad"
+ ls $DIR/$tdir/symlink01 || error "symlink01 bad"
}
-run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir ===="
+run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir"
test_32g() {
- TMP_DIR=$DIR/$tdir/tmp
- test_mkdir -p $DIR/$tdir/tmp
+ local tmp_dir=$DIR/$tdir/tmp
+ test_mkdir -p $tmp_dir
test_mkdir $DIR/${tdir}2
- ln -s $DIR/${tdir}2 $TMP_DIR/symlink12
- ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
- $CHECKSTAT -t link $TMP_DIR/symlink12 || error
- $CHECKSTAT -t link $DIR/$tdir/symlink02 || error
- $CHECKSTAT -t dir -f $TMP_DIR/symlink12 || error
- $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error
+ ln -s $DIR/${tdir}2 $tmp_dir/symlink12
+ ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
+ $CHECKSTAT -t link $tmp_dir/symlink12 || error "symlink12 not a link"
+ $CHECKSTAT -t link $DIR/$tdir/symlink02 || error "symlink02 not a link"
+ $CHECKSTAT -t dir -f $tmp_dir/symlink12 || error "symlink12 not a dir"
+ $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error "symlink12 not a dir"
}
run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
test_32h() {
rm -fr $DIR/$tdir $DIR/${tdir}2
- TMP_DIR=$DIR/$tdir/tmp
- test_mkdir -p $DIR/$tdir/tmp
+ tmp_dir=$DIR/$tdir/tmp
+ test_mkdir -p $tmp_dir
test_mkdir $DIR/${tdir}2
- ln -s $DIR/${tdir}2 $TMP_DIR/symlink12
- ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
- ls $TMP_DIR/symlink12 || error
- ls $DIR/$tdir/symlink02 || error
+ ln -s $DIR/${tdir}2 $tmp_dir/symlink12
+ ln -s $tmp_dir/symlink12 $tmp_dir/../symlink02
+ ls $tmp_dir/symlink12 || error "listing symlink12"
+ ls $DIR/$tdir/symlink02 || error "listing symlink02"
}
run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
$RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
log 33_2
}
-run_test 33aa "write file with mode 444 (should return error) ===="
+run_test 33aa "write file with mode 444 (should return error)"
test_33a() {
- rm -fr $DIR/d33
- test_mkdir -p $DIR/d33
- chown $RUNAS_ID $DIR/d33
- $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33|| error "create"
- $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33 && \
+ rm -fr $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ chown $RUNAS_ID $DIR/$tdir
+ $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile ||
+ error "$RUNAS create $tdir/$tfile failed"
+ $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/$tdir/$tfile &&
error "open RDWR" || true
}
run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
test_33b() {
- rm -fr $DIR/d33
- test_mkdir -p $DIR/d33
- chown $RUNAS_ID $DIR/d33
- $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 || true
+ rm -fr $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ chown $RUNAS_ID $DIR/$tdir
+ $RUNAS $OPENFILE -f 1286739555 $DIR/$tdir/$tfile || true
}
run_test 33b "test open file with malformed flags (No panic)"
test_33c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local ostnum
- local ostname
- local write_bytes
- local all_zeros
+ local ostnum
+ local ostname
+ local write_bytes
+ local all_zeros
- remote_ost_nodsh && skip "remote OST with nodsh" && return
- all_zeros=:
- rm -fr $DIR/d33
- test_mkdir -p $DIR/d33
- # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ all_zeros=:
+ rm -fr $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ # Read: 0, Write: 4, create/destroy: 2/0, stat: 1, punch: 0
sync
for ostnum in $(seq $OSTCOUNT); do
$all_zeros || return 0
- # Write four bytes
- echo foo > $DIR/d33/bar
- # Really write them
- sync
+ # Write four bytes
+ echo foo > $DIR/$tdir/bar
+ # Really write them
+ sync
# Total up write_bytes after writing. We'd better find non-zeros.
for ostnum in $(seq $OSTCOUNT); do
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
$RUNAS $DIR/f35a && error || true
rm $DIR/f35a
}
-run_test 35a "exec file with mode 444 (should return and not leak) ====="
+run_test 35a "exec file with mode 444 (should return and not leak)"
test_36a() {
rm -f $DIR/f36
utime $DIR/f36 || error
}
-run_test 36a "MDS utime check (mknod, utime) ==================="
+run_test 36a "MDS utime check (mknod, utime)"
test_36b() {
echo "" > $DIR/f36
utime $DIR/f36 || error
}
-run_test 36b "OST utime check (open, utime) ===================="
+run_test 36b "OST utime check (open, utime)"
test_36c() {
rm -f $DIR/d36/f36
chown $RUNAS_ID $DIR/d36
$RUNAS utime $DIR/d36/f36 || error
}
-run_test 36c "non-root MDS utime check (mknod, utime) =========="
+run_test 36c "non-root MDS utime check (mknod, utime)"
test_36d() {
[ ! -d $DIR/d36 ] && test_36c
echo "" > $DIR/d36/f36
$RUNAS utime $DIR/d36/f36 || error
}
-run_test 36d "non-root OST utime check (open, utime) ==========="
+run_test 36d "non-root OST utime check (open, utime)"
test_36e() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
touch $DIR/$tdir/$tfile
- $RUNAS utime $DIR/$tdir/$tfile && \
+ $RUNAS utime $DIR/$tdir/$tfile &&
error "utime worked, expected failure" || true
}
-run_test 36e "utime on non-owned file (should return error) ===="
+run_test 36e "utime on non-owned file (should return error)"
subr_36fh() {
local fl="$1"
export LANG=C LC_LANG=C # for date language
DATESTR="Dec 20 2000"
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
lctl set_param fail_loc=$fl
date; date +%s
cp /etc/hosts $DIR/$tdir/$tfile
local fmd_before
local fmd_after
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
fmd_max_age=$(do_facet ost1 \
"lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \
head -n 1")
error "O_TRUNC didn't change timestamps"
fi
}
-run_test 39a "mtime changed on create ==========================="
+run_test 39a "mtime changed on create"
test_39b() {
- test_mkdir -p -c1 $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir
cp -p /etc/passwd $DIR/$tdir/fopen
cp -p /etc/passwd $DIR/$tdir/flink
cp -p /etc/passwd $DIR/$tdir/funlink
error "wrong links count $links1 != $links3"
return 0
}
-run_test 39o "directory cached attributes updated after create ========"
+run_test 39o "directory cached attributes updated after create"
test_39p() {
[[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
- TESTDIR=$DIR/$tdir/$tfile
+ TESTDIR=$DIR/$tdir/$tdir
[ -e $TESTDIR ] && rm -rf $TESTDIR
test_mkdir -p $TESTDIR
cd $TESTDIR
links1=2
ls
- $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir1
- $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir2
+ test_mkdir -i $MDTIDX $TESTDIR/remote_dir1
+ test_mkdir -i $MDTIDX $TESTDIR/remote_dir2
ls
links2=$(stat -c %h .)
[ $(($links1 + 2)) != $links2 ] &&
run_test 41 "test small file write + fstat ====================="
count_ost_writes() {
- lctl get_param -n osc.*.stats |
+ lctl get_param -n ${OSC}.*.stats |
awk -vwrites=0 '/ost_write/ { writes += $2 } \
END { printf("%0.0f", writes) }'
}
test_42a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
setup_test42
- cancel_lru_locks osc
+ cancel_lru_locks $OSC
stop_writeback
sync; sleep 1; sync # just to be safe
BEFOREWRITES=`count_ost_writes`
error "$BEFOREWRITES < $AFTERWRITES"
start_writeback
}
-run_test 42a "ensure that we don't flush on close =============="
+run_test 42a "ensure that we don't flush on close"
test_42b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
setup_test42
- cancel_lru_locks osc
+ cancel_lru_locks $OSC
stop_writeback
sync
dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
# start the file with a full-file pw lock to match against
# until the truncate.
trunc_test() {
- test=$1
- file=$DIR/$test
- offset=$2
- cancel_lru_locks osc
+ test=$1
+ file=$DIR/$test
+ offset=$2
+ cancel_lru_locks $OSC
stop_writeback
# prime the file with 0,EOF PW to match
touch $file
$TRUNCATE $file 0
sync; sync
# now the real test..
- dd if=/dev/zero of=$file bs=1024 count=100
- BEFOREWRITES=`count_ost_writes`
- $TRUNCATE $file $offset
- cancel_lru_locks osc
- AFTERWRITES=`count_ost_writes`
+ dd if=/dev/zero of=$file bs=1024 count=100
+ BEFOREWRITES=`count_ost_writes`
+ $TRUNCATE $file $offset
+ cancel_lru_locks $OSC
+ AFTERWRITES=`count_ost_writes`
start_writeback
}
local max_dirty_mb
local warmup_files
- test_mkdir -p $DIR/${tdir}e
+ test_mkdir $DIR/${tdir}e
$SETSTRIPE -c 1 $TDIR
createmany -o $TDIR/f $files
run_test 42e "verify sub-RPC writes are not done synchronously"
test_43A() { # was test_43
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
cp -p /bin/ls $DIR/$tdir/$tfile
$MULTIOP $DIR/$tdir/$tfile Ow_c &
pid=$!
# give multiop a chance to open
sleep 1
- $DIR/$tdir/$tfile && error || true
+ $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true
kill -USR1 $pid
}
run_test 43A "execution of file opened for write should return -ETXTBSY"
test_43a() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
- cp -p `which $MULTIOP` $DIR/$tdir/multiop ||
- cp -p multiop $DIR/$tdir/multiop
+ test_mkdir $DIR/$tdir
+ cp -p $(which $MULTIOP) $DIR/$tdir/multiop ||
+ cp -p multiop $DIR/$tdir/multiop
MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
- return 1
- MULTIOP_PID=$!
- $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success"
- kill -USR1 $MULTIOP_PID || return 2
- wait $MULTIOP_PID || return 3
- rm $TMP/$tfile.junk $DIR/$tdir/multiop
+ error "multiop open $TMP/$tfile.junk failed"
+ rm $TMP/$tfile.junk # delete junk file on close (not part of test)
+ MULTIOP_PID=$!
+ $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success"
+ kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed"
+ wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed"
}
run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
test_43b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
- cp -p `which $MULTIOP` $DIR/$tdir/multiop ||
- cp -p multiop $DIR/$tdir/multiop
+ test_mkdir $DIR/$tdir
+ cp -p $(which $MULTIOP) $DIR/$tdir/multiop ||
+ cp -p multiop $DIR/$tdir/multiop
MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
- return 1
- MULTIOP_PID=$!
- $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success"
- kill -USR1 $MULTIOP_PID || return 2
- wait $MULTIOP_PID || return 3
- rm $TMP/$tfile.junk $DIR/$tdir/multiop
+ error "multiop open $TMP/$tfile.junk failed"
+ rm $TMP/$tfile.junk # delete junk file on close (not part of test)
+ MULTIOP_PID=$!
+ $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success"
+ kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed"
+ wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed"
}
run_test 43b "truncate of file being executed should return -ETXTBSY"
test_43c() {
local testdir="$DIR/$tdir"
- test_mkdir -p $DIR/$tdir
+ test_mkdir $testdir
cp $SHELL $testdir/
- ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) | \
- ( cd $testdir && md5sum -c)
+ ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) |
+ ( cd $testdir && md5sum -c )
}
-run_test 43c "md5sum of copy into lustre========================"
+run_test 43c "md5sum of copy into lustre"
test_44A() { # was test_44
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
dd if=$DIR/f1 bs=4k count=1 > /dev/null
}
-run_test 44A "zero length read from a sparse stripe ============="
+run_test 44A "zero length read from a sparse stripe"
test_44a() {
local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
dirty_osc_total() {
tot=0
- for d in `lctl get_param -n osc.*.cur_dirty_bytes`; do
+ for d in `lctl get_param -n ${OSC}.*.cur_dirty_bytes`; do
tot=$(($tot + $d))
done
echo $tot
test_mkdir $DIR/$tdir
cd $DIR/$tdir
mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed"
- test_mkdir $DIR/$tdir || error "recreate directory failed"
+ test_mkdir $DIR/$tdir
touch foo || error "'touch foo' failed after recreating cwd"
- test_mkdir bar || error "'mkdir foo' failed after recreating cwd"
+ test_mkdir bar
touch .foo || error "'touch .foo' failed after recreating cwd"
- test_mkdir .bar || error "'mkdir .foo' failed after recreating cwd"
+ test_mkdir .bar
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"
- test_mkdir . && error "'mkdir .' worked after recreating cwd"
+ mkdir . && error "'mkdir .' worked after recreating cwd"
rmdir . && error "'rmdir .' worked after recreating cwd"
ln -s . baz || error "'ln -s .' failed after recreating cwd"
cd .. || error "'cd ..' failed after recreating cwd"
cd $DIR/$tdir
rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed"
touch foo && error "'touch foo' worked after removing cwd"
- test_mkdir foo && error "'mkdir foo' worked after removing cwd"
+ 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"
+ 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"
- test_mkdir . && error "'mkdir .' worked after removing cwd"
+ 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
cd $DIR/$tdir/dir
$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"
+ $TRACE 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"
+ 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"
- $TRACE test_mkdir . && error "'mkdir .' worked after removing cwd"
+ $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
$TRACE rmdir . && error "'rmdir .' worked after removing cwd"
$TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
$TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
$TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed"
$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"
+ $TRACE mkdir foo && error "mkdir foo worked after removing parent"
touch .foo && error "'touch .foo' worked after removing parent"
- test_mkdir .foo && error "mkdir .foo worked after removing parent"
+ 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"
- $TRACE test_mkdir . && error "'mkdir .' worked after removing parent"
+ $TRACE mkdir . && error "'mkdir .' worked after removing parent"
$TRACE rmdir . && error "'rmdir .' worked after removing parent"
$TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
true
# cleanup the directory
rm -fr $dir
- test_mkdir -p -c1 $dir
+ test_mkdir -c1 $dir
$LFS df
$LFS df -i
[[ $numfree -lt $nrdirs ]] && skip "not enough blocks ($numfree)" &&
return
- trap cleanup_print_lfsdf EXIT
+ trap cleanup_print_lfs_df EXIT
# create files
- createmany -d $dir/d $nrdirs ||
+ createmany -d $dir/d $nrdirs || {
+ unlinkmany $dir/d $nrdirs
error "failed to create $nrdirs subdirs in MDT$mdtidx:$dir"
+ }
# really created :
nrdirs=$(ls -U $dir | wc -l)
test_51d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [[ $OSTCOUNT -lt 3 ]] &&
- skip_env "skipping test with few OSTs" && return
- test_mkdir -p $DIR/$tdir
+ [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs" && return
+ test_mkdir $DIR/$tdir
createmany -o $DIR/$tdir/t- 1000
- $GETSTRIPE $DIR/$tdir > $TMP/$tfile
+ $LFS getstripe $DIR/$tdir > $TMP/$tfile
for N in $(seq 0 $((OSTCOUNT - 1))); do
OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
END { printf("%0.0f", objs) }' $TMP/$tfile)
test_51e() {
if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then
- skip "Only applicable to ldiskfs-based MDTs"
+ skip "ldiskfs only test"
return
fi
- test_mkdir -c1 $DIR/$tdir || error "create $tdir failed"
- test_mkdir -c1 $DIR/$tdir/d0 || error "create d0 failed"
+ test_mkdir -c1 $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir/d0
touch $DIR/$tdir/d0/foo
createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
}
run_test 51e "check file nlink limit"
+test_51f() {
+ test_mkdir $DIR/$tdir
+
+ local max=100000
+ local ulimit_old=$(ulimit -n)
+ local spare=20 # number of spare fd's for scripts/libraries, etc.
+ local mdt=$(lfs getstripe -M $DIR/$tdir)
+ local numfree=$(lfs df -i $DIR/$tdir | awk '/MDT:'$mdt'/ { print $4 }')
+
+ echo "MDT$mdt numfree=$numfree, max=$max"
+ [[ $numfree -gt $max ]] && numfree=$max || numfree=$((numfree * 7 / 8))
+ if [ $((numfree + spare)) -gt $ulimit_old ]; then
+ while ! ulimit -n $((numfree + spare)); do
+ numfree=$((numfree * 3 / 4))
+ done
+ echo "changed ulimit from $ulimit_old to $((numfree + spare))"
+ else
+ echo "left ulimit at $ulimit_old"
+ fi
+
+ createmany -o -k -t 120 $DIR/$tdir/f $numfree || {
+ unlinkmany $DIR/$tdir/f $numfree
+ error "create+open $numfree files in $DIR/$tdir failed"
+ }
+ ulimit -n $ulimit_old
+
+ # if createmany exits at 120s there will be fewer than $numfree files
+ unlinkmany $DIR/$tdir/f $numfree || true
+}
+run_test 51f "check many open files limit"
+
test_52a() {
[ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
touch $DIR/$tdir/foo
chattr +a $DIR/$tdir/foo || error "chattr +a failed"
echo bar >> $DIR/$tdir/foo || error "append bar failed"
test_52b() {
[ -f $DIR/$tdir/foo ] && chattr -i $DIR/$tdir/foo
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
touch $DIR/$tdir/foo
chattr +i $DIR/$tdir/foo || error "chattr +i failed"
cat test > $DIR/$tdir/foo && error "cat test worked"
run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
test_54a() {
+ perl -MSocket -e ';' || { skip "no Socket perl module installed" && return; }
+
$SOCKETSERVER $DIR/socket ||
error "$SOCKETSERVER $DIR/socket failed: $?"
$SOCKETCLIENT $DIR/socket ||
losetup $loopdev $DIR/$tfile ||
error "can't set up $loopdev for $DIR/$tfile"
mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
mount -t ext2 $loopdev $DIR/$tdir ||
error "error mounting $loopdev on $DIR/$tdir"
dd if=/dev/zero of=$DIR/$tdir/tmp bs=$(get_page_size client) count=30 ||
}
run_test 56b "check $LFS getdirstripe"
+test_56c() {
+ local ost_idx=0
+ local ost_name=$(ostname_from_index $ost_idx)
+
+ local old_status=$(ost_dev_status $ost_idx)
+ [[ -z "$old_status" ]] ||
+ { skip_env "OST $ost_name is in $old_status status"; return 0; }
+
+ do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=1
+ sleep_maxage
+
+ local new_status=$(ost_dev_status $ost_idx)
+ [[ "$new_status" = "D" ]] ||
+ error "OST $ost_name is in status of '$new_status', not 'D'"
+
+ do_facet ost1 $LCTL set_param -n obdfilter.$ost_name.degraded=0
+ sleep_maxage
+
+ new_status=$(ost_dev_status $ost_idx)
+ [[ -z "$new_status" ]] ||
+ error "OST $ost_name is in status of '$new_status', not ''"
+}
+run_test 56c "check 'lfs df' showing device status"
+
NUMFILES=3
NUMDIRS=3
setup_56() {
"found $NUMS, expected $EXPECTED"
done
}
-run_test 56h "check lfs find ! -name ============================="
+run_test 56h "check lfs find ! -name"
test_56i() {
- tdir=${tdir}i
- test_mkdir -p $DIR/$tdir
- UUID=$(ostuuid_from_index 0 $DIR/$tdir)
- CMD="$LFIND -ost $UUID $DIR/$tdir"
- OUT=$($CMD)
- [ -z "$OUT" ] || error "\"$CMD\" returned directory '$OUT'"
+ tdir=${tdir}i
+ test_mkdir $DIR/$tdir
+ UUID=$(ostuuid_from_index 0 $DIR/$tdir)
+ CMD="$LFIND -ost $UUID $DIR/$tdir"
+ OUT=$($CMD)
+ [ -z "$OUT" ] || error "'$CMD' returned directory '$OUT'"
}
-run_test 56i "check 'lfs find -ost UUID' skips directories ======="
+run_test 56i "check 'lfs find -ost UUID' skips directories"
test_56j() {
TDIR=$DIR/${tdir}g
test_56s() { # LU-611
TDIR=$DIR/${tdir}s
- setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT"
+ #LU-9369
+ setup_56 0 $NUMDIRS
+ for i in $(seq 1 $NUMDIRS); do
+ $SETSTRIPE -c $((OSTCOUNT + 1)) $TDIR/dir$i/$tfile
+ done
+ EXPECTED=$NUMDIRS
+ CMD="$LFIND -c $OSTCOUNT $TDIR"
+ NUMS=$($CMD | wc -l)
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
+ error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
+ rm -rf $TDIR
+
+ setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT"
if [[ $OSTCOUNT -gt 1 ]]; then
$SETSTRIPE -c 1 $TDIR/$tfile.{0,1,2,3}
ONESTRIPE=4
test_56t() { # LU-611
TDIR=$DIR/${tdir}t
- setup_56 $NUMFILES $NUMDIRS "--stripe-size 512k"
-
- $SETSTRIPE -S 256k $TDIR/$tfile.{0,1,2,3}
- EXPECTED=$(((NUMDIRS + 1) * NUMFILES))
+ #LU-9369
+ setup_56 0 $NUMDIRS
+ for i in $(seq 1 $NUMDIRS); do
+ $SETSTRIPE -S 4M $TDIR/dir$i/$tfile
+ done
+ EXPECTED=$NUMDIRS
+ CMD="$LFIND -S 4M $TDIR"
+ NUMS=$($CMD | wc -l)
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
+ error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
+ rm -rf $TDIR
+
+ setup_56 $NUMFILES $NUMDIRS "--stripe-size 512k"
+
+ $SETSTRIPE -S 256k $TDIR/$tfile.{0,1,2,3}
+
+ EXPECTED=$(((NUMDIRS + 1) * NUMFILES))
CMD="$LFIND -stripe-size 512k -type f $TDIR"
NUMS=$($CMD | wc -l)
[ $NUMS -eq $EXPECTED ] ||
run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' ======="
test_56w() {
- [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" &&
- return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
TDIR=$DIR/${tdir}w
- rm -rf $TDIR || error "remove $TDIR failed"
- setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
-
- local stripe_size
- stripe_size=$($GETSTRIPE -S -d $TDIR) ||
- error "$GETSTRIPE -S -d $TDIR failed"
- stripe_size=${stripe_size%% *}
-
- 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.$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
-
- local dd_bs=65536
- local dd_count=$((file_size / dd_bs))
-
- # write data into the files
- local i
- local j
- local file
- for i in $(seq 1 $NUMFILES); do
- file=$TDIR/file$i
- yes | dd bs=$dd_bs count=$dd_count of=$file >/dev/null 2>&1 ||
- error "write data into $file failed"
- done
- for i in $(seq 1 $NUMDIRS); do
- for j in $(seq 1 $NUMFILES); do
- file=$TDIR/dir$i/file$j
- yes | dd bs=$dd_bs count=$dd_count of=$file \
- >/dev/null 2>&1 ||
- error "write data into $file failed"
- done
- done
+ rm -rf $TDIR || error "remove $TDIR failed"
+ setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1"
- local expected=-1
- [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
+ local stripe_size
+ stripe_size=$($GETSTRIPE -S -d $TDIR) ||
+ error "$GETSTRIPE -S -d $TDIR failed"
+ stripe_size=${stripe_size%% *}
- # lfs_migrate file
- local cmd="$LFS_MIGRATE -y -c $expected $TDIR/file1"
- echo "$cmd"
- eval $cmd || error "$cmd failed"
+ 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.$FSNAME-clilov-*.kbytesavail |
+ head -n1)
+ [[ $free_space -le $((required_space / 1024)) ]] &&
+ skip_env "need $required_space bytes, have $free_space KB" &&
+ return
+
+ local dd_bs=65536
+ local dd_count=$((file_size / dd_bs))
+
+ # write data into the files
+ local i
+ local j
+ local file
+ for i in $(seq 1 $NUMFILES); do
+ file=$TDIR/file$i
+ yes | dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
+ error "write data into $file failed"
+ done
+ for i in $(seq 1 $NUMDIRS); do
+ for j in $(seq 1 $NUMFILES); do
+ file=$TDIR/dir$i/file$j
+ yes|dd bs=$dd_bs count=$dd_count of=$file &>/dev/null ||
+ error "write data into $file failed"
+ done
+ done
+
+ # $LFS_MIGRATE will fail if hard link migration is unsupported
+ if [[ $(lustre_version_code mds1) -gt $(version_code 2.5.55) ]]; then
+ createmany -l$TDIR/dir1/file1 $TDIR/dir1/link 200 ||
+ error "creating links to $TDIR/dir1/file1 failed"
+ fi
+
+ local expected=-1
+ [[ $OSTCOUNT -gt 1 ]] && expected=$((OSTCOUNT - 1))
- check_stripe_count $TDIR/file1 $expected
+ # lfs_migrate file
+ local cmd="$LFS_MIGRATE -y -c $expected $TDIR/file1"
+ echo "$cmd"
+ eval $cmd || error "$cmd failed"
+
+ check_stripe_count $TDIR/file1 $expected
if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.90) ];
then
test_56x() {
check_swap_layouts_support && return 0
- [[ $OSTCOUNT -lt 2 ]] &&
- skip_env "need 2 OST, skipping test" && return
-
- local dir0=$DIR/$tdir/$testnum
- test_mkdir -p $dir0 || error "creating dir $dir0"
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ local dir0=$DIR/$tdir
local ref1=/etc/passwd
local file1=$dir0/file1
- $SETSTRIPE -c 2 $file1
+ test_mkdir $dir0 || error "creating dir $dir0"
+ $LFS setstripe -c 2 $file1
cp $ref1 $file1
$LFS migrate -c 1 $file1 || error "migrate failed rc = $?"
- stripe=$($GETSTRIPE -c $file1)
+ stripe=$($LFS getstripe -c $file1)
[[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
test_56xa() {
check_swap_layouts_support && return 0
- [[ $OSTCOUNT -lt 2 ]] &&
- skip_env "need 2 OST, skipping test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
local dir0=$DIR/$tdir/$testnum
- test_mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p $dir0
local ref1=/etc/passwd
local file1=$dir0/file1
- $SETSTRIPE -c 2 $file1
+ $LFS setstripe -c 2 $file1
cp $ref1 $file1
$LFS migrate --block -c 1 $file1 || error "migrate failed rc = $?"
- local stripe=$($GETSTRIPE -c $file1)
+ local stripe=$($LFS getstripe -c $file1)
[[ $stripe == 1 ]] || error "stripe of $file1 is $stripe != 1"
cmp $file1 $ref1 || error "content mismatch $file1 differs from $ref1"
}
run_test 56xa "lfs migration --block support"
+check_migrate_links() {
+ local dir="$1"
+ local file1="$dir/file1"
+ local begin="$2"
+ local count="$3"
+ local total_count=$(($begin + $count - 1))
+ local symlink_count=10
+ local uniq_count=10
+
+ if [ ! -f "$file1" ]; then
+ echo -n "creating initial file..."
+ $LFS setstripe -c 1 -S "512k" "$file1" ||
+ error "cannot setstripe initial file"
+ echo "done"
+
+ echo -n "creating symlinks..."
+ for s in $(seq 1 $symlink_count); do
+ ln -s "$file1" "$dir/slink$s" ||
+ error "cannot create symlinks"
+ done
+ echo "done"
+
+ echo -n "creating nonlinked files..."
+ createmany -o "$dir/uniq" 1 10 &> /dev/null ||
+ error "cannot create nonlinked files"
+ echo "done"
+ fi
+
+ # create hard links
+ if [ ! -f "$dir/file$total_count" ]; then
+ echo -n "creating hard links $begin:$total_count..."
+ createmany -l"$file1" "$dir/file" "$begin" "$count" &> \
+ /dev/null || error "cannot create hard links"
+ echo "done"
+ fi
+
+ echo -n "checking number of hard links listed in xattrs..."
+ local fid=$($LFS getstripe -F "$file1")
+ local paths=($($LFS fid2path "$MOUNT" "$fid" 2> /dev/null))
+
+ echo "${#paths[*]}"
+ if [ ${#paths[*]} -lt $total_count -a "$begin" -eq 2 ]; then
+ echo "hard link list has unexpected size, skipping test"
+ return 0
+ fi
+ if [ ${#paths[*]} -ge $total_count -a "$begin" -ne 2 ]; then
+ error "link names should exceed xattrs size"
+ fi
+
+ echo -n "migrating files..."
+ local migrate_out=$($LFS_MIGRATE -y -S '1m' $dir)
+ local rc=$?
+ [ $rc -eq 0 ] || error "migrate failed rc = $rc"
+ echo "done"
+
+ # make sure all links have been properly migrated
+ echo -n "verifying files..."
+ fid=$($LFS getstripe -F "$file1") ||
+ error "cannot get fid for file $file1"
+ for i in $(seq 2 $total_count); do
+ local fid2=$($LFS getstripe -F $dir/file$i)
+ [ "$fid2" == "$fid" ] ||
+ error "migrated hard link has mismatched FID"
+ done
+
+ # make sure hard links were properly detected, and migration was
+ # performed only once for the entire link set; nonlinked files should
+ # also be migrated
+ local actual=$(grep -c 'done migrate' <<< "$migrate_out")
+ local expected=$(($uniq_count + 1))
+ [ "$actual" -eq "$expected" ] ||
+ error "hard links individually migrated ($actual != $expected)"
+
+ # make sure the correct number of hard links are present
+ local hardlinks=$(stat -c '%h' "$file1")
+ [ $hardlinks -eq $total_count ] ||
+ error "num hard links $hardlinks != $total_count"
+ echo "done"
+
+ return 0
+}
+
+test_56xb() {
+ local dir0="$DIR/$tdir"
+
+ test_mkdir "$dir0" || error "cannot create dir $dir0"
+
+ echo "testing lfs migrate mode when all links fit within xattrs"
+ LFS_MIGRATE_RSYNC=false check_migrate_links "$dir0" 2 99
+
+ echo "testing rsync mode when all links fit within xattrs"
+ LFS_MIGRATE_RSYNC=true check_migrate_links "$dir0" 2 99
+
+ echo "testing lfs migrate mode when all links do not fit within xattrs"
+ LFS_MIGRATE_RSYNC=false check_migrate_links "$dir0" 101 100
+
+ echo "testing rsync mode when all links do not fit within xattrs"
+ LFS_MIGRATE_RSYNC=true check_migrate_links "$dir0" 101 100
+
+ # clean up
+ rm -rf $dir0
+}
+run_test 56xb "lfs migration hard link support"
+
test_56y() {
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" &&
local res=""
local dir0=$DIR/$tdir/$testnum
- test_mkdir -p $dir0 || error "creating dir $dir0"
+ test_mkdir -p $dir0
local f1=$dir0/file1
local f2=$dir0/file2
}
run_test 56aa "lfs find --size under striped dir"
+test_56ba() {
+ # Create composite files with one component
+ TDIR=$DIR/$tdir/1Mfiles
+ setup_56 5 1 "--component-end 1M"
+ # Create composite files with three components
+ TDIR=$DIR/$tdir/2Mfiles
+ setup_56 5 2 "-E 2M -E 4M -E 6M"
+ TDIR=$DIR/$tdir
+ # Create non-composite files
+ createmany -o $TDIR/${tfile}- 10
+
+ local nfiles=$($LFIND --component-end 1M --type f $TDIR | wc -l)
+ [[ $nfiles == 10 ]] ||
+ error "lfs find -E 1M found $nfiles != 10 files"
+
+ nfiles=$($LFIND ! -E 1M --type f $TDIR | wc -l)
+ [[ $nfiles == 25 ]] ||
+ error "lfs find ! -E 1M found $nfiles != 25 files"
+
+ # All files have a component that starts at 0
+ local nfiles=$($LFIND --component-start 0 --type f $TDIR | wc -l)
+ [[ $nfiles == 35 ]] ||
+ error "lfs find --component-start 0 found $nfiles != 35 files"
+
+ nfiles=$($LFIND --component-start 2M --type f $TDIR | wc -l)
+ [[ $nfiles == 15 ]] ||
+ error "$LFIND --component-start 2M found $nfiles != 15 files"
+
+ # All files created here have a componenet that does not starts at 2M
+ nfiles=$($LFIND ! --component-start 2M --type f $TDIR | wc -l)
+ [[ $nfiles == 35 ]] ||
+ error "$LFIND ! --component-start 2M found $nfiles != 35 files"
+
+ # Find files with a specified number of components
+ local nfiles=$($LFIND --component-count 3 --type f $TDIR | wc -l)
+ [[ $nfiles == 15 ]] ||
+ error "lfs find --component-count 3 found $nfiles != 15 files"
+
+ # Remember non-composite files have a component count of zero
+ local nfiles=$($LFIND --component-count 0 --type f $TDIR | wc -l)
+ [[ $nfiles == 10 ]] ||
+ error "lfs find --component-count 0 found $nfiles != 10 files"
+
+ nfiles=$($LFIND ! --component-count 3 --type f $TDIR | wc -l)
+ [[ $nfiles == 20 ]] ||
+ error "$LFIND ! --component-count 3 found $nfiles != 20 files"
+
+ # All files have a flag called "init"
+ local nfiles=$($LFIND --component-flags init --type f $TDIR | wc -l)
+ [[ $nfiles == 35 ]] ||
+ error "$LFIND --component-flags init found $nfiles != 35 files"
+
+ # Multi-component files will have a component not initialized
+ local nfiles=$($LFIND ! --component-flags init --type f $TDIR | wc -l)
+ [[ $nfiles == 15 ]] ||
+ error "$LFIND !--component-flags init found $nfiles != 15 files"
+
+ rm -rf $TDIR
+
+}
+run_test 56ba "test lfs find --component-end, -start, -count, and -flags"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# note test will not do anything if MDS is not local
if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then
- skip "Only applicable to ldiskfs-based MDTs"
+ skip "ldiskfs only test"
return
fi
test_57b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then
- skip "Only applicable to ldiskfs-based MDTs"
+ skip "ldiskfs only test"
return
fi
local FILEN=$dir/f$FILECOUNT
rm -rf $dir || error "removing $dir"
- test_mkdir -p -c1 $dir || error "creating $dir"
+ test_mkdir -c1 $dir
local mdtidx=$($LFS getstripe -M $dir)
local mdtname=MDT$(printf %04x $mdtidx)
local facet=mds$((mdtidx + 1))
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 "sh run-llog.sh" || error "run-llog.sh failed"
do_facet mgs $LCTL dk > $TMP/$tfile
# LU-6388: test llog_reader
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_test run from kernel module and test llog_reader =========="
+run_test 60a "llog_test run from kernel module and test llog_reader"
+
+test_60aa() {
+ # test old logid format
+ if [ $(lustre_version_code mgs) -le $(version_code 3.1.53) ]; then
+ do_facet mgs $LCTL dl | grep MGS
+ do_facet mgs "$LCTL --device %MGS llog_print \\\\\\\$$FSNAME-client" ||
+ error "old llog_print failed"
+ fi
+
+ # test new logid format
+ if [ $(lustre_version_code mgs) -ge $(version_code 2.9.53) ]; then
+ do_facet mgs "$LCTL --device MGS llog_print $FSNAME-client" ||
+ error "new llog_print failed"
+ fi
+}
+run_test 60aa "llog_print works with FIDs and simple names"
test_60b() { # bug 6411
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
sh oos.sh $MOUNT || error "oos.sh failed: $?"
}
-run_test 64b "check out-of-space detection on client ==========="
+run_test 64b "check out-of-space detection on client"
test_64c() {
$LCTL set_param osc.*OST0000-osc-[^mM]*.cur_grant_bytes=0
}
-run_test 64c "verify grant shrink ========================------"
+run_test 64c "verify grant shrink"
# bug 1414 - set/get directories' stripe info
test_65a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
touch $DIR/$tdir/f1
$LVERIFY $DIR/$tdir $DIR/$tdir/f1 || error "lverify failed"
}
-run_test 65a "directory with no stripe info ===================="
+run_test 65a "directory with no stripe info"
test_65b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
$SETSTRIPE -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
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)
+ [ $OSTCOUNT -lt 2 ] && skip "need at least 2 OSTs" && return
+ test_mkdir $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
+ $LFS 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"
}
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
+ test_mkdir $DIR/$tdir
local STRIPECOUNT=$($GETSTRIPE -c $DIR/$tdir)
local STRIPESIZE=$($GETSTRIPE -S $DIR/$tdir)
test_65e() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE $DIR/$tdir || error "setstripe"
$GETSTRIPE -v $DIR/$tdir | grep "Default" ||
touch $DIR/$tdir/f6
$LVERIFY $DIR/$tdir $DIR/$tdir/f6 || error "lverify failed"
}
-run_test 65e "directory setstripe defaults ======================="
+run_test 65e "directory setstripe defaults"
test_65f() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/${tdir}f
+ test_mkdir $DIR/${tdir}f
$RUNAS $SETSTRIPE $DIR/${tdir}f && error "setstripe succeeded" || true
}
run_test 65f "dir setstripe permission (should return error) ==="
test_65g() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $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"
- $GETSTRIPE -v $DIR/$tdir | grep "Default" ||
+ $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
+ error "setstripe -S failed"
+ $LFS setstripe -d $DIR/$tdir || error "setstripe -d failed"
+ $LFS getstripe -v $DIR/$tdir | grep "Default" ||
error "delete default stripe failed"
}
-run_test 65g "directory setstripe -d ==========================="
+run_test 65g "directory setstripe -d"
test_65h() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $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
- [ $($GETSTRIPE -c $DIR/$tdir) == $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
- error "stripe info inherit failed"
+ $LFS setstripe -S $((STRIPESIZE * 2)) -i 0 -c 1 $DIR/$tdir ||
+ error "setstripe -S failed"
+ test_mkdir $DIR/$tdir/dd1
+ [ $($LFS getstripe -c $DIR/$tdir) = $($GETSTRIPE -c $DIR/$tdir/dd1) ] ||
+ error "stripe info inherit failed"
}
run_test 65h "directory stripe info inherit ===================="
test_65k() { # bug11679
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local disable_precreate=true
}
run_test 66 "update inode blocks count on client ==============="
-LLOOP=
-LLITELOOPLOAD=
-cleanup_68() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- trap 0
- if [ ! -z "$LLOOP" ]; then
- if swapon -s | grep -q $LLOOP; then
- swapoff $LLOOP || error "swapoff failed"
- fi
-
- $LCTL blockdev_detach $LLOOP || error "detach failed"
- rm -f $LLOOP
- unset LLOOP
- fi
- rm -f $DIR/f68*
-}
-
meminfo() {
awk '($1 == "'$1':") { print $2 }' /proc/meminfo
}
run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
test_71() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir
sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!"
}
awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
}
-get_inode_slab_tunables() {
- awk '/lustre_inode_cache/ {print $9," ",$10," ",$11; exit}' /proc/slabinfo
-}
-
-set_inode_slab_tunables() {
- echo "lustre_inode_cache $1" > /proc/slabinfo
-}
-
test_76() { # Now for bug 20433, added originally in bug 1443
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local SLAB_SETTINGS=$(get_inode_slab_tunables)
local CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
- # we cannot set limit below 1 which means 1 inode in each
- # per-cpu cache is still allowed
- set_inode_slab_tunables "1 1 0"
cancel_lru_locks osc
BEFORE_INODES=$(num_inodes)
echo "before inodes: $BEFORE_INODES"
error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
fi
done
- set_inode_slab_tunables "$SLAB_SETTINGS"
}
run_test 76 "confirm clients recycle inodes properly ===="
}
run_test 77b "checksum error on client write, read"
+cleanup_77c() {
+ trap 0
+ set_checksums 0
+ $LCTL set_param osc.*osc-[^mM]*.checksum_dump=0
+ $check_ost &&
+ do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=0
+ [ -n $osc_file_prefix ] && rm -f ${osc_file_prefix}*
+ $check_ost && [ -n $ost_file_prefix ] &&
+ do_facet ost1 rm -f ${ost_file_prefix}\*
+}
+
+test_77c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ $GSS && skip "could not run with gss" && return
+
+ local bad1
+ local osc_file_prefix
+ local osc_file
+ local check_ost=false
+ local ost_file_prefix
+ local ost_file
+ local orig_cksum
+ local dump_cksum
+ local fid
+
+ # ensure corruption will occur on first OSS/OST
+ $LFS setstripe -i 0 $DIR/$tfile
+
+ [ ! -f $F77_TMP ] && setup_f77
+ dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
+ error "dd write error: $?"
+ fid=$($LFS path2fid $DIR/$tfile)
+
+ if [ $(lustre_version_code ost1) -ge $(version_code 2.9.57) ]
+ then
+ check_ost=true
+ ost_file_prefix=$(do_facet ost1 $LCTL get_param -n debug_path)
+ ost_file_prefix=${ost_file_prefix}-checksum_dump-ost-\\${fid}
+ else
+ echo "OSS do not support bulk pages dump upon error"
+ fi
+
+ osc_file_prefix=$($LCTL get_param -n debug_path)
+ osc_file_prefix=${osc_file_prefix}-checksum_dump-osc-\\${fid}
+
+ trap cleanup_77c EXIT
+
+ set_checksums 1
+ # enable bulk pages dump upon error on Client
+ $LCTL set_param osc.*osc-[^mM]*.checksum_dump=1
+ # enable bulk pages dump upon error on OSS
+ $check_ost &&
+ do_facet ost1 $LCTL set_param obdfilter.*-OST*.checksum_dump=1
+
+ # flush Client cache to allow next read to reach OSS
+ cancel_lru_locks osc
+
+ #define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
+ $LCTL set_param fail_loc=0x80000408
+ dd if=$DIR/$tfile of=/dev/null bs=1M || error "dd read error: $?"
+ $LCTL set_param fail_loc=0
+
+ rm -f $DIR/$tfile
+
+ # check cksum dump on Client
+ osc_file=$(ls ${osc_file_prefix}*)
+ [ -n "$osc_file" ] || error "no checksum dump file on Client"
+ # OBD_FAIL_OSC_CHECKSUM_RECEIVE corrupts with "bad1" at start of file
+ bad1=$(dd if=$osc_file bs=1 count=4 2>/dev/null) || error "dd error: $?"
+ [ $bad1 == "bad1" ] || error "unexpected corrupt pattern"
+ orig_cksum=$(dd if=$F77_TMP bs=1 skip=4 count=1048572 2>/dev/null |
+ cksum)
+ dump_cksum=$(dd if=$osc_file bs=1 skip=4 2>/dev/null | cksum)
+ [[ "$orig_cksum" == "$dump_cksum" ]] ||
+ error "dump content does not match on Client"
+
+ $check_ost || skip "No need to check cksum dump on OSS"
+
+ # check cksum dump on OSS
+ ost_file=$(do_facet ost1 ls ${ost_file_prefix}\*)
+ [ -n "$ost_file" ] || error "no checksum dump file on OSS"
+ orig_cksum=$(dd if=$F77_TMP bs=1048576 count=1 2>/dev/null | cksum)
+ dump_cksum=$(do_facet ost1 dd if=$ost_file 2>/dev/null \| cksum)
+ [[ "$orig_cksum" == "$dump_cksum" ]] ||
+ error "dump content does not match on OSS"
+
+ cleanup_77c
+}
+run_test 77c "checksum error on client read with debug"
+
test_77d() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
$GSS && skip "could not run with gss" && return
}
run_test 77g "checksum error on OST write, read"
-test_77i() { # bug 13805
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- #define OBD_FAIL_OSC_CONNECT_CKSUM 0x40b
- lctl set_param fail_loc=0x40b
- remount_client $MOUNT
- lctl set_param fail_loc=0
- for VALUE in `lctl get_param osc.*osc-[^mM]*.checksum_type`; do
- PARAM=`echo ${VALUE[0]} | cut -d "=" -f1`
- algo=`lctl get_param -n $PARAM | sed 's/.*\[\(.*\)\].*/\1/g'`
- [ "$algo" = "adler" ] || error "algo set to $algo instead of adler"
- done
- remount_client $MOUNT
-}
-run_test 77i "client not supporting OSD_CONNECT_CKSUM"
-
test_77j() { # bug 13805
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
$GSS && skip "could not run with gss" && return
lctl set_param fail_loc=0x40c
remount_client $MOUNT
lctl set_param fail_loc=0
- sleep 2 # wait async osc connect to finish
- for VALUE in `lctl get_param osc.*osc-[^mM]*.checksum_type`; do
- PARAM=`echo ${VALUE[0]} | cut -d "=" -f1`
- algo=`lctl get_param -n $PARAM | sed 's/.*\[\(.*\)\].*/\1/g'`
+ # wait async osc connect to finish and reflect updated state value
+ local i
+ for (( i=0; i < OSTCOUNT; i++ )) ; do
+ wait_osc_import_state client ost$((i+1)) FULL
+ done
+
+ for VALUE in $(lctl get_param osc.*osc-[^mM]*.checksum_type); do
+ PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
+ algo=$(lctl get_param -n $PARAM | sed 's/.*\[\(.*\)\].*/\1/g')
[ "$algo" = "adler" ] || error "algo set to $algo instead of adler"
done
remount_client $MOUNT
wait $MULTIPID1
wait $MULTIPID2
}
-run_test 82 "Basic grouplock test ==============================="
+run_test 82 "Basic grouplock test"
+
+test_83() {
+ local sfile="/boot/System.map-$(uname -r)"
+ # define OBD_FAIL_LLITE_PTASK_IO_FAIL 0x140d
+ $LCTL set_param fail_loc=0x140d
+ cp $sfile $DIR/$tfile || error "write failed"
+ diff -c $sfile $DIR/$tfile || error "files are different"
+ $LCTL set_param fail_loc=0
+ rm -f $DIR/$tfile
+}
+run_test 83 "Short write in ptask ==============================="
-test_99a() {
+test_99() {
[ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" &&
return
- test_mkdir -p $DIR/d99cvsroot
- chown $RUNAS_ID $DIR/d99cvsroot
- local oldPWD=$PWD # bug 13584, use $TMP as working dir
- cd $TMP
+ test_mkdir $DIR/$tdir.cvsroot
+ chown $RUNAS_ID $DIR/$tdir.cvsroot
- $RUNAS cvs -d $DIR/d99cvsroot init || error "cvs init failed"
- cd $oldPWD
-}
-run_test 99a "cvs init ========================================="
+ cd $TMP
+ $RUNAS cvs -d $DIR/$tdir.cvsroot init || error "cvs init failed"
-test_99b() {
- [ -z "$(which cvs 2>/dev/null)" ] &&
- skip_env "could not find cvs" && return
- [ ! -d $DIR/d99cvsroot ] && test_99a
cd /etc/init.d
# 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')
- $RUNAS cvs -d $DIR/d99cvsroot import -m "nomesg" $TOIGNORE \
- d99reposname vtag rtag
-}
-run_test 99b "cvs import ======================================="
+ local toignore=$(find . -type l -printf '-I %f\n' -o \
+ ! -perm /4 -printf '-I %f\n')
+ $RUNAS cvs -d $DIR/$tdir.cvsroot import -m "nomesg" $toignore \
+ $tdir.reposname vtag rtag
-test_99c() {
- [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return
- [ ! -d $DIR/d99cvsroot ] && test_99b
cd $DIR
- test_mkdir -p $DIR/d99reposname
- chown $RUNAS_ID $DIR/d99reposname
- $RUNAS cvs -d $DIR/d99cvsroot co d99reposname
-}
-run_test 99c "cvs checkout ====================================="
+ test_mkdir $DIR/$tdir.reposname
+ chown $RUNAS_ID $DIR/$tdir.reposname
+ $RUNAS cvs -d $DIR/$tdir.cvsroot co $tdir.reposname
-test_99d() {
- [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return
- [ ! -d $DIR/d99cvsroot ] && test_99c
- cd $DIR/d99reposname
+ cd $DIR/$tdir.reposname
$RUNAS touch foo99
$RUNAS cvs add -m 'addmsg' foo99
-}
-run_test 99d "cvs add =========================================="
-
-test_99e() {
- [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return
- [ ! -d $DIR/d99cvsroot ] && test_99c
- cd $DIR/d99reposname
$RUNAS cvs update
-}
-run_test 99e "cvs update ======================================="
-
-test_99f() {
- [ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && return
- [ ! -d $DIR/d99cvsroot ] && test_99d
- cd $DIR/d99reposname
$RUNAS cvs commit -m 'nomsg' foo99
- rm -fr $DIR/d99cvsroot
+ rm -fr $DIR/$tdir.cvsroot
}
-run_test 99f "cvs commit ======================================="
+run_test 99 "cvs strange file/directory operations"
test_100() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ "$NETTYPE" = tcp ] || \
- { skip "TCP secure port test, not useful for NETTYPE=$NETTYPE" && \
+ [[ "$NETTYPE" =~ tcp ]] ||
+ { skip "TCP secure port test, not useful for NETTYPE=$NETTYPE" &&
return ; }
remote_ost_nodsh && skip "remote OST with nodsh" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- remote_servers || \
+ remote_servers ||
{ skip "useless for local single node setup" && return; }
netstat -tna | ( rc=1; while read PROT SND RCV LOCAL REMOTE STAT; do
test_101a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322
+ [ $MDSCOUNT -ge 2 ] && skip "needs < 2 MDTs" && return #LU-4322
local s
local discard
local nreads=10000
fi
rm -f $DIR/$tfile || true
}
-run_test 101a "check read-ahead for random reads ================"
+run_test 101a "check read-ahead for random reads"
setup_test101bc() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
local STRIPE_SIZE=$1
local FILE_LENGTH=$2
STRIPE_OFFSET=0
test_101b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [[ $OSTCOUNT -lt 2 ]] &&
- skip_env "skipping stride IO stride-ahead test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
local STRIPE_SIZE=1048576
local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
if [ $SLOW == "yes" ]; then
done
echo "Cancel LRU locks on lustre client to flush the client cache"
- cancel_lru_locks osc
+ cancel_lru_locks $OSC
echo "Reset readahead stats"
$LCTL set_param -n llite.*.read_ahead_stats 0
# calculate number of full-sized read and write RPCs
rpcs=($($LCTL get_param -n 'osc.*.rpc_stats' |
sed -n '/pages per rpc/,/^$/p' |
- awk '/'$pages':/ { reads += $2; writes += $5 };' \
- 'END { print reads,writes }'))
+ awk '/'$pages':/ { reads += $2; writes += $6 }; \
+ END { print reads,writes }'))
[ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" &&
return 5
[ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" &&
$LFS setstripe -i 0 -c 1 $DIR/$tfile
local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1)
- if [ $(lustre_version_code ost1) -ge $(version_code 2.8.52) ]; then
+ if [ $(lustre_version_code ost1) -ge $(version_code 2.8.52) -a \
+ $(lustre_version_code client) -ge $(version_code 2.8.52) ]; then
[ $(lustre_version_code ost1) -ge $(version_code 2.9.52) ] &&
suffix="M"
- if [[ $orig_mb < 16 ]]; then
+ if [[ $orig_mb -lt 16 ]]; then
save_lustre_params $osts "$brw_size" > $p
do_nodes $list $LCTL set_param -n $brw_size=16$suffix ||
error "set 16MB RPC size failed"
test_101g_brw_size_test 4 || error "4MB RPC test failed"
- if [[ $orig_mb < 16 ]]; then
+ if [[ $orig_mb -lt 16 ]]; then
restore_lustre_params < $p
remount_client $MOUNT || error "remount_client restore failed"
fi
run_test 101g "Big bulk(4/16 MiB) readahead"
setup_test102() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
chown $RUNAS_ID $DIR/$tdir
STRIPE_SIZE=65536
STRIPE_OFFSET=1
done
cd $DIR
- $1 $TAR cf $TMP/f102.tar $tdir --xattrs
+ $1 tar cf $TMP/f102.tar $tdir --xattrs
}
cleanup_test102() {
setfattr -x user.author1 $testfile ||
error "$testfile error deleting user.author1"
- getfattr -d -m user $testfile 2> /dev/null | grep "user.author1" &&
- error "$testfile did not delete trusted.name1 xattr"
-
- # b10667: setting lustre special xattr be silently discarded
echo "set lustre special xattr ..."
- setfattr -n "trusted.lov" -v "invalid value" $testfile ||
- error "$testfile allowed setting trusted.lov"
+ $LFS setstripe -c1 $testfile
+ local lovea=$(getfattr -n "trusted.lov" -e hex $testfile |
+ awk -F "=" '/trusted.lov/ { print $2 }' )
+ setfattr -n "trusted.lov" -v $lovea $testfile ||
+ error "$testfile doesn't ignore setting trusted.lov again"
+ setfattr -n "trusted.lov" -v "invalid_value" $testfile &&
+ error "$testfile allow setting invalid trusted.lov"
+ rm -f $testfile
}
run_test 102a "user xattr test =================================="
# b10930: get/set/list trusted.lov xattr
echo "get/set/list trusted.lov xattr ..."
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
local testfile=$DIR/$tfile
$SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
error "setstripe failed"
# b10930: get/set/list lustre.lov xattr
echo "get/set/list lustre.lov xattr ..."
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
- test_mkdir -p $DIR/$tdir
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ test_mkdir $DIR/$tdir
chown $RUNAS_ID $DIR/$tdir
local testfile=$DIR/$tdir/$tfile
$RUNAS $SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
return 0
}
-find_lustre_tar() {
- [ -n "$(which tar 2>/dev/null)" ] &&
- strings $(which tar) | grep -q "lustre" && echo tar
+have_xattrs_include() {
+ tar --help | grep -q xattrs-include &&
+ echo --xattrs-include="lustre.*"
}
test_102d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- # b10930: tar test for trusted.lov xattr
- TAR=$(find_lustre_tar)
- [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ XINC=$(have_xattrs_include)
setup_test102
- test_mkdir -p $DIR/d102d
- $TAR xf $TMP/f102.tar -C $DIR/d102d --xattrs
- cd $DIR/d102d/$tdir
+ tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
+ cd $DIR/$tdir/$tdir
compare_stripe_info1
}
-run_test 102d "tar restore stripe info from tarfile,not keep osts ==========="
+run_test 102d "tar restore stripe info from tarfile,not keep osts"
test_102f() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- # b10930: tar test for trusted.lov xattr
- TAR=$(find_lustre_tar)
- [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ XINC=$(have_xattrs_include)
setup_test102
- test_mkdir -p $DIR/d102f
+ test_mkdir $DIR/$tdir.restore
cd $DIR
- $TAR cf - --xattrs $tdir | $TAR xf - --xattrs -C $DIR/d102f
- cd $DIR/d102f/$tdir
+ tar cf - --xattrs $tdir | tar xf - \
+ -C $DIR/$tdir.restore --xattrs $XINC
+ cd $DIR/$tdir.restore/$tdir
compare_stripe_info1
}
-run_test 102f "tar copy files, not keep osts ==========="
+run_test 102f "tar copy files, not keep osts"
grow_xattr() {
local xsize=${1:-1024} # in bytes
test_102j() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- TAR=$(find_lustre_tar)
- [ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
- [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
+ XINC=$(have_xattrs_include)
setup_test102 "$RUNAS"
- test_mkdir -p $DIR/d102j
- chown $RUNAS_ID $DIR/d102j
- $RUNAS $TAR xf $TMP/f102.tar -C $DIR/d102j --xattrs
- cd $DIR/d102j/$tdir
+ chown $RUNAS_ID $DIR/$tdir
+ $RUNAS tar xf $TMP/f102.tar -C $DIR/$tdir --xattrs $XINC
+ cd $DIR/$tdir/$tdir
compare_stripe_info1 "$RUNAS"
}
run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
test_102k() {
[ -z "$(which setfattr 2>/dev/null)" ] &&
skip "could not find setfattr" && return
- touch $DIR/$tfile
- # b22187 just check that does not crash for regular file.
- setfattr -n trusted.lov $DIR/$tfile
- # b22187 'setfattr -n trusted.lov' should work as remove LOV EA for directories
- local test_kdir=$DIR/d102k
- test_mkdir $test_kdir
- local default_size=`$GETSTRIPE -S $test_kdir`
- local default_count=`$GETSTRIPE -c $test_kdir`
- local default_offset=`$GETSTRIPE -i $test_kdir`
+ touch $DIR/$tfile
+ # b22187 just check that does not crash for regular file.
+ setfattr -n trusted.lov $DIR/$tfile
+ # b22187 'setfattr -n trusted.lov' should remove LOV EA for directories
+ local test_kdir=$DIR/$tdir
+ test_mkdir $test_kdir
+ local default_size=$($LFS getstripe -S $test_kdir)
+ local default_count=$($LFS getstripe -c $test_kdir)
+ local default_offset=$($LFS getstripe -i $test_kdir)
$SETSTRIPE -S 65536 -i 0 -c $OSTCOUNT $test_kdir ||
- error 'dir setstripe failed'
- setfattr -n trusted.lov $test_kdir
- local stripe_size=`$GETSTRIPE -S $test_kdir`
- local stripe_count=`$GETSTRIPE -c $test_kdir`
- local stripe_offset=`$GETSTRIPE -i $test_kdir`
- [ $stripe_size -eq $default_size ] ||
- error "stripe size $stripe_size != $default_size"
- [ $stripe_count -eq $default_count ] ||
- error "stripe count $stripe_count != $default_count"
- [ $stripe_offset -eq $default_offset ] ||
- error "stripe offset $stripe_offset != $default_offset"
- rm -rf $DIR/$tfile $test_kdir
+ error 'dir setstripe failed'
+ setfattr -n trusted.lov $test_kdir
+ local stripe_size=$($LFS getstripe -S $test_kdir)
+ local stripe_count=$($LFS getstripe -c $test_kdir)
+ local stripe_offset=$($LFS getstripe -i $test_kdir)
+ [ $stripe_size -eq $default_size ] ||
+ error "stripe size $stripe_size != $default_size"
+ [ $stripe_count -eq $default_count ] ||
+ error "stripe count $stripe_count != $default_count"
+ [ $stripe_offset -eq $default_offset ] ||
+ error "stripe offset $stripe_offset != $default_offset"
+ rm -rf $DIR/$tfile $test_kdir
}
run_test 102k "setfattr without parameter of value shouldn't cause a crash"
# Try to set a garbage xattr.
value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
- setfattr --name=trusted.$name --value="$value" $file1 ||
- error "setxattr 'trusted.$name' failed"
+ if [[ x$name == "xlov" ]]; then
+ setfattr --name=trusted.lov --value="$value" $file1 &&
+ error "setxattr invalid 'trusted.lov' success"
+ else
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr invalid 'trusted.$name' failed"
+ fi
# Try to remove the xattr from $file1. We don't care if this
# appears to succeed or fail, we just don't want there to be
rmdir $DIR/$tdir || error "rmdir"
#striped directory
- test_mkdir -p $DIR/$tdir || error "make striped dir"
+ test_mkdir $DIR/$tdir
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 ||
}
run_test 103a "acl test ========================================="
-test_103b() {
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- local noacl=false
- local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
- local mountopts=$MDS_MOUNT_OPTS
-
- if [[ "$MDS_MOUNT_OPTS" =~ "noacl" ]]; then
- noacl=true
- else
- # stop the MDT
- stop $SINGLEMDS || error "failed to stop MDT."
- # remount the MDT
- if [ -z "$MDS_MOUNT_OPTS" ]; then
- MDS_MOUNT_OPTS="-o noacl"
- else
- MDS_MOUNT_OPTS="${MDS_MOUNT_OPTS},noacl"
- fi
- start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS ||
- error "failed to start MDT."
- MDS_MOUNT_OPTS=$mountopts
- fi
-
- touch $DIR/$tfile
- setfacl -m u:bin:rw $DIR/$tfile && error "setfacl should fail"
-
- if ! $noacl; then
- # stop the MDT
- stop $SINGLEMDS || error "failed to stop MDT."
- # remount the MDT
- start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS ||
- error "failed to start MDT."
- fi
-
- true
-}
-run_test 103b "MDS mount option 'noacl'"
-
test_103c() {
mkdir -p $DIR/$tdir
cp -rp $DIR/$tdir $DIR/$tdir.bak
fi
rm -f $DIR/$tfile
}
-run_test 105c "lockf when mounted without -o flock test ========"
+run_test 105c "lockf when mounted without -o flock test"
test_105d() { # bug 15924
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
flock_is_enabled || { skip "mount w/o flock enabled" && return; }
#define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
$LCTL set_param fail_loc=0x80000315
touch $DIR/$tfile
flocks_test 3 $DIR/$tfile
}
-run_test 105e "Two conflicting flocks from same process ======="
+run_test 105e "Two conflicting flocks from same process"
test_106() { #bug 10921
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$DIR/$tdir && error "exec $DIR/$tdir succeeded"
chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
}
run_test 107 "Coredump on SIG"
test_110() {
- test_mkdir -p $DIR/$tdir
- test_mkdir $DIR/$tdir/$(str_repeat 'a' 255) ||
- error "mkdir with 255 char failed"
- test_mkdir $DIR/$tdir/$(str_repeat 'b' 256) &&
+ test_mkdir $DIR/$tdir
+ test_mkdir $DIR/$tdir/$(str_repeat 'a' 255)
+ $LFS mkdir -c $MDSCOUNT $DIR/$tdir/$(str_repeat 'b' 256) &&
error "mkdir with 256 char should fail, but did not"
touch $DIR/$tdir/$(str_repeat 'x' 255) ||
error "create with 255 char failed"
}
run_test 110 "filename length checking"
+#
+# Purpose: To verify dynamic thread (OSS) creation.
+#
test_115() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- OSTIO_pre=$(ps -e | grep ll_ost_io | awk '{ print $4 }'| sort -n |
- tail -1 | cut -c11-20)
- [ -z "$OSTIO_pre" ] && skip "no OSS threads" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
+ # Lustre does not stop service threads once they are started.
+ # Reset number of running threads to default.
+ stopall
+ setupall
+
+ local OSTIO_pre
+ local save_params="$TMP/sanity-$TESTNAME.parameters"
+
+ # Get ll_ost_io count before I/O
+ OSTIO_pre=$(do_facet ost1 \
+ "$LCTL get_param ost.OSS.ost_io.threads_started | cut -d= -f2")
+ # Exit if lustre is not running (ll_ost_io not running).
+ [ -z "$OSTIO_pre" ] && error "no OSS threads"
+
echo "Starting with $OSTIO_pre threads"
+ local thread_max=$((OSTIO_pre * 2))
+ local rpc_in_flight=$((thread_max * 2))
+ # Number of I/O Process proposed to be started.
+ local nfiles
+ local facets=$(get_facets OST)
- NUMTEST=20000
- NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
- [[ $NUMFREE -lt $NUMTEST ]] && NUMTEST=$(($NUMFREE - 1000))
- echo "$NUMTEST creates/unlinks"
- test_mkdir -p $DIR/$tdir
- createmany -o $DIR/$tdir/$tfile $NUMTEST
- unlinkmany $DIR/$tdir/$tfile $NUMTEST
+ save_lustre_params client "osc.*OST*.max_rpcs_in_flight" > $save_params
+ save_lustre_params $facets "ost.OSS.ost_io.threads_max" >> $save_params
+
+ # Set in_flight to $rpc_in_flight
+ $LCTL set_param osc.*OST*.max_rpcs_in_flight=$rpc_in_flight ||
+ error "Failed to set max_rpcs_in_flight to $rpc_in_flight"
+ nfiles=${rpc_in_flight}
+ # Set ost thread_max to $thread_max
+ do_facet ost1 "$LCTL set_param ost.OSS.ost_io.threads_max=$thread_max"
+
+ # 5 Minutes should be sufficient for max number of OSS
+ # threads(thread_max) to be created.
+ local timeout=300
+
+ # Start I/O.
+ local WTL=${WTL:-"$LUSTRE/tests/write_time_limit"}
+ test_mkdir $DIR/$tdir
+ for i in $(seq $nfiles); do
+ local file=$DIR/$tdir/${tfile}-$i
+ $LFS setstripe -c -1 -i 0 $file
+ ($WTL $file $timeout)&
+ done
+
+ # I/O Started - Wait for thread_started to reach thread_max or report
+ # error if thread_started is more than thread_max.
+ echo "Waiting for thread_started to reach thread_max"
+ local thread_started=0
+ local end_time=$((SECONDS + timeout))
+
+ while [ $SECONDS -le $end_time ] ; do
+ echo -n "."
+ # Get ost i/o thread_started count.
+ thread_started=$(do_facet ost1 \
+ "$LCTL get_param \
+ ost.OSS.ost_io.threads_started | cut -d= -f2")
+ # Break out if thread_started is equal/greater than thread_max
+ if [[ $thread_started -ge $thread_max ]]; then
+ echo ll_ost_io thread_started $thread_started, \
+ equal/greater than thread_max $thread_max
+ break
+ fi
+ sleep 1
+ done
- OSTIO_post=$(ps -e | grep ll_ost_io | awk '{ print $4 }' | sort -n |
- tail -1 | cut -c11-20)
+ # Cleanup - We have the numbers, Kill i/o jobs if running.
+ jobcount=($(jobs -p))
+ for i in $(seq 0 $((${#jobcount[@]}-1)))
+ do
+ kill -9 ${jobcount[$i]}
+ if [ $? -ne 0 ] ; then
+ echo Warning: \
+ Failed to Kill \'WTL\(I/O\)\' with pid ${jobcount[$i]}
+ fi
+ done
- # don't return an error
- [ $OSTIO_post == $OSTIO_pre ] && echo \
- "WARNING: No new ll_ost_io threads were created ($OSTIO_pre)" &&
- echo "This may be fine, depending on what ran before this test" &&
- echo "and how fast this system is." && return
+ # Cleanup files left by WTL binary.
+ for i in $(seq $nfiles); do
+ local file=$DIR/$tdir/${tfile}-$i
+ rm -rf $file
+ if [ $? -ne 0 ] ; then
+ echo "Warning: Failed to delete file $file"
+ fi
+ done
- echo "Started with $OSTIO_pre threads, ended with $OSTIO_post"
+ restore_lustre_params <$save_params
+ rm -f $save_params || echo "Warning: delete file '$save_params' failed"
+
+ # Error out if no new thread has started or Thread started is greater
+ # than thread max.
+ if [[ $thread_started -le $OSTIO_pre ||
+ $thread_started -gt $thread_max ]]; then
+ error "ll_ost_io: thread_started $thread_started" \
+ "OSTIO_pre $OSTIO_pre, thread_max $thread_max." \
+ "No new thread started or thread started greater " \
+ "than thread_max."
+ fi
}
run_test 115 "verify dynamic thread creation===================="
[ $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
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
echo -n "Free space priority "
do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
#define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
set_nodes_failloc "$(osts_nodes)" 0x20e
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
for ((i=0;i<10;i++)); do
(dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1M count=10 || \
{
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# LU-646
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$MULTIOP $DIR/$tdir Dy || error "fsync dir failed"
rm -rf $DIR/$tdir
}
-run_test 118l "fsync dir ========="
+run_test 118l "fsync dir"
test_118m() # LU-3066
{
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
rm -rf $DIR/$tdir
}
test_119b() # bug 11737
{
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
$SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed"
dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
test_120a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- test_mkdir -p $DIR/$tdir
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
- skip "no early lock cancel on server" && return 0
+ test_mkdir $DIR/$tdir
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
lru_resize_disable mdc
lru_resize_disable osc
test_120b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- test_mkdir $DIR/$tdir
- [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
- skip "no early lock cancel on server" && return 0
- lru_resize_disable mdc
- lru_resize_disable osc
- cancel_lru_locks mdc
- stat $DIR/$tdir > /dev/null
+ test_mkdir $DIR/$tdir
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
+ lru_resize_disable mdc
+ lru_resize_disable osc
+ cancel_lru_locks mdc
+ stat $DIR/$tdir > /dev/null
can1=$(do_facet $SINGLEMDS \
"$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
awk '/ldlm_cancel/ {print $2}')
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
test_mkdir -c1 $DIR/$tdir
- [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
- skip "no early lock cancel on server" && return 0
- lru_resize_disable mdc
- lru_resize_disable osc
- test_mkdir -p -c1 $DIR/$tdir/d1
- test_mkdir -p -c1 $DIR/$tdir/d2
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
+ lru_resize_disable mdc
+ lru_resize_disable osc
+ test_mkdir -c1 $DIR/$tdir/d1
+ test_mkdir -c1 $DIR/$tdir/d2
touch $DIR/$tdir/d1/f1
cancel_lru_locks mdc
stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
test_120d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- test_mkdir -p -c1 $DIR/$tdir
- [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
- skip "no early lock cancel on server" && return 0
+ test_mkdir -c1 $DIR/$tdir
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
lru_resize_disable mdc
lru_resize_disable osc
touch $DIR/$tdir
test_120e() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- ! $($LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_can) &&
- skip "no early lock cancel on server" && return 0
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local dlmtrace_set=false
- test_mkdir -p -c1 $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir
lru_resize_disable mdc
lru_resize_disable osc
! $LCTL get_param debug | grep -q dlmtrace &&
test_120f() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
- skip "no early lock cancel on server" && return 0
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- test_mkdir -p -c1 $DIR/$tdir
- lru_resize_disable mdc
- lru_resize_disable osc
- test_mkdir -p -c1 $DIR/$tdir/d1
- test_mkdir -p -c1 $DIR/$tdir/d2
+ test_mkdir -c1 $DIR/$tdir
+ lru_resize_disable mdc
+ lru_resize_disable osc
+ test_mkdir -c1 $DIR/$tdir/d1
+ test_mkdir -c1 $DIR/$tdir/d2
dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
cancel_lru_locks mdc
test_120g() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \
- skip "no early lock cancel on server" && return 0
+ $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel ||
+ { skip "no early lock cancel on server"; return 0; }
remote_mds_nodsh && skip "remote MDS with nodsh" && return
- lru_resize_disable mdc
- lru_resize_disable osc
- count=10000
- echo create $count files
- test_mkdir -p $DIR/$tdir
- cancel_lru_locks mdc
- cancel_lru_locks osc
- t0=`date +%s`
+ lru_resize_disable mdc
+ lru_resize_disable osc
+ count=10000
+ echo create $count files
+ test_mkdir $DIR/$tdir
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ t0=$(date +%s)
can0=$(do_facet $SINGLEMDS \
"$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
test_123a() { # was test 123, statahead(bug 11401)
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- SLOWOK=0
- if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
- log "testing on UP system. Performance may be not as good as expected."
- SLOWOK=1
- fi
+ SLOWOK=0
+ if ! grep -q "processor.*: 1" /proc/cpuinfo; then
+ log "testing UP system. Performance may be lower than expected."
+ SLOWOK=1
+ fi
- rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
+ rm -rf $DIR/$tdir
+ test_mkdir $DIR/$tdir
NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
[[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
MULT=10
test_123b () { # statahead(bug 15027)
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
createmany -o $DIR/$tdir/$tfile-%d 1000
cancel_lru_locks mdc
test_124a() {
[ $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
- local NR=2000
- test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
+ $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
+ { skip "no lru resize on server"; return 0; }
+ local NR=2000
+ test_mkdir $DIR/$tdir
- log "create $NR files at $DIR/$tdir"
- createmany -o $DIR/$tdir/f $NR ||
- error "failed to create $NR files in $DIR/$tdir"
+ log "create $NR files at $DIR/$tdir"
+ createmany -o $DIR/$tdir/f $NR ||
+ error "failed to create $NR files in $DIR/$tdir"
- cancel_lru_locks mdc
- ls -l $DIR/$tdir > /dev/null
+ cancel_lru_locks mdc
+ ls -l $DIR/$tdir > /dev/null
- local NSDIR=""
- local LRU_SIZE=0
+ local NSDIR=""
+ local LRU_SIZE=0
for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
LRU_SIZE=$($LCTL get_param -n $PARAM)
test_124b() {
[ $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
+ $LCTL get_param -n mdc.*.connect_flags | grep -q lru_resize ||
+ { skip "no lru resize on server"; return 0; }
LIMIT=$(get_max_pool_limit)
fi
lru_resize_disable mdc
- test_mkdir -p $DIR/$tdir/disable_lru_resize ||
- error "failed to create $DIR/$tdir/disable_lru_resize"
+ test_mkdir -p $DIR/$tdir/disable_lru_resize
createmany -o $DIR/$tdir/disable_lru_resize/f $NR
log "doing ls -la $DIR/$tdir/disable_lru_resize 3 times"
log "lru_size = $(lctl get_param -n ldlm.namespaces.*mdc*.lru_size)"
unlinkmany $DIR/$tdir/disable_lru_resize/f $NR
- lru_resize_enable mdc
- test_mkdir -p $DIR/$tdir/enable_lru_resize ||
- error "failed to create $DIR/$tdir/enable_lru_resize"
+ lru_resize_enable mdc
+ test_mkdir -p $DIR/$tdir/enable_lru_resize
createmany -o $DIR/$tdir/enable_lru_resize/f $NR
log "doing ls -la $DIR/$tdir/enable_lru_resize 3 times"
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
+ $LCTL get_param -n mdc.*.connect_flags | grep -q 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"
+ test_mkdir $DIR/$tdir
createmany -o $DIR/$tdir/f $nr ||
error "failed to create $nr files in $DIR/$tdir"
ls -l $DIR/$tdir > /dev/null
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
+ $LCTL set_param $nsdir.lru_max_age=1000 # milliseconds
echo "sleep $((recalc_p * 2)) seconds..."
sleep $((recalc_p * 2))
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
+ $LCTL get_param -n llite.*.client_type | grep -q local ||
+ { skip "must run as local client"; return; }
+ $LCTL get_param -n mdc.*-mdc-*.connect_flags | grep -q acl ||
+ { skip "must have acl enabled"; return; }
[ -z "$(which setfacl)" ] && skip "must have setfacl tool" && return
- test_mkdir -p $DIR/d125 || error "mkdir failed"
- $SETSTRIPE -S 65536 -c -1 $DIR/d125 || error "setstripe failed"
- setfacl -R -m u:bin:rwx $DIR/d125 || error "setfacl $DIR/d125 failed"
- ls -ld $DIR/d125 || error "cannot access $DIR/d125"
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -S 65536 -c -1 $DIR/$tdir || error "setstripe failed"
+ setfacl -R -m u:bin:rwx $DIR/$tdir || error "setfacl $DIR/$tdir failed"
+ ls -ld $DIR/$tdir || error "cannot access $DIR/$tdir"
}
run_test 125 "don't return EPROTO when a dir has a non-default striping and ACLs"
test_126() { # bug 12829/13455
- [ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return
- [ "$UID" != 0 ] && skip_env "skipping $TESTNAME (must run as root)" && return
+ $LCTL get_param -n llite.*.client_type | grep -q local ||
+ { skip "must run as local client"; return; }
+ [ "$UID" != 0 ] && skip_env "$TESTNAME (must run as root)" && return
$GSS && skip "must run as gss disabled" && return
$RUNAS -u 0 -g 1 touch $DIR/$tfile || error "touch failed"
local canondev
local node
- local LDPROC=/proc/fs/ldiskfs
+ local ldproc=/proc/fs/ldiskfs
local facets=$(get_facets MDS)
for facet in ${facets//,/ }; do
canondev=$(ldiskfs_canon \
*.$(convert_facet2label $facet).mntdev $facet)
- 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"
+ 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 "echo $2 >$ldproc/$canondev/warning_dir_size"
done
}
}
test_129() {
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.56) ]] ||
+ { skip "Need MDS version with at least 2.5.56"; return 0; }
+
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then
- skip "Only applicable to ldiskfs-based MDTs"
+ skip "ldiskfs only test"
return
fi
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local ENOSPC=28
local EFBIG=27
- local has_warning=0
+ local has_warning=false
rm -rf $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 * 5))
- set_dir_limits $MAX $MAX
- local I=$(stat -c%s "$DIR/$tdir")
- local J=0
- while [[ $I -le $MAX ]]; do
- $MULTIOP $DIR/$tdir/$J Oc
+ local maxsize=$(($($LCTL get_param -n mdc.*MDT0000*.blocksize) * 5))
+ set_dir_limits $maxsize $maxsize
+ local dirsize=$(stat -c%s "$DIR/$tdir")
+ local nfiles=0
+ while [[ $dirsize -le $maxsize ]]; do
+ $MULTIOP $DIR/$tdir/file_base_$nfiles Oc
rc=$?
- if [ $has_warning -eq 0 ]; then
- check_mds_dmesg '"is approaching"' &&
- has_warning=1
+ if ! $has_warning; then
+ check_mds_dmesg '"is approaching"' && has_warning=true
fi
- #check two errors ENOSPC for new version of ext4 max_dir_size patch
- #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
- #and EFBIG for previous versions
+ # check two errors:
+ # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee)
+ # EFBIG for previous versions included in ldiskfs series
if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
set_dir_limits 0 0
echo "return code $rc received as expected"
- createmany -o $DIR/$tdir/$J_file_ 1000 ||
+ createmany -o $DIR/$tdir/file_extra_$nfiles. 5 ||
error_exit "create failed w/o dir size limit"
check_mds_dmesg '"has reached"' ||
- error_exit "has reached message should be output"
+ error_exit "reached message should be output"
- [ $has_warning -eq 0 ] &&
+ [ $has_warning = "false" ] &&
error_exit "warning message should be output"
- I=$(stat -c%s "$DIR/$tdir")
+ dirsize=$(stat -c%s "$DIR/$tdir")
- if [ $(lustre_version_code $SINGLEMDS) -lt \
- $(version_code 2.4.51) ]
- then
- [[ $I -eq $MAX ]] && return 0
- else
- [[ $I -gt $MAX ]] && return 0
- fi
- error_exit "current dir size $I, previous limit $MAX"
+ [[ $dirsize -ge $maxsize ]] && return 0
+ error_exit "current dir size $dirsize, " \
+ "previous limit $maxsize"
elif [ $rc -ne 0 ]; then
set_dir_limits 0 0
- error_exit "return code $rc received instead of expected " \
- "$EFBIG or $ENOSPC, files in dir $I"
+ error_exit "return $rc received instead of expected " \
+ "$EFBIG or $ENOSPC, files in dir $dirsize"
fi
- J=$((J+1))
- I=$(stat -c%s "$DIR/$tdir")
+ nfiles=$((nfiles + 1))
+ dirsize=$(stat -c%s "$DIR/$tdir")
done
set_dir_limits 0 0
- error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes"
+ error "exceeded dir size limit $maxsize($MDSCOUNT) : $dirsize bytes"
}
run_test 129 "test directory size limit ========================"
run_test 130a "FIEMAP (1-stripe file)"
test_130b() {
- [ "$OSTCOUNT" -lt "2" ] &&
- skip_env "skipping FIEMAP on $OSTCOUNT-stripe file" && return
+ [ "$OSTCOUNT" -lt "2" ] && skip_env "needs >= 2 OSTs" && return
local filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
[ -n "$filefrag_op" ] && skip_env "filefrag does not support FIEMAP" &&
run_test 130b "FIEMAP ($OSTCOUNT-stripe file)"
test_130c() {
- [ "$OSTCOUNT" -lt "2" ] &&
- skip_env "skipping FIEMAP on 2-stripe file" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
[ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" &&
run_test 130c "FIEMAP (2-stripe file with hole)"
test_130d() {
- [ "$OSTCOUNT" -lt "3" ] &&
- skip_env "skipping FIEMAP on N-stripe file test" && return
+ [[ $OSTCOUNT -lt 3 ]] && skip_env "needs >= 3 OSTs" && return
filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
[ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" &&
[ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return
- local actual_stripecnt=$($GETSTRIPE -c $fm_file)
- dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt ||
+ local actual_stripe_count=$($GETSTRIPE -c $fm_file)
+ dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripe_count ||
error "dd failed on $fm_file"
filefrag -ves $fm_file || error "filefrag $fm_file failed"
(( tot_len += ext_len ))
last_lun=$frag_lun
done
- if (( num_luns != actual_stripecnt || tot_len != 1024 )); then
+ if (( num_luns != actual_stripe_count || tot_len != 1024 )); then
cleanup_130
error "FIEMAP on $fm_file failed; returned wrong number of " \
"luns or wrong len for OST $last_lun"
run_test 130d "FIEMAP (N-stripe file)"
test_130e() {
- [ "$OSTCOUNT" -lt "2" ] &&
- skip_env "skipping continuation FIEMAP test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" && return
filefrag_op=$(filefrag -e 2>&1 | grep "invalid option")
[ -n "$filefrag_op" ] && skip "filefrag does not support FIEMAP" && return
# Test for writev/readv
test_131a() {
- rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 || \
- error "writev test failed"
- rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 || \
- error "readv failed"
+ rwv -f $DIR/$tfile -w -n 3 524288 1048576 1572864 ||
+ error "writev test failed"
+ rwv -f $DIR/$tfile -r -v -n 2 1572864 1048576 ||
+ error "readv failed"
rm -f $DIR/$tfile
}
run_test 131a "test iov's crossing stripe boundary for writev/readv"
test_131b() {
- rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 || \
- error "append writev test failed"
- rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 || \
- error "append writev test failed"
+ local fsize=$((524288 + 1048576 + 1572864))
+ rwv -f $DIR/$tfile -w -a -n 3 524288 1048576 1572864 &&
+ $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
+ error "append writev test failed"
+
+ ((fsize += 1572864 + 1048576))
+ rwv -f $DIR/$tfile -w -a -n 2 1572864 1048576 &&
+ $CHECKSTAT -t file $DIR/$tfile -s $fsize ||
+ error "append writev test failed"
rm -f $DIR/$tfile
}
run_test 131b "test append writev"
run_test 131e "test read hitting hole"
check_stats() {
+ local facet=$1
+ local op=$2
+ local want=${3:-0}
local res
- local count
- case $1 in
- $SINGLEMDS) res=`do_facet $SINGLEMDS $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$2"`
+
+ case $facet in
+ mds*) res=$(do_facet $facet \
+ $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$op")
;;
- ost) res=`do_facet ost1 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$2"`
+ ost*) res=$(do_facet $facet \
+ $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$op")
;;
- *) error "Wrong argument $1" ;;
+ *) error "Wrong facet '$facet'" ;;
esac
echo $res
- [ -z "$res" ] && error "The counter for $2 on $1 was not incremented"
+ [ "$res" ] || error "The counter for $op on $facet was not incremented"
# if the argument $3 is zero, it means any stat increment is ok.
- if [[ $3 -gt 0 ]]; then
- count=$(echo $res | awk '{ print $2 }')
- [[ $count -ne $3 ]] &&
- error "The $2 counter on $1 is wrong - expected $3"
+ if [[ $want -gt 0 ]]; then
+ local count=$(echo $res | awk '{ print $2 }')
+ [[ $count -ne $want ]] &&
+ error "The $op counter on $facet is $count, not $want"
fi
}
[ $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
- local testdir=$DIR/${tdir}/stats_testdir
- test_mkdir -p ${testdir} || error "mkdir failed"
+ local testdir=$DIR/$tdir/stats_testdir
+ test_mkdir -p $testdir
# verify obdfilter stats.
- $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
+ $SETSTRIPE -c 1 -i 0 $testdir/$tfile
sync
cancel_lru_locks osc
wait_delete_completed
do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
- dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=512k count=1 || error "dd failed"
+ dd if=/dev/zero of=$testdir/$tfile conv=notrunc bs=512k count=1 ||
+ error "dd failed"
sync
cancel_lru_locks osc
- check_stats ost "write" 1
+ check_stats ost1 "write" 1
- dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed"
- check_stats ost "read" 1
+ dd if=$testdir/$tfile of=/dev/null bs=1k count=1 || error "dd failed"
+ check_stats ost1 "read" 1
- > ${testdir}/${tfile} || error "truncate failed"
- check_stats ost "punch" 1
+ > $testdir/$tfile || error "truncate failed"
+ check_stats ost1 "punch" 1
- rm -f ${testdir}/${tfile} || error "file remove failed"
+ rm -f $testdir/$tfile || error "file remove failed"
wait_delete_completed
- check_stats ost "destroy" 1
+ check_stats ost1 "destroy" 1
- rm -rf $DIR/${tdir}
+ rm -rf $DIR/$tdir
}
run_test 133c "Verifying OST stats ========================================"
}
run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
-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
+proc_regexp="/{proc,sys}/{fs,sys,kernel/debug}/{lustre,lnet}/"
test_133f() {
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
# First without trusting modes.
+ local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
+ echo "proc_dirs='$proc_dirs'"
+ [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
find $proc_dirs -exec cat '{}' \; &> /dev/null
# Second verifying readability.
# 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 \
+ for facet in mds1 ost1; do
+ local facet_proc_dirs=$(do_facet $facet \
+ \\\ls -d $proc_regexp 2>/dev/null)
+ echo "${facet}_proc_dirs='$facet_proc_dirs'"
+ [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
+ do_facet $facet find $facet_proc_dirs \
! -name req_history \
-exec cat '{}' \\\; &> /dev/null
- do_facet $facet find $proc_dirs \
+ do_facet $facet find $facet_proc_dirs \
! -name req_history \
-type f \
-exec cat '{}' \\\; &> /dev/null ||
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
# Second verifying writability.
+ local proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
+ echo "proc_dirs='$proc_dirs'"
+ [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
find $proc_dirs \
-type f \
-not -name force_lbug \
-not -name changelog_mask \
- -exec badarea_io '{}' \; &> /dev/null ||
+ -exec badarea_io '{}' \; ||
error "find $proc_dirs failed"
- [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] &&
- skip "Too old lustre on MDS" && return
-
- [ $(lustre_version_code ost1) -le $(version_code 2.5.54) ] &&
- skip "Too old lustre on ost1" && return
-
local facet
- for facet in $SINGLEMDS ost1; do
- do_facet $facet find $proc_dirs \
+ for facet in mds1 ost1; do
+ [ $(lustre_version_code $facet) -le $(version_code 2.5.54) ] &&
+ skip "Too old lustre on $facet" && continue
+ local facet_proc_dirs=$(do_facet $facet \
+ \\\ls -d $proc_regexp 2> /dev/null)
+ echo "${facet}_proc_dirs='$facet_proc_dirs'"
+ [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
+ do_facet $facet find $facet_proc_dirs \
-type f \
-not -name force_lbug \
-not -name changelog_mask \
- -exec badarea_io '{}' \\\; &> /dev/null ||
- error "$facet find $proc_dirs failed"
-
+ -exec badarea_io '{}' \\\; ||
+ error "$facet find $facet_proc_dirs failed"
done
# remount the FS in case writes/reads /proc break the FS
}
run_test 133g "Check for Oopses on bad io area writes/reads in /proc"
+test_133h() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.9.54) ]] &&
+ skip "Need MDS version at least 2.9.54" && return
+
+ local facet
+ for facet in client mds1 ost1; do
+ local facet_proc_dirs=$(do_facet $facet \
+ \\\ls -d $proc_regexp 2> /dev/null)
+ [ -z "$facet_proc_dirs" ] && error "no proc_dirs on $facet"
+ echo "${facet}_proc_dirs='$facet_proc_dirs'"
+ # Get the list of files that are missing the terminating newline
+ local missing=($(do_facet $facet \
+ find ${facet_proc_dirs} -type f \| \
+ while read F\; do \
+ awk -v FS='\v' -v RS='\v\v' \
+ "'END { if(NR>0 && \
+ \\\$NF !~ /.*\\\n\$/) \
+ print FILENAME}'" \
+ '\$F'\; \
+ done 2>/dev/null))
+ [ ${#missing[*]} -eq 0 ] ||
+ error "files do not end with newline: ${missing[*]}"
+ done
+}
+run_test 133h "Proc files should end with newlines"
+
test_134a() {
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.7.54) ]] &&
test_140() { #bug-17379
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
+ test_mkdir $DIR/$tdir
cd $DIR/$tdir || error "Changing to $DIR/$tdir"
cp $(which stat) . || error "Copying stat to $DIR/$tdir"
# VFS limits max symlink depth to 5(4KSTACK) or 7(8KSTACK) or 8
# For kernel > 3.5, bellow only tests consecutive symlink (MAX 40)
local i=0
- while i=`expr $i + 1`; do
- test_mkdir -p $i || error "Creating dir $i"
- cd $i || error "Changing to $i"
- ln -s ../stat stat || error "Creating stat symlink"
- # Read the symlink until ELOOP present,
- # not LBUGing the system is considered success,
- # we didn't overrun the stack.
- $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
- [ $ret -ne 0 ] && {
- if [ $ret -eq 40 ]; then
- break # -ELOOP
- else
- error "Open stat symlink"
- return
- fi
- }
- done
- i=`expr $i - 1`
- echo "The symlink depth = $i"
+ while i=$((i + 1)); do
+ test_mkdir $i
+ cd $i || error "Changing to $i"
+ ln -s ../stat stat || error "Creating stat symlink"
+ # Read the symlink until ELOOP present,
+ # not LBUGing the system is considered success,
+ # we didn't overrun the stack.
+ $OPENFILE -f O_RDONLY stat >/dev/null 2>&1; ret=$?
+ if [ $ret -ne 0 ]; then
+ if [ $ret -eq 40 ]; then
+ break # -ELOOP
+ else
+ error "Open stat symlink"
+ return
+ fi
+ fi
+ done
+ i=$((i - 1))
+ echo "The symlink depth = $i"
[ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] ||
error "Invalid symlink depth"
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local TF="$TMP/$tfile"
- dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
- cp $TF $DIR/$tfile
- cancel_lru_locks osc
- cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
- remount_client $MOUNT
- df -P $MOUNT
- cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
+ dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
+ cp $TF $DIR/$tfile
+ cancel_lru_locks $OSC
+ cmp $TF $DIR/$tfile || error "$TMP/$tfile $DIR/$tfile differ"
+ remount_client $MOUNT
+ df -P $MOUNT
+ cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (remount)"
- $TRUNCATE $TF 6000
- $TRUNCATE $DIR/$tfile 6000
- cancel_lru_locks osc
- cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
+ $TRUNCATE $TF 6000
+ $TRUNCATE $DIR/$tfile 6000
+ cancel_lru_locks $OSC
+ cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (truncate1)"
- echo "12345" >>$TF
- echo "12345" >>$DIR/$tfile
- cancel_lru_locks osc
- cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
+ echo "12345" >>$TF
+ echo "12345" >>$DIR/$tfile
+ cancel_lru_locks $OSC
+ cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append1)"
- echo "12345" >>$TF
- echo "12345" >>$DIR/$tfile
- cancel_lru_locks osc
- cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
+ echo "12345" >>$TF
+ echo "12345" >>$DIR/$tfile
+ cancel_lru_locks $OSC
+ cmp $TF $DIR/$tfile || error "$TF $DIR/$tfile differ (append2)"
- rm -f $TF
- true
+ rm -f $TF
+ true
}
run_test 150 "truncate/append tests"
function roc_hit_init() {
local list=$(comma_list $(osts_nodes))
local dir=$DIR/$tdir-check
- local file=$dir/file
+ local file=$dir/$tfile
local BEFORE
local AFTER
local idx
- test_mkdir -p $dir
+ test_mkdir $dir
#use setstripe to do a write to every ost
for i in $(seq 0 $((OSTCOUNT-1))); do
$SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
test_154g()
{
- [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) ]] ||
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) && \
+ $(lustre_version_code client) -gt $(version_code 2.6.99) ]] ||
{ skip "Need MDS version at least 2.6.92"; return 0; }
[ -n "$FILESET" ] && skip "SKIP due to FILESET set" && return
dd if=/dev/urandom of=$temp bs=6096 count=1 || \
error "dd of=$temp bs=6096 count=1 failed"
cp $temp $file
- cancel_lru_locks osc
+ cancel_lru_locks $OSC
cmp $temp $file || error "$temp $file differ"
$TRUNCATE $temp 6000
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
- rm -f $file
restore_lustre_params < $p
- rm -f $p
+ rm -f $p $file
}
run_test 156 "Verification of tunables"
run_test 160d "verify that changelog log catch the migrate event"
test_160e() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
# Create a user
CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
changelog_register -n)
}
run_test 160e "changelog negative testing"
+cleanup_160f() {
+ trap 0
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0 fail_val=0
+ echo "Deregistering changelog client $CL_USER"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER
+ echo "Deregistering changelog client $CL_USER2"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $CL_USER2
+ restore_lustre_params < $save_params
+ rm -f $save_params
+}
+
+test_160f() {
+ # do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_gc=1
+ # should be set by default
+
+ local CL_USERS="mdd.$MDT0.changelog_users"
+ local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+ local save_params="$TMP/sanity-$TESTNAME.parameters"
+
+ save_lustre_params $SINGLEMDS \
+ "mdd.$MDT0.changelog_max_idle_time" > $save_params
+ save_lustre_params $SINGLEMDS \
+ "mdd.$MDT0.changelog_min_gc_interval" >> $save_params
+ save_lustre_params $SINGLEMDS \
+ "mdd.$MDT0.changelog_min_free_cat_entries" >> $save_params
+
+ trap cleanup_160f EXIT
+
+ # Create a user
+ CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ echo "Registered as changelog user $CL_USER"
+ CL_USER2=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ echo "Registered as changelog user $CL_USER2"
+ $GET_CL_USERS | grep -q $CL_USER ||
+ error "User $CL_USER not found in changelog_users"
+ $GET_CL_USERS | grep -q $CL_USER2 ||
+ error "User $CL_USER2 not found in changelog_users"
+
+ # generate some changelogs to accumulate
+ mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+ touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
+ touch $DIR/$tdir/${tfile}2 || error "touch $DIR/$tdir/${tfile}2 failed"
+ rm -f $DIR/$tdir/$tfile || error "rm -f $tfile failed"
+
+ # check changelogs have been generated
+ nbcl=$($LFS changelog $MDT0 | wc -l)
+ [[ $nbcl -eq 0 ]] && error "no changelogs found"
+
+ do_facet $SINGLEMDS $LCTL set_param \
+ mdd.$MDT0.changelog_max_idle_time=10
+ do_facet $SINGLEMDS $LCTL set_param \
+ mdd.$MDT0.changelog_min_gc_interval=2
+ do_facet $SINGLEMDS $LCTL set_param \
+ mdd.$MDT0.changelog_min_free_cat_entries=3
+
+ # simulate changelog catalog almost full
+#define OBD_FAIL_CAT_FREE_RECORDS 0x1313
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1313
+ do_facet $SINGLEMDS $LCTL set_param fail_val=3
+
+ sleep 6
+ USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+ $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 2))
+ USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+ echo "verifying user clear: $(( $USER_REC1 + 2 )) == $USER_REC2"
+ [ $USER_REC2 == $(($USER_REC1 + 2)) ] ||
+ error "user index expected $(($USER_REC1 + 2)) is $USER_REC2"
+ sleep 5
+
+ # generate one more changelog to trigger fail_loc
+ rm -rf $DIR/$tdir || error "rm -rf $tdir failed"
+
+ # ensure gc thread is done
+ wait_update_facet $SINGLEMDS \
+ "ps -e -o comm= | grep chlg_gc_thread" "" 20
+
+ # check user still registered
+ $GET_CL_USERS | grep -q $CL_USER ||
+ error "User $CL_USER not found in changelog_users"
+ # check user2 unregistered
+ $GET_CL_USERS | grep -q $CL_USER2 &&
+ error "User $CL_USER2 still found in changelog_users"
+
+ # check changelogs are present and starting at $USER_REC2 + 1
+ FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}')
+ echo "verifying min purge: $(( $USER_REC2 + 1 )) == $FIRST_REC"
+ [ $FIRST_REC == $(($USER_REC2 + 1)) ] ||
+ error "first index should be $(($USER_REC2 + 1)) is $FIRST_REC"
+
+ cleanup_160f
+}
+run_test 160f "changelog garbage collect (timestamped users)"
+
+test_160g() {
+ # do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_gc=1
+ # should be set by default
+
+ local CL_USERS="mdd.$MDT0.changelog_users"
+ local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+ local save_params="$TMP/sanity-$TESTNAME.parameters"
+
+ save_lustre_params $SINGLEMDS \
+ "mdd.$MDT0.changelog_max_idle_indexes" > $save_params
+ save_lustre_params $SINGLEMDS \
+ "mdd.$MDT0.changelog_min_gc_interval" >> $save_params
+ save_lustre_params $SINGLEMDS \
+ "mdd.$MDT0.changelog_min_free_cat_entries" >> $save_params
+
+ trap cleanup_160f EXIT
+
+#define OBD_FAIL_TIME_IN_CHLOG_USER 0x1314
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1314
+
+ # Create a user
+ CL_USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ echo "Registered as changelog user $CL_USER"
+ CL_USER2=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ echo "Registered as changelog user $CL_USER2"
+ $GET_CL_USERS | grep -q $CL_USER ||
+ error "User $CL_USER not found in changelog_users"
+ $GET_CL_USERS | grep -q $CL_USER2 ||
+ error "User $CL_USER2 not found in changelog_users"
+
+ # generate some changelogs to accumulate
+ mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+ touch $DIR/$tdir/$tfile || error "touch $DIR/$tdir/$tfile failed"
+ touch $DIR/$tdir/${tfile}2 || error "touch $DIR/$tdir/${tfile}2 failed"
+ rm -f $DIR/$tdir/$tfile || error "rm -f $tfile failed"
+
+ # check changelogs have been generated
+ nbcl=$($LFS changelog $MDT0 | wc -l)
+ [[ $nbcl -eq 0 ]] && error "no changelogs found"
+
+ do_facet $SINGLEMDS $LCTL set_param \
+ mdd.$MDT0.changelog_max_idle_indexes=$((nbcl - 1))
+ do_facet $SINGLEMDS $LCTL set_param \
+ mdd.$MDT0.changelog_min_gc_interval=2
+ do_facet $SINGLEMDS $LCTL set_param \
+ mdd.$MDT0.changelog_min_free_cat_entries=3
+
+ # simulate changelog catalog almost full
+#define OBD_FAIL_CAT_FREE_RECORDS 0x1313
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x1313
+ do_facet $SINGLEMDS $LCTL set_param fail_val=3
+
+ USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+ $LFS changelog_clear $MDT0 $CL_USER $(($USER_REC1 + 3))
+ USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$CL_USER\" {print \$2}")
+ echo "verifying user clear: $(( $USER_REC1 + 3 )) == $USER_REC2"
+ [ $USER_REC2 == $(($USER_REC1 + 3)) ] ||
+ error "user index expected $(($USER_REC1 + 3)) is $USER_REC2"
+
+ # generate one more changelog to trigger fail_loc
+ rm -rf $DIR/$tdir || error "rm -rf $tdir failed"
+
+ # ensure gc thread is done
+ wait_update_facet $SINGLEMDS \
+ "ps -e -o comm= | grep chlg_gc_thread" "" 20
+
+ # check user still registered
+ $GET_CL_USERS | grep -q $CL_USER ||
+ error "User $CL_USER not found in changelog_users"
+ # check user2 unregistered
+ $GET_CL_USERS | grep -q $CL_USER2 &&
+ error "User $CL_USER2 still found in changelog_users"
+
+ # check changelogs are present and starting at $USER_REC2 + 1
+ FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}')
+ echo "verifying min purge: $(( $USER_REC2 + 1 )) == $FIRST_REC"
+ [ $FIRST_REC == $(($USER_REC2 + 1)) ] ||
+ error "first index should be $(($USER_REC2 + 1)) is $FIRST_REC"
+
+ cleanup_160f
+}
+run_test 160g "changelog garbage collect (old users)"
+
test_161a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p -c1 $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir
cp /etc/hosts $DIR/$tdir/$tfile
test_mkdir -c1 $DIR/$tdir/foo1
test_mkdir -c1 $DIR/$tdir/foo2
}
run_test 161c "check CL_RENME[UNLINK] changelog record flags"
+test_161d() {
+ local user
+ local pid
+ local fid
+
+ # cleanup previous run
+ rm -rf $DIR/$tdir/$tfile
+
+ user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ [[ $? -eq 0 ]] || error "changelog_register failed"
+
+ # work in a standalone dir to avoid locking on $DIR/$MOUNT to
+ # interfer with $MOUNT/.lustre/fid/ access
+ mkdir $DIR/$tdir
+ [[ $? -eq 0 ]] || error "mkdir failed"
+
+ #define OBD_FAIL_LLITE_CREATE_NODE_PAUSE 0x140c | OBD_FAIL_ONCE
+ $LCTL set_param fail_loc=0x8000140c
+ # 5s pause
+ $LCTL set_param fail_val=5
+
+ # create file
+ echo foofoo > $DIR/$tdir/$tfile &
+ pid=$!
+
+ # wait for create to be delayed
+ sleep 2
+
+ ps -p $pid
+ [[ $? -eq 0 ]] || error "create should be blocked"
+
+ local tempfile=$(mktemp)
+ fid=$(changelog_extract_field $MDT0 "CREAT" "$tfile" "t=")
+ cat $MOUNT/.lustre/fid/$fid 2>/dev/null >$tempfile || error "cat failed"
+ # some delay may occur during ChangeLog publishing and file read just
+ # above, that could allow file write to happen finally
+ [[ -s $tempfile ]] && echo "file should be empty"
+
+ $LCTL set_param fail_loc=0
+
+ wait $pid
+ [[ $? -eq 0 ]] || error "create failed"
+
+ $LFS changelog_clear $MDT0 $user 0
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $user
+}
+run_test 161d "create with concurrent .lustre/fid access"
+
check_path() {
local expected=$1
shift
local rc=0
local rmmod_remote=0
- do_facet ost1 "lsmod | grep -q obdecho || " \
- "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \
- "modprobe obdecho; }" && rmmod_remote=1
+ do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
+ rmmod_remote=true || error "failed to load module obdecho"
target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4;exit}')
[[ -n $target ]] && { obdecho_test $target ost1 || rc=1; }
- [ $rmmod_remote -eq 1 ] && do_facet ost1 "rmmod obdecho"
+ $rmmod_remote && do_facet ost1 "rmmod obdecho"
return $rc
}
run_test 180b "test obdecho directly on obdfilter"
run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
test_181() { # bug 22177
- test_mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
+ test_mkdir $DIR/$tdir
# create enough files to index the directory
createmany -o $DIR/$tdir/foobar 4000
# print attributes for debug purpose
check_swap_layouts_support && return 0
dir0=$DIR/$tdir/$testnum
- test_mkdir -p -c1 $dir0 || error "creating dir $dir0"
+ test_mkdir -p -c1 $dir0
ref1=/etc/passwd
ref2=/etc/group
file1=$dir0/f1
error "create $file2 failed"
$OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 ||
error "create $file3 failed"
- lovea1=$($LFS getstripe $file1 | sed 1d)
+ lovea1=$(get_layout_param $file1)
$LFS swap_layouts $file2 $file3 ||
error "swap $file2 $file3 layouts failed"
$LFS swap_layouts $file1 $file2 ||
error "swap $file1 $file2 layouts failed"
- lovea2=$($LFS getstripe $file2 | sed 1d)
+ lovea2=$(get_layout_param $file2)
+ echo "$lovea1"
+ echo "$lovea2"
[ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
local test_path=$POOL_ROOT/$POOL_DIR_NAME
local file_dir=$POOL_ROOT/file_tst
local subdir=$test_path/subdir
-
local rc=0
+
+ if ! combined_mgs_mds ; then
+ mount_mgs_client
+ fi
+
while : ; do
# former test_200a test_200b
pool_add $POOL || { rc=$? ; break; }
pool_create_files $POOL $file_dir $files "$ost_list" \
|| { rc=$? ; break; }
# former test_200g test_200h
- pool_lfs_df $POOL || { rc=$? ; break; }
+ pool_lfs_df $POOL || { rc=$? ; break; }
pool_file_rel_path $POOL $test_path || { rc=$? ; break; }
# former test_201a test_201b test_201c
local f=$test_path/$tfile
pool_remove_all_targets $POOL $f || { rc=$? ; break; }
- pool_remove $POOL $f || { rc=$? ; break; }
+ pool_remove $POOL $f || { rc=$? ; break; }
break
done
- cleanup_pools
+ destroy_test_pools
+
+ if ! combined_mgs_mds ; then
+ umount_mgs_client
+ fi
return $rc
}
run_test 200 "OST pools"
check_default_stripe_attr() {
ACTUAL=$($GETSTRIPE $* $DIR/$tdir)
case $1 in
- --stripe-count|--count)
+ --stripe-count|-c)
[ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr count);;
- --stripe-size|--size)
+ --stripe-size|-S)
[ -n "$2" ] && EXPECTED=0 || EXPECTED=$(default_attr size);;
- --stripe-index|--index)
+ --stripe-index|-i)
EXPECTED=-1;;
*)
error "unknown getstripe attr '$1'"
esac
- [ $ACTUAL != $EXPECTED ] &&
+ [ $ACTUAL == $EXPECTED ] ||
error "$DIR/$tdir has $1 '$ACTUAL', not '$EXPECTED'"
}
test_204a() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-count 0 --stripe-size 0 --stripe-index -1 $DIR/$tdir
check_default_stripe_attr --stripe-count
check_default_stripe_attr --stripe-size
check_default_stripe_attr --stripe-index
-
- return 0
}
-run_test 204a "Print default stripe attributes ================="
+run_test 204a "Print default stripe attributes"
test_204b() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-count 1 $DIR/$tdir
check_default_stripe_attr --stripe-size
check_default_stripe_attr --stripe-index
-
- return 0
}
-run_test 204b "Print default stripe size and offset ==========="
+run_test 204b "Print default stripe size and offset"
test_204c() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-size 65536 $DIR/$tdir
check_default_stripe_attr --stripe-count
check_default_stripe_attr --stripe-index
-
- return 0
}
-run_test 204c "Print default stripe count and offset ==========="
+run_test 204c "Print default stripe count and offset"
test_204d() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-index 0 $DIR/$tdir
check_default_stripe_attr --stripe-count
check_default_stripe_attr --stripe-size
-
- return 0
}
-run_test 204d "Print default stripe count and size ============="
+run_test 204d "Print default stripe count and size"
test_204e() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE -d $DIR/$tdir
check_default_stripe_attr --stripe-count --raw
check_default_stripe_attr --stripe-size --raw
check_default_stripe_attr --stripe-index --raw
-
- return 0
}
-run_test 204e "Print raw stripe attributes ================="
+run_test 204e "Print raw stripe attributes"
test_204f() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-count 1 $DIR/$tdir
check_default_stripe_attr --stripe-size --raw
check_default_stripe_attr --stripe-index --raw
-
- return 0
}
-run_test 204f "Print raw stripe size and offset ==========="
+run_test 204f "Print raw stripe size and offset"
test_204g() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-size 65536 $DIR/$tdir
check_default_stripe_attr --stripe-count --raw
check_default_stripe_attr --stripe-index --raw
-
- return 0
}
-run_test 204g "Print raw stripe count and offset ==========="
+run_test 204g "Print raw stripe count and offset"
test_204h() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
$SETSTRIPE --stripe-index 0 $DIR/$tdir
check_default_stripe_attr --stripe-count --raw
check_default_stripe_attr --stripe-size --raw
-
- return 0
}
-run_test 204h "Print raw stripe count and size ============="
+run_test 204h "Print raw stripe count and size"
# Figure out which job scheduler is being used, if any,
# or use a fake one
}
test_205() { # Job stats
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.7.1) ]] ||
+ { skip "Need MDS version with at least 2.7.1"; return 0; }
+
[ $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
# having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
create_lnet_proc_files() {
- lctl get_param -n $1 >$TMP/lnet_$1.out || error "cannot read lnet.$1"
- sysctl lnet.$1 >$TMP/lnet_$1.sys_tmp || error "cannot read lnet.$1"
-
- sed "s/^lnet.$1\ =\ //g" "$TMP/lnet_$1.sys_tmp" >$TMP/lnet_$1.sys
- rm -f "$TMP/lnet_$1.sys_tmp"
+ lctl get_param -n $1 >$TMP/lnet_$1.sys || error "cannot read lnet.$1"
}
# counterpart of create_lnet_proc_files
remove_lnet_proc_files() {
- rm -f $TMP/lnet_$1.out $TMP/lnet_$1.sys
+ rm -f $TMP/lnet_$1.sys
}
# uses 1st arg as trailing part of filename, 2nd arg as description for reports,
# can we successfully write to lnet.stats?
lctl set_param -n stats=0 || error "cannot write to lnet.stats"
- sysctl -w lnet.stats=0 || error "cannot write to lnet.stats"
}
run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
"ldlm.namespaces.filter-*.contended_locks" >> $p
save_lustre_params $facets \
"ldlm.namespaces.filter-*.contention_seconds" >> $p
- clear_osc_stats
+ clear_stats osc.*.osc_stats
- # agressive lockless i/o settings
- for node in $(osts_nodes); do
- do_node $node 'lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes 2000000; lctl set_param -n ldlm.namespaces.filter-*.contended_locks 0; lctl set_param -n ldlm.namespaces.filter-*.contention_seconds 60'
- done
- lctl set_param -n osc.*.contention_seconds 60
+ # agressive lockless i/o settings
+ do_nodes $(comma_list $(osts_nodes)) \
+ "lctl set_param -n ldlm.namespaces.*.max_nolock_bytes=2000000 \
+ ldlm.namespaces.filter-*.contended_locks=0 \
+ ldlm.namespaces.filter-*.contention_seconds=60"
+ lctl set_param -n osc.*.contention_seconds=60
- $DIRECTIO write $DIR/$tfile 0 10 4096
- $CHECKSTAT -s 40960 $DIR/$tfile
+ $DIRECTIO write $DIR/$tfile 0 10 4096
+ $CHECKSTAT -s 40960 $DIR/$tfile
- # disable lockless i/o
- for node in $(osts_nodes); do
- do_node $node 'lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes 0; lctl set_param -n ldlm.namespaces.filter-*.contended_locks 32; lctl set_param -n ldlm.namespaces.filter-*.contention_seconds 0'
- done
- lctl set_param -n osc.*.contention_seconds 0
- clear_osc_stats
+ # disable lockless i/o
+ do_nodes $(comma_list $(osts_nodes)) \
+ "lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes=0 \
+ ldlm.namespaces.filter-*.contended_locks=32 \
+ ldlm.namespaces.filter-*.contention_seconds=0"
+ lctl set_param -n osc.*.contention_seconds=0
+ clear_stats osc.*.osc_stats
- dd if=/dev/zero of=$DIR/$tfile count=0
- $CHECKSTAT -s 0 $DIR/$tfile
+ dd if=/dev/zero of=$DIR/$tfile count=0
+ $CHECKSTAT -s 0 $DIR/$tfile
- restore_lustre_params <$p
- rm -f $p
- rm $DIR/$tfile
+ restore_lustre_params <$p
+ rm -f $p
+ rm $DIR/$tfile
}
-run_test 216 "check lockless direct write works and updates file size and kms correctly"
+run_test 216 "check lockless direct write updates file size and kms correctly"
test_217() { # bug 22430
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
for node in $(nodes_list); do
nid=$(host_nids_address $node $NETTYPE)
if [[ $nid = *-* ]] ; then
- echo "lctl ping $nid@$NETTYPE"
- lctl ping $nid@$NETTYPE
+ echo "lctl ping $(h2nettype $nid)"
+ lctl ping $(h2nettype $nid)
else
echo "skipping $node (no hyphen detected)"
fi
$LFS df -i
+ if ! combined_mgs_mds ; then
+ mount_mgs_client
+ fi
+
do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=-1
#define OBD_FAIL_OST_ENOINO 0x229
do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x229
do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=0
do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0
- do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4
- do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5
+ do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST ||
+ error "$LCTL pool_remove $FSNAME.$TESTNAME $OST failed"
+ do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
+ error "$LCTL pool_destroy $FSNAME.$TESTNAME failed"
echo "unlink $MDSOBJS files @$next_id..."
- unlinkmany $DIR/$tdir/f $MDSOBJS || return 6
+ unlinkmany $DIR/$tdir/f $MDSOBJS || error "unlinkmany failed"
+
+ if ! combined_mgs_mds ; then
+ umount_mgs_client
+ fi
}
run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
test_222a () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -c 1 -i 0 $DIR/$tdir
- createmany -o $DIR/$tdir/$tfile 10
- cancel_lru_locks mdc
- cancel_lru_locks osc
- #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
- $LCTL set_param fail_loc=0x31a
- ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
- $LCTL set_param fail_loc=0
- rm -r $DIR/$tdir
+ rm -rf $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 1 -i 0 $DIR/$tdir
+ createmany -o $DIR/$tdir/$tfile 10
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ #define OBD_FAIL_LDLM_AGL_DELAY 0x31a
+ $LCTL set_param fail_loc=0x31a
+ ls -l $DIR/$tdir > /dev/null || error "AGL for ls failed"
+ $LCTL set_param fail_loc=0
+ rm -r $DIR/$tdir
}
-run_test 222a "AGL for ls should not trigger CLIO lock failure ================"
+run_test 222a "AGL for ls should not trigger CLIO lock failure"
test_222b () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -c 1 -i 0 $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 1 -i 0 $DIR/$tdir
createmany -o $DIR/$tdir/$tfile 10
cancel_lru_locks mdc
cancel_lru_locks osc
rm -r $DIR/$tdir || error "AGL for rmdir failed"
$LCTL set_param fail_loc=0
}
-run_test 222b "AGL for rmdir should not trigger CLIO lock failure ============="
+run_test 222b "AGL for rmdir should not trigger CLIO lock failure"
test_223 () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- rm -rf $DIR/$tdir
- test_mkdir -p $DIR/$tdir
- $SETSTRIPE -c 1 -i 0 $DIR/$tdir
- createmany -o $DIR/$tdir/$tfile 10
- cancel_lru_locks mdc
- cancel_lru_locks osc
- #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
- $LCTL set_param fail_loc=0x31b
- ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
- $LCTL set_param fail_loc=0
- rm -r $DIR/$tdir
+ rm -rf $DIR/$tdir
+ test_mkdir $DIR/$tdir
+ $LFS setstripe -c 1 -i 0 $DIR/$tdir
+ createmany -o $DIR/$tdir/$tfile 10
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ #define OBD_FAIL_LDLM_AGL_NOLOCK 0x31b
+ $LCTL set_param fail_loc=0x31b
+ ls -l $DIR/$tdir > /dev/null || error "reenqueue failed"
+ $LCTL set_param fail_loc=0
+ rm -r $DIR/$tdir
}
run_test 223 "osc reenqueue if without AGL lock granted ======================="
skip_env "Need to mount OST to test" && return
fi
- [ $MDSCOUNT -ge 2 ] &&
- skip "skipping now for more than one MDT" && return
local mds=$(facet_host $SINGLEMDS)
local target=$(do_nodes $mds 'lctl dl' | \
awk "{if (\$2 == \"UP\" && \$3 == \"mdt\") {print \$4}}")
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
- skip "non-ldiskfs backend" && return
+ skip "ldiskfs only test" && return
local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
local myDIR=$DIR/$tdir
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
- skip "non-ldiskfs backend" && return
+ skip "ldiskfs only test" && return
local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
local myDIR=$DIR/$tdir
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
- skip "non-ldiskfs backend" && return
+ skip "ldiskfs only test" && return
local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
local myDIR=$DIR/$tdir
$GETSTRIPE -v $DIR/$tfile
local pattern=$($GETSTRIPE -L $DIR/$tfile)
- [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
+ [ X"$pattern" = X"released" ] || error "pattern error ($pattern)"
local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
[ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
# 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))
+ local brw_size=$(do_facet ost1 $LCTL get_param -n obdfilter.*.brw_size |
+ head -n 1)
mkdir -p $DIR/$tdir
+ $LFS setstripe -S ${brw_size}M $DIR/$tdir ||
+ error "failed to set stripe with -S ${brw_size}M option"
# clear the OSC stats
$LCTL set_param osc.*.stats=0 &>/dev/null
#LU-2935
test_236() {
check_swap_layouts_support && return 0
- test_mkdir -p -c1 $DIR/$tdir || error "mkdir $tdir failed"
+ test_mkdir -c1 $DIR/$tdir
local ref1=/etc/passwd
local ref2=/etc/group
mkdir -p $DIR/$tdir
createmany -o $DIR/$tdir/f- 5000
unlinkmany $DIR/$tdir/f- 5000
- do_nodes $list "lctl set_param -n osp*.*.sync_changes 1"
- changes=$(do_nodes $list "lctl get_param -n osc.*MDT*.sync_changes \
- osc.*MDT*.sync_in_flight" | calc_sum)
+ [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.10.53) ] &&
+ do_nodes $list "lctl set_param -n osp.*.force_sync=1"
+ changes=$(do_nodes $list "lctl get_param -n osp.*MDT*.sync_changes \
+ osp.*MDT*.sync_in_flight" | calc_sum)
[ "$changes" -eq 0 ] || error "$changes not synced"
}
run_test 239 "osp_sync test"
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 || true
+ cancel_lru_locks $OSC || true
done
}
test_241a() { # was test_241
dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
ls -la $DIR/$tfile
- cancel_lru_locks osc
+ cancel_lru_locks $OSC
test_241_bio 1000 &
PID=$!
test_241_dio 1000
test_243()
{
- test_mkdir -p $DIR/$tdir
+ test_mkdir $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
+ test_mkdir $DIR/$tdir
dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35
sendfile_grouplock $DIR/$tdir/$tfile || \
error "sendfile+grouplock failed"
}
run_test 246 "Read file of size 4095 should return right length"
+cleanup_247() {
+ local submount=$1
+
+ trap 0
+ umount_client $submount
+ rmdir $submount
+}
+
test_247a() {
lctl get_param -n mdc.$FSNAME-MDT0000*.import |
grep -q subtree ||
mkdir -p $submount || error "mkdir $submount failed"
FILESET="$FILESET/$tdir" mount_client $submount ||
error "mount $submount failed"
+ trap "cleanup_247 $submount" EXIT
echo foo > $submount/$tfile || error "write $submount/$tfile failed"
[ $(cat $MOUNT/$tdir/$tfile) = "foo" ] ||
error "read $MOUNT/$tdir/$tfile failed"
- umount_client $submount || error "umount $submount failed"
- rmdir $submount
+ cleanup_247 $submount
}
run_test 247a "mount subdir as fileset"
mkdir -p $MOUNT/$tdir/dir1
mkdir -p $submount || error "mkdir $submount failed"
+ trap "cleanup_247 $submount" EXIT
FILESET="$FILESET/$tdir" mount_client $submount ||
error "mount $submount failed"
local fid=$($LFS path2fid $MOUNT/)
$LFS fid2path $submount $fid && error "fid2path should fail"
- umount_client $submount || error "umount $submount failed"
- rmdir $submount
+ cleanup_247 $submount
}
run_test 247c "running fid2path outside root"
mkdir -p $submount || error "mkdir $submount failed"
FILESET="$FILESET/$tdir" mount_client $submount ||
error "mount $submount failed"
+ trap "cleanup_247 $submount" EXIT
local fid=$($LFS path2fid $submount/dir1)
$LFS fid2path $submount $fid || error "fid2path should succeed"
- umount_client $submount || error "umount $submount failed"
- rmdir $submount
+ cleanup_247 $submount
}
run_test 247d "running fid2path inside root"
# small read with fast read enabled
$LCTL set_param -n llite.*.fast_read=1
local t_fast=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
- awk '/copied/ { print $6 }')
-
+ egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+ sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
# small read with fast read disabled
$LCTL set_param -n llite.*.fast_read=0
local t_slow=$(dd if=$DIR/$tfile of=/dev/null bs=4k 2>&1 |
- awk '/copied/ { print $6 }')
+ egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+ sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
# verify that fast read is 4 times faster for cache read
[ $(bc <<< "4 * $t_fast < $t_slow") -eq 1 ] ||
# 1k non-cache read
cancel_lru_locks osc
local t_1k=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
- awk '/copied/ { print $6 }')
+ egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+ sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
# 1M non-cache read
cancel_lru_locks osc
local t_1m=$(dd if=$DIR/$tfile of=/dev/null bs=1k 2>&1 |
- awk '/copied/ { print $6 }')
+ egrep -o '([[:digit:]\.\,e-]+) s' | cut -d's' -f1 |
+ sed -e 's/,/./' -e 's/[eE]+*/\*10\^/')
# verify that big IO is not 4 times faster than small IO
[ $(bc <<< "4 * $t_1k >= $t_1m") -eq 1 ] ||
remote_ost_nodsh && skip "remote OST with nodsh" && return
if [ "$(facet_fstype ost1)" != "ldiskfs" -o \
"$(facet_fstype mds1)" != "ldiskfs" ]; then
- skip "can only run lr_reader on ldiskfs target"
+ skip "ldiskfs only test"
return
fi
osp.$mdtosc_proc1.reserved_mb_low)
echo "prev high watermark $last_wm_h, prev low watermark $last_wm_l"
+ if ! combined_mgs_mds ; then
+ mount_mgs_client
+ fi
create_pool $FSNAME.$TESTNAME || error "Pool creation failed"
do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $ost_name ||
error "Adding $ost_name to pool failed"
error "Remove $ost_name from pool failed"
do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME ||
error "Pool destroy fialed"
+
+ if ! combined_mgs_mds ; then
+ umount_mgs_client
+ fi
}
run_test 253 "Check object allocation limit"
return 1
}
+percent() {
+ bc <<<"scale=2; ($1 - $2) * 100 / $2"
+}
+
+# run a random read IO workload
+# usage: random_read_iops <filename> <filesize> <iosize>
+random_read_iops() {
+ local file=$1
+ local fsize=$2
+ local iosize=${3:-4096}
+
+ $READS -f $file -s $fsize -b $iosize -n $((fsize / iosize)) -t 60 |
+ sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##'
+}
+
+drop_file_oss_cache() {
+ local file="$1"
+ local nodes="$2"
+
+ $LFS ladvise -a dontneed $file 2>/dev/null ||
+ do_nodes $nodes "echo 3 > /proc/sys/vm/drop_caches"
+}
+
ladvise_willread_performance()
{
local repeat=10
+ local average_origin=0
local average_cache=0
local average_ladvise=0
for ((i = 1; i <= $repeat; i++)); do
echo "Iter $i/$repeat: reading without willread hint"
cancel_lru_locks osc
- do_nodes $(comma_list $(osts_nodes)) \
- "echo 3 > /proc/sys/vm/drop_caches"
- local speed_origin=$($READS -f $DIR/$tfile -s $size \
- -b 4096 -n $((size / 4096)) -t 60 |
- sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##')
+ drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
+ local speed_origin=$(random_read_iops $DIR/$tfile $size)
+ echo "Iter $i/$repeat: uncached speed: $speed_origin"
+ average_origin=$(bc <<<"$average_origin + $speed_origin")
- echo "Iter $i/$repeat: Reading again without willread hint"
cancel_lru_locks osc
- local speed_cache=$($READS -f $DIR/$tfile -s $size \
- -b 4096 -n $((size / 4096)) -t 60 |
- sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##')
+ local speed_cache=$(random_read_iops $DIR/$tfile $size)
+ echo "Iter $i/$repeat: OSS cache speed: $speed_cache"
+ average_cache=$(bc <<<"$average_cache + $speed_cache")
- echo "Iter $i/$repeat: reading with willread hint"
cancel_lru_locks osc
- do_nodes $(comma_list $(osts_nodes)) \
- "echo 3 > /proc/sys/vm/drop_caches"
- lfs ladvise -a willread $DIR/$tfile ||
- error "Ladvise failed"
- local speed_ladvise=$($READS -f $DIR/$tfile -s $size \
- -b 4096 -n $((size / 4096)) -t 60 |
- sed -e '/^$/d' -e 's#.*s, ##' -e 's#MB/s##')
-
- local cache_speedup=$(echo "scale=2; \
- ($speed_cache-$speed_origin)/$speed_origin*100" | bc)
- cache_speedup=$(echo ${cache_speedup%.*})
- echo "Iter $i/$repeat: cache speedup: $cache_speedup%"
- average_cache=$((average_cache + cache_speedup))
-
- local ladvise_speedup=$(echo "scale=2; \
- ($speed_ladvise-$speed_origin)/$speed_origin*100" | bc)
- ladvise_speedup=$(echo ${ladvise_speedup%.*})
- echo "Iter $i/$repeat: ladvise speedup: $ladvise_speedup%"
- average_ladvise=$((average_ladvise + ladvise_speedup))
- done
- average_cache=$((average_cache / repeat))
- average_ladvise=$((average_ladvise / repeat))
-
- if [ $average_cache -lt 20 ]; then
- echo "Speedup with cache is less than 20% ($average_cache%),"\
- "skipping check of speedup with willread:"\
- "$average_ladvise%"
+ drop_file_oss_cache $DIR/$tfile $(comma_list $(osts_nodes))
+ $LFS ladvise -a willread $DIR/$tfile || error "ladvise failed"
+ local speed_ladvise=$(random_read_iops $DIR/$tfile $size)
+ echo "Iter $i/$repeat: ladvise speed: $speed_ladvise"
+ average_ladvise=$(bc <<<"$average_ladvise + $speed_ladvise")
+ done
+ average_origin=$(bc <<<"scale=2; $average_origin / $repeat")
+ average_cache=$(bc <<<"scale=2; $average_cache / $repeat")
+ average_ladvise=$(bc <<<"scale=2; $average_ladvise / $repeat")
+
+ speedup_cache=$(percent $average_cache $average_origin)
+ speedup_ladvise=$(percent $average_ladvise $average_origin)
+
+ echo "Average uncached read: $average_origin"
+ echo "Average speedup with OSS cached read: " \
+ "$average_cache = +$speedup_cache%"
+ echo "Average speedup with ladvise willread: " \
+ "$average_ladvise = +$speedup_ladvise%"
+
+ local lowest_speedup=20
+ if [ ${average_cache%.*} -lt $lowest_speedup ]; then
+ echo "Speedup with OSS cached read less than $lowest_speedup%," \
+ "got $average_cache%. Skipping ladvise willread check."
return 0
fi
- local lowest_speedup=$((average_cache / 2))
- [ $average_ladvise -gt $lowest_speedup ] ||
+ # the test won't work on ZFS until it supports 'ladvise dontneed', but
+ # it is still good to run until then to exercise 'ladvise willread'
+ ! $LFS ladvise -a dontneed $DIR/$tfile &&
+ [ "$(facet_fstype ost1)" = "zfs" ] &&
+ echo "osd-zfs does not support dontneed or drop_caches" &&
+ return 0
+
+ lowest_speedup=$(bc <<<"scale=2; $average_cache / 2")
+ [ ${average_ladvise%.*} -gt $lowest_speedup ] ||
error_not_in_vm "Speedup with willread is less than " \
- "$lowest_speedup%, got $average_ladvise%"
- echo "Speedup with willread ladvise: $average_ladvise%"
- echo "Speedup with cache: $average_cache%"
+ "$lowest_speedup%, got $average_ladvise%"
}
test_255a() {
[ $(lustre_version_code ost1) -lt $(version_code 2.8.54) ] &&
skip "lustre < 2.8.54 does not support ladvise " && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
lfs setstripe -c -1 -i 0 $DIR/$tfile || error "$tfile failed"
}
test_255b() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
+ lfs setstripe -c 1 -i 0 $DIR/$tfile
+
ladvise_no_type dontneed $DIR/$tfile &&
skip "dontneed ladvise is not supported" && return
[ $(lustre_version_code ost1) -lt $(version_code 2.8.54) ] &&
skip "lustre < 2.8.54 does not support ladvise" && return
- [ "$(facet_fstype ost1)" = "zfs" ] &&
- skip "zfs-osd does not support dontneed advice" && return
-
- lfs setstripe -c 1 -i 0 $DIR/$tfile
+ ! $LFS ladvise -a dontneed $DIR/$tfile &&
+ [ "$(facet_fstype ost1)" = "zfs" ] &&
+ skip "zfs-osd does not support 'ladvise dontneed'" && return
local size_mb=100
local size=$((size_mb * 1048576))
}
run_test 255b "check 'lfs ladvise -a dontneed'"
+test_255c() {
+ local count
+ local new_count
+ local difference
+ local i
+ local rc
+
+ [ $(lustre_version_code ost1) -lt $(version_code 2.10.50) ] &&
+ skip "lustre < 2.10.53 does not support lockahead" && return
+
+ test_mkdir -p $DIR/$tdir
+ $SETSTRIPE -i 0 $DIR/$tdir
+
+ #test 10 returns only success/failure
+ i=10
+ lockahead_test -d $DIR/$tdir -t $i
+ rc=$?
+ if [ $rc -eq 255 ]; then
+ error "Ladvise test${i} failed, ${rc}"
+ fi
+
+ #test 11 counts lock enqueue requests, all others count new locks
+ i=11
+ count=$(do_facet ost1 \
+ $LCTL get_param -n ost.OSS.ost.stats)
+ count=$(echo "$count" | grep ldlm_extent_enqueue | awk '{ print $2 }')
+
+ lockahead_test -d $DIR/$tdir -t $i
+ rc=$?
+ if [ $rc -eq 255 ]; then
+ error "Ladvise test${i} failed, ${rc}"
+ fi
+
+ new_count=$(do_facet ost1 \
+ $LCTL get_param -n ost.OSS.ost.stats)
+ new_count=$(echo "$new_count" | grep ldlm_extent_enqueue | \
+ awk '{ print $2 }')
+
+ difference="$((new_count - count))"
+ if [ $difference -ne $rc ]; then
+ error "Ladvise test${i}, bad enqueue count, returned " \
+ "${rc}, actual ${difference}"
+ fi
+
+ for i in $(seq 12 21); do
+ # If we do not do this, we run the risk of having too many
+ # locks and starting lock cancellation while we are checking
+ # lock counts.
+ cancel_lru_locks osc
+
+ count=$($LCTL get_param -n \
+ ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count)
+
+ lockahead_test -d $DIR/$tdir -t $i
+ rc=$?
+ if [ $rc -eq 255 ]; then
+ error "Ladvise test ${i} failed, ${rc}"
+ fi
+
+ new_count=$($LCTL get_param -n \
+ ldlm.namespaces.$FSNAME-OST0000*osc-f*.lock_unused_count)
+ difference="$((new_count - count))"
+
+ # Test 15 output is divided by 100 to map down to valid return
+ if [ $i -eq 15 ]; then
+ rc="$((rc * 100))"
+ fi
+
+ if [ $difference -ne $rc ]; then
+ error "Ladvise test ${i}, bad lock count, returned " \
+ "${rc}, actual ${difference}"
+ fi
+ done
+
+ #test 22 returns only success/failure
+ i=22
+ lockahead_test -d $DIR/$tdir -t $i
+ rc=$?
+ if [ $rc -eq 255 ]; then
+ error "Ladvise test${i} failed, ${rc}"
+ fi
+
+}
+run_test 255c "suite of ladvise lockahead tests"
+
test_256() {
local cl_user
local cat_sl
[ $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
+ skip "ldiskfs only test" && return
mdt_dev=$(mdsdevname 1)
echo $mdt_dev
#after mount new plainllog is used
touch $DIR/$tdir/{11..19}
+ do_facet mds1 sync
+ local TEMP256FILE=$(mktemp -u TEMP256XXXXXX)
cat_sl=$(do_facet mds1 \
- "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \
- llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l")
+ "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \
+ llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l")
+ do_facet mds1 rm $TEMP256FILE
if (( cat_sl != 2 )); then
do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user
$LFS changelog_clear $MDT0 $cl_user 0
+ do_facet mds1 sync
+ TEMP256FILE=$(mktemp -u TEMP256XXXXXX)
cat_sl=$(do_facet mds1 \
- "$DEBUGFS -R \\\"dump changelog_catalog cat.dmp\\\" $mdt_dev; \
- llog_reader cat.dmp | grep \\\"type=1064553b\\\" | wc -l")
+ "$DEBUGFS -R \\\"dump changelog_catalog $TEMP256FILE\\\" $mdt_dev; \
+ llog_reader $TEMP256FILE | grep \\\"type=1064553b\\\" | wc -l")
+ do_facet mds1 rm $TEMP256FILE
do_facet mds1 $LCTL --device $MDT0 changelog_deregister $cl_user
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] &&
skip "Need MDS version at least 2.8.55" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
setfattr -n trusted.name1 -v value1 $DIR/$tdir ||
error "setfattr -n trusted.name1=value1 $DIR/$tdir failed"
}
run_test 257 "xattr locks are not lost"
+# Verify we take the i_mutex when security requires it
+test_258a() {
+#define OBD_FAIL_IMUTEX_SEC 0x141c
+ $LCTL set_param fail_loc=0x141c
+ touch $DIR/$tfile
+ chmod u+s $DIR/$tfile
+ chmod a+rwx $DIR/$tfile
+ $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
+ RC=$?
+ if [ $RC -ne 0 ]; then
+ error "error, failed to take i_mutex, rc=$?"
+ fi
+ rm -f $DIR/$tfile
+}
+run_test 258a
+
+# Verify we do NOT take the i_mutex in the normal case
+test_258b() {
+#define OBD_FAIL_IMUTEX_NOSEC 0x141d
+ $LCTL set_param fail_loc=0x141d
+ touch $DIR/$tfile
+ chmod a+rwx $DIR
+ chmod a+rw $DIR/$tfile
+ $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 oflag=append
+ RC=$?
+ if [ $RC -ne 0 ]; then
+ error "error, took i_mutex unnecessarily, rc=$?"
+ fi
+ rm -f $DIR/$tfile
+
+}
+run_test 258b "verify i_mutex security behavior"
+
test_260() {
#define OBD_FAIL_MDC_CLOSE 0x806
$LCTL set_param fail_loc=0x80000806
}
run_test 260 "Check mdc_close fail"
+### Data-on-MDT sanity tests ###
+test_270a() {
+
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ # create DoM file
+ local dom=$DIR/$tdir/dom_file
+ local tmp=$DIR/$tdir/tmp_file
+
+ mkdir -p $DIR/$tdir
+
+ # basic checks for DoM component creation
+ $LFS setstripe -E 1024K -E 1024K -L mdt $dom 2>/dev/null &&
+ error "Can set MDT layout to non-first entry"
+
+ $LFS setstripe -E 1024K -L mdt -E 1024K -L mdt $dom 2>/dev/null &&
+ error "Can define multiple entries as MDT layout"
+
+ $LFS setstripe -E 1M -L mdt $dom ||
+ error "Can't create DoM layout"
+
+ [ $($LFS getstripe -L $dom) == "mdt" ] || error "bad pattern"
+ [ $($LFS getstripe -c $dom) == 0 ] || error "bad stripe count"
+ [ $($LFS getstripe -S $dom) == 1048576 ] || error "bad stripe size"
+
+ local mdtidx=$($GETSTRIPE -M $dom)
+ local mdtname=MDT$(printf %04x $mdtidx)
+ local facet=mds$((mdtidx + 1))
+ local space_check=1
+
+ # Skip free space checks with ZFS
+ if [ "$(facet_fstype $facet)" == "zfs" ]; then
+ space_check=0
+ fi
+
+ # write
+ sync
+ local mdtfree1=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ dd if=/dev/urandom of=$tmp bs=1024 count=100
+ # check also direct IO along write
+ dd if=$tmp of=$dom bs=102400 count=1 oflag=direct
+ sync
+ cmp $tmp $dom || error "file data is different"
+ [ $(stat -c%s $dom) == 102400 ] || error "bad size after write"
+ if [ $space_check == 1 ]; then
+ local mdtfree2=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
+ error "MDT free space is wrong after write"
+ fi
+
+ # truncate
+ $TRUNCATE $dom 10000
+ [ $(stat -c%s $dom) == 10000 ] || error "bad size after truncate"
+ if [ $space_check == 1 ]; then
+ mdtfree1=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ [ $(($mdtfree1 - $mdtfree2)) -ge 92 ] ||
+ error "MDT free space is wrong after truncate"
+ fi
+
+ # append
+ cat $tmp >> $dom
+ sync
+ [ $(stat -c%s $dom) == 112400 ] || error "bad size after append"
+ if [ $space_check == 1 ]; then
+ mdtfree2=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ [ $(($mdtfree1 - $mdtfree2)) -ge 102 ] ||
+ error "MDT free space is wrong after append"
+ fi
+
+ # delete
+ rm $dom
+ if [ $space_check == 1 ]; then
+ mdtfree1=$(do_facet $facet \
+ lctl get_param -n osd*.*$mdtname.kbytesfree)
+ [ $(($mdtfree1 - $mdtfree2)) -ge 112 ] ||
+ error "MDT free space is wrong after removal"
+ fi
+
+ # combined striping
+ $LFS setstripe -E 1024K -L mdt -E EOF $dom ||
+ error "Can't create DoM + OST striping"
+
+ dd if=/dev/urandom of=$tmp bs=1024 count=2000
+ # check also direct IO along write
+ dd if=$tmp of=$dom bs=102400 count=20 oflag=direct
+ sync
+ cmp $tmp $dom || error "file data is different"
+ [ $(stat -c%s $dom) == 2048000 ] || error "bad size after write"
+ rm $dom
+ rm $tmp
+
+ return 0
+}
+run_test 270a "DoM: basic functionality tests"
+
+test_270b() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ local dom=$DIR/$tdir/dom_file
+ local max_size=1048576
+
+ mkdir -p $DIR/$tdir
+ $LFS setstripe -E $max_size -L mdt $dom
+
+ # truncate over the limit
+ $TRUNCATE $dom $(($max_size + 1)) &&
+ error "successful truncate over the maximum size"
+ # write over the limit
+ dd if=/dev/zero of=$dom bs=$max_size seek=1 count=1 &&
+ error "successful write over the maximum size"
+ # append over the limit
+ dd if=/dev/zero of=$dom bs=$(($max_size - 3)) count=1
+ echo "12345" >> $dom && error "successful append over the maximum size"
+ rm $dom
+
+ return 0
+}
+run_test 270b "DoM: maximum size overflow checks for DoM-only file"
+
+test_270c() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ mkdir -p $DIR/$tdir
+ $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+ # check files inherit DoM EA
+ touch $DIR/$tdir/first
+ [ $($GETSTRIPE -L $DIR/$tdir/first) == "mdt" ] ||
+ error "bad pattern"
+ [ $($LFS getstripe -c $DIR/$tdir/first) == 0 ] ||
+ error "bad stripe count"
+ [ $($LFS getstripe -S $DIR/$tdir/first) == 1048576 ] ||
+ error "bad stripe size"
+
+ # check directory inherits DoM EA and uses it as default
+ mkdir $DIR/$tdir/subdir
+ touch $DIR/$tdir/subdir/second
+ [ $($LFS getstripe -L $DIR/$tdir/subdir/second) == "mdt" ] ||
+ error "bad pattern in sub-directory"
+ [ $($LFS getstripe -c $DIR/$tdir/subdir/second) == 0 ] ||
+ error "bad stripe count in sub-directory"
+ [ $($LFS getstripe -S $DIR/$tdir/subdir/second) == 1048576 ] ||
+ error "bad stripe size in sub-directory"
+ return 0
+}
+run_test 270c "DoM: DoM EA inheritance tests"
+
+test_270d() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ mkdir -p $DIR/$tdir
+ $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+ # inherit default DoM striping
+ mkdir $DIR/$tdir/subdir
+ touch $DIR/$tdir/subdir/f1
+
+ # change default directory striping
+ $LFS setstripe -c 1 $DIR/$tdir/subdir
+ touch $DIR/$tdir/subdir/f2
+ [ $($LFS getstripe -c $DIR/$tdir/subdir/f2) == 1 ] ||
+ error "wrong default striping in file 2"
+ [ $($LFS getstripe -L $DIR/$tdir/subdir/f2) == "raid0" ] ||
+ error "bad pattern in file 2"
+ return 0
+}
+run_test 270d "DoM: change striping from DoM to RAID0"
+
+test_270e() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ mkdir -p $DIR/$tdir/dom
+ mkdir -p $DIR/$tdir/norm
+ DOMFILES=20
+ NORMFILES=10
+ $LFS setstripe -E 1M -L mdt $DIR/$tdir/dom
+ $LFS setstripe -i 0 -S 2M $DIR/$tdir/norm
+
+ createmany -o $DIR/$tdir/dom/dom- $DOMFILES
+ createmany -o $DIR/$tdir/norm/norm- $NORMFILES
+
+ # find DoM files by layout
+ NUM=$($LFIND -L mdt -type f $DIR/$tdir 2>/dev/null | wc -l)
+ [ $NUM -eq $DOMFILES ] ||
+ error "lfs find -L: found $NUM, expected $DOMFILES"
+ echo "Test 1: lfs find 20 DOM files by layout: OK"
+
+ # there should be 1 dir with default DOM striping
+ NUM=$($LFIND -L mdt -type d $DIR/$tdir 2>/dev/null | wc -l)
+ [ $NUM -eq 1 ] ||
+ error "lfs find -L: found $NUM, expected 1 dir"
+ echo "Test 2: lfs find 1 DOM dir by layout: OK"
+
+ # find DoM files by stripe size
+ NUM=$($LFIND -S -1200K -type f $DIR/$tdir 2>/dev/null | wc -l)
+ [ $NUM -eq $DOMFILES ] ||
+ error "lfs find -S: found $NUM, expected $DOMFILES"
+ echo "Test 4: lfs find 20 DOM files by stripe size: OK"
+
+ # find files by stripe offset except DoM files
+ NUM=$($LFIND -i 0 -type f $DIR/$tdir 2>/dev/null | wc -l)
+ [ $NUM -eq $NORMFILES ] ||
+ error "lfs find -i: found $NUM, expected $NORMFILES"
+ echo "Test 5: lfs find no DOM files by stripe index: OK"
+ return 0
+}
+run_test 270e "DoM: lfs find with DoM files test"
+
+test_270f() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ local mdtname=${FSNAME}-MDT0000-mdtlov
+ local dom=$DIR/$tdir/dom_file
+ local dom_limit_saved=$(do_facet mds1 $LCTL get_param -n \
+ lod.$mdtname.dom_stripesize)
+ local dom_limit=131072
+
+ do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=$dom_limit
+ local dom_current=$(do_facet mds1 $LCTL get_param -n \
+ lod.$mdtname.dom_stripesize)
+ [ ${dom_limit} -eq ${dom_current} ] ||
+ error "Cannot change per-MDT DoM stripe limit to $dom_limit"
+
+ $LFS mkdir -i 0 -c 1 $DIR/$tdir
+ $LFS setstripe -d $DIR/$tdir
+ $LFS setstripe -E $dom_limit -L mdt $DIR/$tdir ||
+ error "Can't set directory default striping"
+
+ # exceed maximum stripe size
+ $LFS setstripe -E $(($dom_limit * 2)) -L mdt $dom &&
+ error "Able to create DoM component size more than LOD limit"
+
+ do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0
+ dom_current=$(do_facet mds1 $LCTL get_param -n \
+ lod.$mdtname.dom_stripesize)
+ [ 0 -eq ${dom_current} ] ||
+ error "Can't set zero DoM stripe limit"
+
+ # too low values to be aligned with smallest stripe size 64K
+ do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000
+ dom_current=$(do_facet mds1 $LCTL get_param -n \
+ lod.$mdtname.dom_stripesize)
+ [ 30000 -eq ${dom_current} ] &&
+ error "Can set too small DoM stripe limit"
+
+ do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648
+ dom_current=$(do_facet mds1 $LCTL get_param -n \
+ lod.$mdtname.dom_stripesize)
+ echo $dom_current
+ [ 2147483648 -eq ${dom_current} ] &&
+ error "Can set too large DoM stripe limit"
+
+ do_facet mds1 $LCTL set_param -n \
+ lod.$mdtname.dom_stripesize=$((dom_limit * 2))
+ $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom ||
+ error "Can't create DoM component size after limit change"
+ do_facet mds1 $LCTL set_param -n \
+ lod.$mdtname.dom_stripesize=$((dom_limit / 2))
+ $LFS setstripe -E $dom_limit -L mdt ${dom}_big &&
+ error "Can create big DoM component after limit decrease"
+ touch ${dom}_def ||
+ error "Can't create file with old default layout"
+
+ do_facet mds1 $LCTL set_param -n lod.*.dom_stripesize=$dom_limit_saved
+ return 0
+}
+run_test 270f "DoM: maximum DoM stripe size checks"
+
+test_271a() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ local dom=$DIR/$tdir/dom
+
+ mkdir -p $DIR/$tdir
+
+ $LFS setstripe -E 1024K -L mdt $dom
+
+ lctl set_param -n mdc.*.stats=clear
+ dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
+ cat $dom > /dev/null
+ local reads=$(lctl get_param -n mdc.*.stats |
+ awk '/ost_read/ {print $2}')
+ [ -z $reads ] || error "Unexpected $reads READ RPCs"
+ ls $dom
+ rm -f $dom
+}
+run_test 271a "DoM: data is cached for read after write"
+
+test_271b() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ local dom=$DIR/$tdir/dom
+
+ mkdir -p $DIR/$tdir
+
+ $LFS setstripe -E 1024K -L mdt -E EOF $dom
+
+ lctl set_param -n mdc.*.stats=clear
+ dd if=/dev/zero of=$dom bs=4096 count=1 || return 1
+ cancel_lru_locks mdc
+ $CHECKSTAT -t file -s 4096 $dom || error "stat #1 fails"
+ # second stat to check size is cached on client
+ $CHECKSTAT -t file -s 4096 $dom || error "stat #2 fails"
+ local gls=$(lctl get_param -n mdc.*.stats |
+ awk '/ldlm_glimpse/ {print $2}')
+ [ -z $gls ] || error "Unexpected $gls glimpse RPCs"
+ rm -f $dom
+}
+run_test 271b "DoM: no glimpse RPC for stat (DoM only file)"
+
+test_271ba() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ local dom=$DIR/$tdir/dom
+
+ mkdir -p $DIR/$tdir
+
+ $LFS setstripe -E 1024K -L mdt -E EOF $dom
+
+ lctl set_param -n mdc.*.stats=clear
+ lctl set_param -n osc.*.stats=clear
+ dd if=/dev/zero of=$dom bs=2048K count=1 || return 1
+ cancel_lru_locks mdc
+ $CHECKSTAT -t file -s 2097152 $dom || error "stat"
+ # second stat to check size is cached on client
+ $CHECKSTAT -t file -s 2097152 $dom || error "stat"
+ local gls=$(lctl get_param -n mdc.*.stats |
+ awk '/ldlm_glimpse/ {print $2}')
+ [ -z $gls ] || error "Unexpected $gls glimpse RPCs"
+ local gls=$(lctl get_param -n osc.*.stats |
+ awk '/ldlm_glimpse/ {print $2}')
+ [ -z $gls ] || error "Unexpected $gls OSC glimpse RPCs"
+ rm -f $dom
+}
+run_test 271ba "DoM: no glimpse RPC for stat (combined file)"
+
+test_271c() {
+ # test to be enabled with lock_convert
+ skip "skipped until lock convert will be implemented" && return
+
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.55) ] &&
+ skip "Need MDS version at least 2.10.55" && return
+
+ local dom=$DIR/$tdir/dom
+
+ mkdir -p $DIR/$tdir
+
+ $LFS setstripe -E 1024K -L mdt $DIR/$tdir
+
+ local mdtidx=$($LFS getstripe -M $DIR/$tdir)
+ local facet=mds$((mdtidx + 1))
+
+ cancel_lru_locks mdc
+ do_facet $facet lctl set_param -n mdt.*.dom_lock=0
+ createmany -o $dom 1000
+ lctl set_param -n mdc.*.stats=clear
+ smalliomany -w $dom 1000 200
+ lctl get_param -n mdc.*.stats
+ local enq=$(lctl get_param -n mdc.*.stats |
+ awk '/ldlm_ibits_enqueue/ {print $2}')
+ # Each file has 1 open, 1 IO enqueues, total 2000
+ # but now we have also +1 getxattr for security.capability, total 3000
+ [ $enq -ge 2000 ] || error "Too few enqueues $enq, expected > 2000"
+ unlinkmany $dom 1000
+
+ cancel_lru_locks mdc
+ do_facet $facet lctl set_param -n mdt.*.dom_lock=1
+ createmany -o $dom 1000
+ lctl set_param -n mdc.*.stats=clear
+ smalliomany -w $dom 1000 200
+ lctl get_param -n mdc.*.stats
+ local enq_2=$(lctl get_param -n mdc.*.stats |
+ awk '/ldlm_ibits_enqueue/ {print $2}')
+ # Expect to see reduced amount of RPCs by 1000 due to single enqueue
+ # for OPEN and IO lock.
+ [ $((enq - enq_2)) -ge 1000 ] ||
+ error "Too many enqueues $enq_2, expected about $((enq - 1000))"
+ unlinkmany $dom 1000
+ return 0
+}
+run_test 271c "DoM: IO lock at open saves enqueue RPCs"
+
cleanup_test_300() {
trap 0
umask $SAVE_UMASK
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"
+ error "1:stripe_count is $stripe_count, expect 2"
+ fi
+ stripe_count=$($LFS getdirstripe -T $DIR/$tdir/striped_dir)
+ if [ "$stripe_count" != "2" ]; then
+ error "2:stripe_count is $stripe_count, expect 2"
fi
stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir)
local mtime2
local mtime3
- test_mkdir $DIR/$tdir || error "mkdir fail"
+ test_mkdir $DIR/$tdir
$LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir ||
error "set striped dir error"
for ((i=0; i<10; i++)); do
mkdir $DIR/$tdir/striped_dir/dir_c
$LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_a ||
- error "set striped dir under striped dir error"
+ error "set striped adir under striped dir error"
- $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_b ||
- error "set striped dir under striped dir error"
+ $LFS setdirstripe -i 0 -c 2 -H all_char $DIR/$tdir/striped_dir/stp_b ||
+ error "set striped bdir under striped dir error"
$LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c ||
- error "set striped dir under striped dir error"
+ error "set striped cdir under striped dir error"
mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b ||
error "rename dir under striped dir fails"
$LFS setdirstripe -D -i1 $DIR/$tdir/striped_dir ||
error "create striped_dir failed"
+ $LFS setdirstripe -i0 $DIR/$tdir/striped_dir/dir0 ||
+ error "create dir0 fails"
+ stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir0)
+ [ $stripe_index -eq 0 ] ||
+ error "dir0 expect index 0 got $stripe_index"
+
mkdir $DIR/$tdir/striped_dir/dir1 ||
error "create dir1 fails"
stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir1)
[ $stripe_index -eq 1 ] ||
- error "dir1 expect 1 got $stripe_index"
-
- $LFS setdirstripe -i2 $DIR/$tdir/striped_dir/dir2 ||
- error "create dir2 fails"
- stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir/dir2)
- [ $stripe_index -eq 2 ] ||
- error "dir2 expect 2 got $stripe_index"
+ error "dir1 expect index 1 got $stripe_index"
#check default stripe count/stripe index
test_300_check_default_striped_dir normal_dir $MDSCOUNT 1
createmany -o $DIR/$tdir/striped_dir/f- 10 ||
error "create files under striped dir failed"
+ $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir ||
+ error "set striped hashdir error"
+
+ $LFS setdirstripe -i0 -c$MDSCOUNT -H all_char $DIR/$tdir/hashdir/d0 ||
+ error "create dir0 under hash dir failed"
+ $LFS setdirstripe -i0 -c$MDSCOUNT -H fnv_1a_64 $DIR/$tdir/hashdir/d1 ||
+ error "create dir1 under hash dir failed"
+
# unfortunately, we need to umount to clear dir layout cache for now
# once we fully implement dir layout, we can drop this
umount_client $MOUNT || error "umount failed"
mount_client $MOUNT || error "mount failed"
+ $LFS find -H fnv_1a_64 $DIR/$tdir/hashdir
+ local dircnt=$($LFS find -H fnv_1a_64 $DIR/$tdir/hashdir | wc -l)
+ [ $dircnt -eq 1 ] || error "lfs find striped dir got:$dircnt,except:1"
+
#set the stripe to be unknown hash type
#define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
$LCTL set_param fail_loc=0x1901
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
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
local stripe_index
local list=$(comma_list $(mdts_nodes))
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.54) ] &&
skip "lustre < 2.8.54 does not contain LU-4825 fix" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
local old_iused=$($LFS df -i | grep OST0000 | awk '{ print $3 }')
local objid=$2
local vdevdir=$(dirname $(facet_vdevice $ost))
- local cmd="$ZDB -e -p $vdevdir -dddd $(facet_device $ost)"
+ local cmd="$ZDB -e -p $vdevdir -ddddd $(facet_device $ost)"
local zfs_zapid=$(do_facet $ost $cmd |
grep -w "/O/0/d$((objid%32))" -C 5 |
awk '/Object/{getline; print $1}')
}
test_312() { # LU-4856
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
[ $(facet_fstype ost1) = "zfs" ] ||
{ skip "the test only applies to zfs" && return; }
local max_blksz=$(do_facet ost1 \
$ZFS get -p recordsize $(facet_device ost1) |
awk '!/VALUE/{print $3}')
+ local min_blksz=$(getconf PAGE_SIZE)
# to make life a little bit easier
$LFS mkdir -c 1 -i 0 $DIR/$tdir
# block size change by sequential over write
local blksz
- for ((bs=4096; bs <= max_blksz; bs <<= 2)); do
+ for ((bs=$min_blksz; bs <= max_blksz; bs <<= 2)); do
dd if=/dev/zero of=$tf bs=$bs count=1 oflag=sync conv=notrunc
blksz=$(zfs_object_blksz ost1 $zfs_objid)
rm -f $tf
# block size change by sequential append write
- dd if=/dev/zero of=$tf bs=4K count=1 oflag=sync conv=notrunc
+ dd if=/dev/zero of=$tf bs=$min_blksz count=1 oflag=sync conv=notrunc
oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
zfs_objid=$(zfs_oid_to_objid ost1 $oid)
- for ((count = 1; count < $((max_blksz / 4096)); count *= 2)); do
- dd if=/dev/zero of=$tf bs=4K count=$count seek=$count \
+ for ((count = 1; count < $((max_blksz / min_blksz)); count *= 2)); do
+ dd if=/dev/zero of=$tf bs=$min_blksz count=$count seek=$count \
oflag=sync conv=notrunc
blksz=$(zfs_object_blksz ost1 $zfs_objid)
- blksz=$((blksz / 8192)) # in 2*4K unit
- [ $blksz -eq $count ] ||
- error "blksz error(in 8k): $blksz, expected: $count"
+ [ $blksz -eq $((2 * count * min_blksz)) ] ||
+ error "blksz error, actual $blksz, " \
+ "expected: 2 * $count * $min_blksz"
done
rm -f $tf
oid=$($LFS getstripe $tf | awk '/obdidx/{getline; print $2}')
zfs_objid=$(zfs_oid_to_objid ost1 $oid)
- dd if=/dev/zero of=$tf bs=8K count=1 oflag=sync conv=notrunc
+ dd if=/dev/zero of=$tf bs=1K count=1 oflag=sync conv=notrunc
blksz=$(zfs_object_blksz ost1 $zfs_objid)
- [ $blksz -eq 8192 ] || error "blksz error: $blksz, expected: 8k"
+ [ $blksz -eq $min_blksz ] ||
+ error "blksz error: $blksz, expected: $min_blksz"
dd if=/dev/zero of=$tf bs=64K count=1 oflag=sync conv=notrunc seek=128
blksz=$(zfs_object_blksz ost1 $zfs_objid)
run_test 312 "make sure ZFS adjusts its block size by write pattern"
test_313() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
local file=$DIR/$tfile
rm -f $file
$SETSTRIPE -c 1 -i 0 $file || error "setstripe failed"
}
run_test 313 "io should fail after last_rcvd update fail"
+test_314() {
+ $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
+ do_facet ost1 "$LCTL set_param fail_loc=0x720"
+ rm -f $DIR/$tfile
+ wait_delete_completed
+ do_facet ost1 "$LCTL set_param fail_loc=0"
+}
+run_test 314 "OSP shouldn't fail after last_rcvd update failure"
+
test_fake_rw() {
local read_write=$1
if [ "$read_write" = "write" ]; then
rm -f $DIR/$tfile
}
test_399a() { # LU-7655 for OST fake write
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
test_fake_rw write
}
run_test 399a "fake write should not be slower than normal write"
-
test_399b() { # LU-8726 for OST fake read
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+
if [ "$(facet_fstype ost1)" != "ldiskfs" ]; then
- skip "only for ldiskfs" && return 0
+ skip "ldiskfs only test" && return 0
fi
test_fake_rw read
}
if ! [[ -d $prefix ]]; then
# Assume we're running in tree and fixup the include path.
- extra_flags+=" -I$LUSTRE/../libcfs/include"
extra_flags+=" -I$LUSTRE/include"
extra_flags+=" -L$LUSTRE/utils"
fi
test_400b() { # LU-1606, LU-5011
local header
local out=$TMP/$tfile
- local prefix=/usr/include/lustre
+ local prefix=/usr/include/linux/lustre
# We use a hard coded prefix so that this test will not fail
# when run in tree. There are headers in lustre/include/lustre/
continue
fi
- if [[ "$(basename $header)" == liblustreapi.h ]]; then
- continue # liblustreapi.h is deprecated.
+ if [[ "$(basename $header)" == lustre_ioctl.h ]]; then
+ continue # lustre_ioctl.h is internal header
fi
$CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
#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 proc_dirs=$(eval \ls -d $proc_regexp 2>/dev/null)
+ echo "proc_dirs='$proc_dirs'"
+ [ -n "$proc_dirs" ] || error "no proc_dirs on $HOSTNAME"
local procs=$(find -L $proc_dirs -mindepth 1 -printf '%P\n' 2>/dev/null|
sort -u | wc -l)
wait
- [ `cat $tfile` -gt 0 ] || error "wrong nlink count: `cat $tfile`"
+ [ $(cat $tfile) -gt 0 ] || error "wrong nlink count: $(cat $tfile)"
rm -f $tfile $file1 $file2
}
run_test 403 "i_nlink should not drop to zero due to aliasing"
test_404() { # LU-6601
+ local server_version=$(lustre_version_code $SINGLEMDS)
+ [[ $server_version -ge $(version_code 2.8.53) ]] ||
+ { skip "Need server version newer than 2.8.52"; return 0; }
+
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local mosps=$(do_facet $SINGLEMDS $LCTL dl |
awk '/osp .*-osc-MDT/ { print $4}')
run_test 404 "validate manual {de}activated works properly for OSPs"
test_405() {
- [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) ] &&
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) -o \
+ [ $(lustre_version_code client) -lt $(version_code 2.6.99) ] &&
skip "Layout swap lock is not supported" && return
check_swap_layouts_support && return 0
- test_mkdir -p $DIR/$tdir
+ test_mkdir $DIR/$tdir
swap_lock_test -d $DIR/$tdir ||
error "One layout swap locked test failed"
}
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.50) ] &&
skip "Need MDS version at least 2.8.50" && return
- local def_stripenr=$($GETSTRIPE -c $MOUNT)
+ local def_stripe_count=$($GETSTRIPE -c $MOUNT)
local def_stripe_size=$($GETSTRIPE -S $MOUNT)
local def_stripe_offset=$($GETSTRIPE -i $MOUNT)
local def_pool=$($GETSTRIPE -p $MOUNT)
-
local test_pool=$TESTNAME
+
+ if ! combined_mgs_mds ; then
+ mount_mgs_client
+ fi
pool_add $test_pool || error "pool_add failed"
pool_add_targets $test_pool 0 $(($OSTCOUNT - 1)) 1 ||
error "pool_add_targets failed"
# restore FS default striping
if [ -z $def_pool ]; then
- $SETSTRIPE -c $def_stripenr -S $def_stripe_size \
+ $SETSTRIPE -c $def_stripe_count -S $def_stripe_size \
-i $def_stripe_offset $MOUNT ||
error "restore default striping failed"
else
- $SETSTRIPE -c $def_stripenr -S $def_stripe_size -p $def_pool \
- -i $def_stripe_offset $MOUNT ||
+ $SETSTRIPE -c $def_stripe_count -S $def_stripe_size \
+ -i $def_stripe_offset -p $def_pool $MOUNT ||
error "restore default striping with $def_pool failed"
fi
local f=$DIR/$tdir/$tfile
pool_remove_all_targets $test_pool $f
pool_remove $test_pool $f
+
+ if ! combined_mgs_mds ; then
+ umount_mgs_client
+ fi
}
run_test 406 "DNE support fs default striping"
test_407() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
-
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.55) ]] &&
skip "Need MDS version at least 2.8.55" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
$LFS mkdir -i 0 -c 1 $DIR/$tdir.0 ||
error "$LFS mkdir -i 0 -c 1 $tdir.0 failed"
}
run_test 409 "Large amount of cross-MDTs hard links on the same file"
+test_410()
+{
+ [[ $(lustre_version_code client) -lt $(version_code 2.9.59) ]] &&
+ skip "Need client version at least 2.9.59" && return
+
+ # Create a file, and stat it from the kernel
+ local testfile=$DIR/$tfile
+ touch $testfile
+
+ local run_id=$RANDOM
+ local my_ino=$(stat --format "%i" $testfile)
+
+ # Try to insert the module. This will always fail as the
+ # module is designed to not be inserted.
+ insmod $LUSTRE/tests/kernel/kinode.ko run_id=$run_id fname=$testfile \
+ &> /dev/null
+
+ # Anything but success is a test failure
+ dmesg | grep -q \
+ "lustre_kinode_$run_id: inode numbers are identical: $my_ino" ||
+ error "no inode match"
+}
+run_test 410 "Test inode number returned from kernel thread"
+
+cleanup_test411_cgroup() {
+ trap 0
+ rmdir "$1"
+}
+
+test_411() {
+ local cg_basedir=/sys/fs/cgroup/memory
+ # LU-9966
+ test -f "$cg_basedir/memory.kmem.limit_in_bytes" ||
+ { skip "no setup for cgroup"; return; }
+
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=100 conv=fsync ||
+ error "test file creation failed"
+ cancel_lru_locks osc
+
+ # Create a very small memory cgroup to force a slab allocation error
+ local cgdir=$cg_basedir/osc_slab_alloc
+ mkdir $cgdir || error "cgroup mkdir '$cgdir' failed"
+ trap "cleanup_test411_cgroup $cgdir" EXIT
+ echo 2M > $cgdir/memory.kmem.limit_in_bytes
+ echo 1M > $cgdir/memory.limit_in_bytes
+
+ # Should not LBUG, just be killed by oom-killer
+ sh -c "echo \$$ > $cgdir/tasks && dd if=$DIR/$tfile of=/dev/null" &&
+ error "fail to trigger a memory allocation error"
+
+ cleanup_test411_cgroup $cgdir
+
+ return 0
+}
+run_test 411 "Slab allocation error with cgroup does not LBUG"
+
+prep_801() {
+ [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+ [[ $(lustre_version_code ost1) -lt $(version_code 2.9.55) ]] &&
+ skip "Need server version at least 2.9.55" & exit 0
+ start_full_debug_logging
+}
+
+post_801() {
+ stop_full_debug_logging
+}
+
+barrier_stat() {
+ if [ $(lustre_version_code mgs) -le $(version_code 2.10.0) ]; then
+ local st=$(do_facet mgs $LCTL barrier_stat $FSNAME |
+ awk '/The barrier for/ { print $7 }')
+ echo $st
+ else
+ local st=$(do_facet mgs $LCTL barrier_stat -s $FSNAME)
+ echo \'$st\'
+ fi
+}
+
+barrier_expired() {
+ local expired
+
+ if [ $(lustre_version_code mgs) -le $(version_code 2.10.0) ]; then
+ expired=$(do_facet mgs $LCTL barrier_stat $FSNAME |
+ awk '/will be expired/ { print $7 }')
+ else
+ expired=$(do_facet mgs $LCTL barrier_stat -t $FSNAME)
+ fi
+
+ echo $expired
+}
+
+test_801a() {
+ prep_801
+
+ echo "Start barrier_freeze at: $(date)"
+ #define OBD_FAIL_BARRIER_DELAY 0x2202
+ do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
+ do_facet mgs $LCTL barrier_freeze $FSNAME 10 &
+
+ sleep 2
+ local b_status=$(barrier_stat)
+ echo "Got barrier status at: $(date)"
+ [ "$b_status" = "'freezing_p1'" ] ||
+ error "(1) unexpected barrier status $b_status"
+
+ do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
+ wait
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'frozen'" ] ||
+ error "(2) unexpected barrier status $b_status"
+
+ local expired=$(barrier_expired)
+ echo "sleep $((expired + 3)) seconds, then the barrier will be expired"
+ sleep $((expired + 3))
+
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'expired'" ] ||
+ error "(3) unexpected barrier status $b_status"
+
+ do_facet mgs $LCTL barrier_freeze $FSNAME 10 ||
+ error "(4) fail to freeze barrier"
+
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'frozen'" ] ||
+ error "(5) unexpected barrier status $b_status"
+
+ echo "Start barrier_thaw at: $(date)"
+ #define OBD_FAIL_BARRIER_DELAY 0x2202
+ do_facet mgs $LCTL set_param fail_val=5 fail_loc=0x2202
+ do_facet mgs $LCTL barrier_thaw $FSNAME &
+
+ sleep 2
+ b_status=$(barrier_stat)
+ echo "Got barrier status at: $(date)"
+ [ "$b_status" = "'thawing'" ] ||
+ error "(6) unexpected barrier status $b_status"
+
+ do_facet mgs $LCTL set_param fail_val=0 fail_loc=0
+ wait
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'thawed'" ] ||
+ error "(7) unexpected barrier status $b_status"
+
+ #define OBD_FAIL_BARRIER_FAILURE 0x2203
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0x2203
+ do_facet mgs $LCTL barrier_freeze $FSNAME
+
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'failed'" ] ||
+ error "(8) unexpected barrier status $b_status"
+
+ do_facet $SINGLEMDS $LCTL set_param fail_loc=0
+ do_facet mgs $LCTL barrier_thaw $FSNAME
+
+ post_801
+}
+run_test 801a "write barrier user interfaces and stat machine"
+
+test_801b() {
+ prep_801
+
+ mkdir $DIR/$tdir || error "(1) fail to mkdir"
+ createmany -d $DIR/$tdir/d 6 || "(2) fail to mkdir"
+ touch $DIR/$tdir/d2/f10 || error "(3) fail to touch"
+ touch $DIR/$tdir/d3/f11 || error "(4) fail to touch"
+ touch $DIR/$tdir/d4/f12 || error "(5) fail to touch"
+
+ cancel_lru_locks mdc
+
+ # 180 seconds should be long enough
+ do_facet mgs $LCTL barrier_freeze $FSNAME 180
+
+ local b_status=$(barrier_stat)
+ [ "$b_status" = "'frozen'" ] ||
+ error "(6) unexpected barrier status $b_status"
+
+ mkdir $DIR/$tdir/d0/d10 &
+ mkdir_pid=$!
+
+ touch $DIR/$tdir/d1/f13 &
+ touch_pid=$!
+
+ ln $DIR/$tdir/d2/f10 $DIR/$tdir/d2/f14 &
+ ln_pid=$!
+
+ mv $DIR/$tdir/d3/f11 $DIR/$tdir/d3/f15 &
+ mv_pid=$!
+
+ rm -f $DIR/$tdir/d4/f12 &
+ rm_pid=$!
+
+ stat $DIR/$tdir/d5 || error "(7) stat should succeed"
+
+ # To guarantee taht the 'stat' is not blocked
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'frozen'" ] ||
+ error "(8) unexpected barrier status $b_status"
+
+ # let above commands to run at background
+ sleep 5
+
+ ps -p $mkdir_pid || error "(9) mkdir should be blocked"
+ ps -p $touch_pid || error "(10) touch should be blocked"
+ ps -p $ln_pid || error "(11) link should be blocked"
+ ps -p $mv_pid || error "(12) rename should be blocked"
+ ps -p $rm_pid || error "(13) unlink should be blocked"
+
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'frozen'" ] ||
+ error "(14) unexpected barrier status $b_status"
+
+ do_facet mgs $LCTL barrier_thaw $FSNAME
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'thawed'" ] ||
+ error "(15) unexpected barrier status $b_status"
+
+ wait $mkdir_pid || error "(16) mkdir should succeed"
+ wait $touch_pid || error "(17) touch should succeed"
+ wait $ln_pid || error "(18) link should succeed"
+ wait $mv_pid || error "(19) rename should succeed"
+ wait $rm_pid || error "(20) unlink should succeed"
+
+ post_801
+}
+run_test 801b "modification will be blocked by write barrier"
+
+test_801c() {
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
+
+ prep_801
+
+ stop mds2 || error "(1) Fail to stop mds2"
+
+ do_facet mgs $LCTL barrier_freeze $FSNAME 30
+
+ local b_status=$(barrier_stat)
+ [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || {
+ do_facet mgs $LCTL barrier_thaw $FSNAME
+ error "(2) unexpected barrier status $b_status"
+ }
+
+ do_facet mgs $LCTL barrier_rescan $FSNAME ||
+ error "(3) Fail to rescan barrier bitmap"
+
+ do_facet mgs $LCTL barrier_freeze $FSNAME 10
+
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'frozen'" ] ||
+ error "(4) unexpected barrier status $b_status"
+
+ do_facet mgs $LCTL barrier_thaw $FSNAME
+ b_status=$(barrier_stat)
+ [ "$b_status" = "'thawed'" ] ||
+ error "(5) unexpected barrier status $b_status"
+
+ local devname=$(mdsdevname 2)
+
+ start mds2 $devname $MDS_MOUNT_OPTS || error "(6) Fail to start mds2"
+
+ do_facet mgs $LCTL barrier_rescan $FSNAME ||
+ error "(7) Fail to rescan barrier bitmap"
+
+ post_801
+}
+run_test 801c "rescan barrier bitmap"
+
+saved_MGS_MOUNT_OPTS=$MGS_MOUNT_OPTS
+saved_MDS_MOUNT_OPTS=$MDS_MOUNT_OPTS
+saved_OST_MOUNT_OPTS=$OST_MOUNT_OPTS
+
+cleanup_802() {
+ trap 0
+
+ stopall
+ MGS_MOUNT_OPTS=$saved_MGS_MOUNT_OPTS
+ MDS_MOUNT_OPTS=$saved_MDS_MOUNT_OPTS
+ OST_MOUNT_OPTS=$saved_OST_MOUNT_OPTS
+ setupall
+}
+
+test_802() {
+
+ [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] ||
+ [[ $(lustre_version_code ost1) -lt $(version_code 2.9.55) ]] &&
+ skip "Need server version at least 2.9.55" & exit 0
+
+ mkdir $DIR/$tdir || error "(1) fail to mkdir"
+
+ cp $LUSTRE/tests/test-framework.sh $DIR/$tdir/ ||
+ error "(2) Fail to copy"
+
+ trap cleanup_802 EXIT
+
+ # sync by force before remount as readonly
+ sync; sync_all_data; sleep 3; sync_all_data
+
+ stopall
+
+ MGS_MOUNT_OPTS=$(csa_add "$MGS_MOUNT_OPTS" -o rdonly_dev)
+ MDS_MOUNT_OPTS=$(csa_add "$MDS_MOUNT_OPTS" -o rdonly_dev)
+ OST_MOUNT_OPTS=$(csa_add "$OST_MOUNT_OPTS" -o rdonly_dev)
+
+ echo "Mount the server as read only"
+ setupall server_only || error "(3) Fail to start servers"
+
+ echo "Mount client without ro should fail"
+ mount_client $MOUNT &&
+ error "(4) Mount client without 'ro' should fail"
+
+ echo "Mount client with ro should succeed"
+ mount_client $MOUNT ro ||
+ error "(5) Mount client with 'ro' should succeed"
+
+ echo "Modify should be refused"
+ touch $DIR/$tdir/guard && error "(6) Touch should fail under ro mode"
+
+ echo "Read should be allowed"
+ diff $LUSTRE/tests/test-framework.sh $DIR/$tdir/test-framework.sh ||
+ error "(7) Read should succeed under ro mode"
+
+ cleanup_802
+}
+run_test 802 "simulate readonly device"
+
#
# tests that do cleanup/setup should be run at the end
#