# bug number for skipped tests: LU-2036
ALWAYS_EXCEPT=" 76 $ALWAYS_EXCEPT"
-is_sles11() # LU-4351
-{
- if [ -r /etc/SuSE-release ]
- then
- local vers=`grep VERSION /etc/SuSE-release | awk '{print $3}'`
- if [ $vers -eq 11 ]
- then
- return 0
- fi
- fi
- return 1
-}
-
-if is_sles11; then # LU-4351
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c"
-fi
-
SRCDIR=$(cd $(dirname $0); echo $PWD)
export PATH=$PATH:/sbin
LFIND=${LFIND:-"$LFS find"}
LVERIFY=${LVERIFY:-ll_dirstripe_verify}
LCTL=${LCTL:-lctl}
-MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
export MULTIOP=${MULTIOP:-multiop}
[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
-[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test: LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
- ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 40 48a 180 184c"
+if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
+ # bug number for skipped test: LU-1593 LU-2833 LU-1957 LU-2805
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 48a 180 184c"
+ [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba"
+fi
FAIL_ON_ERROR=false
# LU-4471 - failed rmdir on remote directories still removes directory on MDT0
test_4() {
local MDTIDX=1
- local remote_dir=remote_dir
- test_mkdir $DIR/$remote_dir ||
+ test_mkdir $DIR/$tdir ||
error "Create remote directory failed"
- touch $DIR/$remote_dir/$tfile ||
+ touch $DIR/$tdir/$tfile ||
error "Create file under remote directory failed"
- rmdir $DIR/$remote_dir &&
- error "Expect error removing in-use dir $DIR/$remote_dir"
+ rmdir $DIR/$tdir &&
+ error "Expect error removing in-use dir $DIR/$tdir"
- test -d $DIR/$remote_dir || error "Remote directory disappeared"
+ test -d $DIR/$tdir || error "Remote directory disappeared"
- rm -rf $DIR/$remote_dir || error "remove remote dir error"
+ rm -rf $DIR/$tdir || error "remove remote dir error"
}
run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
run_test 17e "symlinks: create recursive symlink (should return error) ===="
test_17f() {
- test_mkdir -p $DIR/d17f
- ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/d17f/111
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/d17f/222
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/d17f/333
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/d17f/444
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/d17f/555
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/d17f/666
- ls -l $DIR/d17f
+ test_mkdir -p $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 $DIR/$tdir/444
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
+ 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 ========================"
local i
local rc=0
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
stop mds${mds_index}
do_facet mds${mds_index} $cmd || rc=$?
- start mds${mds_index} $devname $MDS_MOUNT_OPTS
+ start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed"
df $MOUNT > /dev/null 2>&1
[ $rc -ne 0 ] && error "e2fsck should not report error upon "\
"short/long symlink MDT: rc=$rc"
stop mds${mdt_index}
do_facet mds${mdt_index} $cmd || rc=$?
- start mds${mdt_index} $devname $MDS_MOUNT_OPTS
+ start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
+ error "mount mds${mdt_index} failed"
df $MOUNT > /dev/null 2>&1
[ $rc -ne 0 ] && break
done
test_17n() {
local i
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] &&
[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] &&
skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return
run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
test_17o() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ] &&
skip "Need MDS version at least 2.3.64" && return
touch $WDIR/$tfile
stop mds${mdt_index}
- start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS
+ start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS ||
+ error "mount mds${mdt_index} failed"
#define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
do_facet mds${mdt_index} lctl set_param fail_loc=0x194
run_test 17o "stat file with incompat LMA feature"
test_18() {
- touch $DIR/f || error "Failed to touch $DIR/f: $?"
+ touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
ls $DIR || error "Failed to ls $DIR: $?"
}
run_test 18 "touch .../f ; ls ... =============================="
run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
test_24u() { # bug12192
- rm -rf $DIR/$tfile
$MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error
$CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
}
dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
- [ "$SZ1" = "$SZ2" ] || \
+ [[ "$SZ1" -eq "$SZ2" ]] ||
error "Error reading at the end of the file $tfile"
}
run_test 24w "Reading a file larger than 4Gb"
run_test 27e "setstripe existing file (should return error) ======"
test_27f() {
- test_mkdir -p $DIR/d27
- $SETSTRIPE -S 100 -i 0 -c 1 $DIR/d27/fbad && error "setstripe failed"
- dd if=/dev/zero of=$DIR/d27/fbad bs=4k count=4 || error "dd failed"
- $GETSTRIPE $DIR/d27/fbad || error "$GETSTRIPE failed"
+ test_mkdir $DIR/$tdir
+ $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"
}
run_test 27f "setstripe with bad stripe size (should return error)"
}
run_test 27C "check full striping across all OSTs"
+test_27D() {
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+ local POOL=${POOL:-testpool}
+ local first_ost=0
+ local last_ost=$(($OSTCOUNT - 1))
+ local ost_step=1
+ local ost_list=$(seq $first_ost $ost_step $last_ost)
+ local ost_range="$first_ost $last_ost $ost_step"
+
+ mkdir -p $DIR/$tdir
+ pool_add $POOL || error "pool_add failed"
+ pool_add_targets $POOL $ost_range || error "pool_add_targets failed"
+ llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT ||
+ error "llapi_layout_test failed"
+ cleanup_pools || error "cleanup_pools failed"
+}
+run_test 27D "validate llapi_layout API"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
test_32o() {
- rm -fr $DIR/d32o $DIR/$tfile
touch $DIR/$tfile
test_mkdir -p $DIR/d32o/tmp
TMP_DIR=$DIR/d32o/tmp
rm -fr $DIR/d33
test_mkdir -p $DIR/d33
chown $RUNAS_ID $DIR/d33
- $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 && error "create" || true
+ $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33
}
-run_test 33b "test open file with malformed flags (No panic and return error)"
+run_test 33b "test open file with malformed flags (No panic)"
test_33c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
}
run_test 33d "openfile with 444 modes and malformed flags under remote dir"
+test_33e() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
+
+ rmdir $DIR/$tdir/* || error "rmdir failed"
+
+ umask 777
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
+
+ rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
+
+ umask 000
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
+}
+run_test 33e "mkdir and striped directory should have same mode"
+
TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
test_34a() {
rm -f $DIR/f34
test_mkdir -p -c1 $BASE
+ $LFS df
+ $LFS df -i
local mdtidx=$(printf "%04x" $($LFS getstripe -M $BASE))
local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
- [[ $numfree -lt 21000 ]] && skip "not enough free inodes ($numfree)" &&
+ [[ $numfree -lt 21000 ]] &&
+ skip "not enough free inodes ($numfree) on MDT$mdtidx" &&
return
[[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
- echo "reduced count to $NUMTEST due to inodes"
+ echo "reduced count to $NUMTEST due to inodes on MDT$mdtidx"
# need to check free space for the directories as well
local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
numfree=$((blkfree / 4))
- [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
- echo "reduced count to $NUMTEST due to blocks"
+ [[ $numfree -lt $NUMTEST ]] && NUMTEST=$((numfree - 50)) &&
+ echo "reduced count to $NUMTEST due to blocks on MDT$mdtidx"
createmany -d $BASE/d $NUMTEST && echo $NUMTEST > $BASE/fnum ||
+ {
+ $LFS df
+ $LFS df -i
echo "failed" > $BASE/fnum
+ error "failed to create $NUMTEST subdirs in MDT$mdtidx:$BASE"
+ }
}
run_test 51b "exceed 64k subdirectory nlink limit"
}
run_test 51d "check object distribution ===================="
+test_51e() {
+ if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then
+ skip "Only applicable to ldiskfs-based MDTs"
+ return
+ fi
+
+ test_mkdir -c1 $DIR/$tdir || error "create $tdir failed"
+ test_mkdir -c1 $DIR/$tdir/d0 || error "create d0 failed"
+
+ touch $DIR/$tdir/d0/foo
+ createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 &&
+ error "file exceed 65000 nlink limit!"
+ unlinkmany $DIR/$tdir/d0/f- 65001
+ return 0
+}
+run_test 51e "check file nlink limit"
+
test_52a() {
[ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo
test_mkdir -p $DIR/$tdir
loopdev="$DIR/loop54c"
trap 0
- $UMOUNT -d $tdir || rc=$?
+ $UMOUNT -d $DIR/$tdir || rc=$?
losetup -d $loopdev || true
- rm $loopdev
+ losetup -d $LOOPDEV || true
+ rm -rf $loopdev $DIR/$tfile $DIR/$tdir
return $rc
}
test_54c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- tfile="$DIR/f54c"
- tdir="$DIR/d54c"
loopdev="$DIR/loop54c"
find_loop_dev
[ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
- mknod $loopdev b 7 $LOOPNUM
- echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
- dd if=/dev/zero of=$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
- losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
trap cleanup_54c EXIT
+ mknod $loopdev b 7 $LOOPNUM
+ echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
+ dd if=/dev/zero of=$DIR/$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
+ losetup $loopdev $DIR/$tfile ||
+ error "can't set up $loopdev for $DIR/$tfile"
mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
- test_mkdir -p $tdir
- mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir"
- dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
- df $tdir
- dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
+ test_mkdir -p $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 ||
+ error "dd write"
+ df $DIR/$tdir
+ dd if=$DIR/$tdir/tmp of=/dev/zero bs=$(get_page_size client) count=30 ||
+ error "dd read"
cleanup_54c
}
run_test 54c "block device works in lustre ====================="
}
run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' ======="
-# Get and check the actual stripe count of one file.
-# Usage: check_stripe_count <file> <expected_stripe_count>
-check_stripe_count() {
- local file=$1
- local expected=$2
- local actual
-
- [[ -z "$file" || -z "$expected" ]] &&
- error "check_stripe_count: invalid argument!"
-
- local cmd="$GETSTRIPE -c $file"
- actual=$($cmd) || error "$cmd failed"
- actual=${actual%% *}
-
- if [[ $actual -ne $expected ]]; then
- [[ $expected -eq -1 ]] ||
- error "$cmd wrong: found $actual, expected $expected"
- [[ $actual -eq $OSTCOUNT ]] ||
- error "$cmd wrong: found $actual, expected $OSTCOUNT"
- fi
-}
-
test_56w() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
TDIR=$DIR/${tdir}w
}
run_test 56y "lfs find -L raid0|released"
+test_56z() { # LU-4824
+ # This checks to make sure 'lfs find' continues after errors
+ # There are two classes of errors that should be caught:
+ # - If multiple paths are provided, all should be searched even if one
+ # errors out
+ # - If errors are encountered during the search, it should not terminate
+ # early
+ local i
+ test_mkdir $DIR/$tdir
+ for i in d{0..9}; do
+ test_mkdir $DIR/$tdir/$i
+ done
+ touch $DIR/$tdir/d{0..9}/$tfile
+ $LFS find $DIR/non_existent_dir $DIR/$tdir &&
+ error "$LFS find did not return an error"
+ # Make a directory unsearchable. This should NOT be the last entry in
+ # directory order. Arbitrarily pick the 6th entry
+ chmod 700 $(lfs find $DIR/$tdir -type d | sed '6!d')
+ local count=$($RUNAS $LFS find $DIR/non_existent $DIR/$tdir | wc -l)
+ # The user should be able to see 10 directories and 9 files
+ [ $count == 19 ] || error "$LFS find did not continue after error"
+}
+run_test 56z "lfs find should continue after an error"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# note test will not do anything if MDS is not local
skip_env "User $RUNAS_ID does not exist - skipping"
return 0
}
- # We had better clear the $DIR to get enough space for dd
- rm -rf $DIR/*
touch $DIR/$tfile
chmod 777 $DIR/$tfile
chmod ug+s $DIR/$tfile
run_test 79 "df report consistency check ======================="
test_80() { # bug 10718
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# relax strong synchronous semantics for slow backends like ZFS
local soc="obdfilter.*.sync_on_lock_cancel"
}
test_102a() {
- local testfile=$DIR/xattr_testfile
+ local testfile=$DIR/$tfile
touch $testfile
return $?
}
-test_103 () {
+test_103a() {
[ "$UID" != 0 ] && skip_env "must run as root" && return
[ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] &&
skip "must have acl enabled" && return
skip_env "could not find setfacl" && return
$GSS && skip "could not run under gss" && return
+ gpasswd -a daemon bin # LU-5641
+
declare -a identity_old
for num in $(seq $MDSCOUNT); do
fi
done
}
-run_test 103 "acl test ========================================="
+run_test 103a "acl test ========================================="
+
+test_103b() {
+ 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
+
+ [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] &&
+ error "$DIR/$tdir shouldn't contain default ACL"
+ [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] &&
+ error "$DIR/$tdir.bak shouldn't contain default ACL"
+ true
+}
+run_test 103c "'cp -rp' won't set empty acl"
test_104a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
if [ x$som = x"enabled" ]; then
[ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected"
- MOUNTOPT=`echo $MOUNTOPT | sed 's/som_preview//g'`
+ MOUNT_OPTS=`echo $MOUNT_OPTS |
+ sed 's/som_preview,\|,som_preview\|som_preview//g'`
do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled"
else
[ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected"
- MOUNTOPT="$MOUNTOPT,som_preview"
+ MOUNT_OPTS="${MOUNT_OPTS:+$MOUNT_OPTS,}som_preview"
do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled"
fi
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local num=$(get_mds_dir $DIR)
local mymds=mds${num}
- local MOUNTOPT_SAVE=$MOUNTOPT
+ local MOUNT_OPTS_SAVE=$MOUNT_OPTS
dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
cancel_lru_locks osc
- som1=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1)
+ som1=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1)
gl1=$(get_ost_param "ldlm_glimpse_enqueue")
stat $DIR/$tfile >/dev/null
dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null
cancel_lru_locks osc
- som2=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1)
+ som2=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1)
if [ $som1 == $som2 ]; then
error "som is still "$som2
if [ x$som2 = x"enabled" ]; then
gl2=$(get_ost_param "ldlm_glimpse_enqueue")
echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured"
som_mode_switch $som2 $gl1 $gl2
- MOUNTOPT=$MOUNTOPT_SAVE
+ MOUNT_OPTS=$MOUNT_OPTS_SAVE
}
run_test 132 "som avoids glimpse rpc"
run_test 133d "Verifying rename_stats ========================================"
test_133e() {
+ 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 testdir=$DIR/${tdir}/stats_testdir
local ctr f0 f1 bs=32768 count=42 sum
- remote_ost_nodsh && skip "remote OST with nodsh" && return
mkdir -p ${testdir} || error "mkdir failed"
$SETSTRIPE -c 1 -i 0 ${testdir}/${tfile}
run_test 133e "Verifying OST {read,write}_bytes nid stats ================="
test_133f() {
- local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/"
+ local proc_dirs
+
+ local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
+/sys/fs/lustre/ /sys/fs/lnet/"
+ local dir
+ for dir in $dirs; do
+ if [ -d $dir ]; then
+ proc_dirs="$proc_dirs $dir"
+ fi
+ done
+
local facet
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
# First without trusting modes.
find $proc_dirs -exec cat '{}' \; &> /dev/null
run_test 133f "Check for LBUGs/Oopses/unreadable files in /proc"
test_133g() {
- local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/"
+ local proc_dirs
+
+ local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \
+/sys/fs/lustre/ /sys/fs/lnet/"
+ local dir
+ for dir in $dirs; do
+ if [ -d $dir ]; then
+ proc_dirs="$proc_dirs $dir"
+ fi
+ done
+
local facet
# Second verifying readability.
dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
idx=$(printf %04x $i)
BEFORE=$(get_osd_param $list *OST*$idx stats |
- awk '$1 == "cache_access" {sum += $2}
+ awk '$1 == "cache_access" {sum += $7}
END { printf("%0.0f", sum) }')
cancel_lru_locks osc
cat $file >/dev/null
AFTER=$(get_osd_param $list *OST*$idx stats |
- awk '$1 == "cache_access" {sum += $2}
+ awk '$1 == "cache_access" {sum += $7}
END { printf("%0.0f", sum) }')
echo BEFORE:$BEFORE AFTER:$AFTER
function roc_hit() {
local list=$(comma_list $(osts_nodes))
echo $(get_osd_param $list '' stats |
- awk '$1 == "cache_hit" {sum += $2}
+ awk '$1 == "cache_hit" {sum += $7}
END { printf("%0.0f", sum) }')
}
$OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
fid=$($LFS path2fid $test_dir/$tfile-2)
- echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
- cp /etc/passwd $MOUNT/.lustre/fid/$fid &&
- error "create lov data thru .lustre should fail."
+
+ if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.50) ]
+ then # LU-5424
+ echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid"
+ cp /etc/passwd $MOUNT/.lustre/fid/$fid ||
+ error "create lov data thru .lustre failed"
+ fi
echo "cp /etc/passwd $test_dir/$tfile-2"
cp /etc/passwd $test_dir/$tfile-2 ||
error "copy to $test_dir/$tfile-2 failed."
local rc=0
mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX -c $MDSCOUNT $remote_dir ||
+ $LFS mkdir -i $MDTIDX $remote_dir ||
error "create remote directory failed"
cp /etc/hosts $remote_dir/$tfile
}
run_test 154d "Verify open file fid"
+test_154e()
+{
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.50) ]] &&
+ skip "Need MDS version at least 2.6.50" && return
+
+ if ls -a $MOUNT | grep -q '^\.lustre$'; then
+ error ".lustre returned by readdir"
+ fi
+}
+run_test 154e ".lustre is not returned by readdir"
+
+test_154f() {
+ # create parent directory on a single MDT to avoid cross-MDT hardlinks
+ test_mkdir -p -c1 $DIR/$tdir/d
+ # test dirs inherit from its stripe
+ mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
+ mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
+ cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
+ ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
+ touch $DIR/f
+
+ # get fid of parents
+ local FID0=$($LFS path2fid $DIR/$tdir/d)
+ local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
+ local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
+ local FID3=$($LFS path2fid $DIR)
+
+ # check that path2fid --parents returns expected <parent_fid>/name
+ # 1) test for a directory (single parent)
+ local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
+ [ "$parent" == "$FID0/foo1" ] ||
+ error "expected parent: $FID0/foo1, got: $parent"
+
+ # 2) test for a file with nlink > 1 (multiple parents)
+ parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
+ echo "$parent" | grep -F "$FID1/$tfile" ||
+ error "$FID1/$tfile not returned in parent list"
+ echo "$parent" | grep -F "$FID2/link" ||
+ error "$FID2/link not returned in parent list"
+
+ # 3) get parent by fid
+ local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
+ parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+ echo "$parent" | grep -F "$FID1/$tfile" ||
+ error "$FID1/$tfile not returned in parent list (by fid)"
+ echo "$parent" | grep -F "$FID2/link" ||
+ error "$FID2/link not returned in parent list (by fid)"
+
+ # 4) test for entry in root directory
+ parent=$($LFS path2fid --parents $DIR/f)
+ echo "$parent" | grep -F "$FID3/f" ||
+ error "$FID3/f not returned in parent list"
+
+ # 5) test it on root directory
+ [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
+ error "$MOUNT should not have parents"
+
+ # enable xattr caching and check that linkea is correctly updated
+ local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
+ save_lustre_params client "llite.*.xattr_cache" > $save
+ lctl set_param llite.*.xattr_cache 1
+
+ # 6.1) linkea update on rename
+ mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
+
+ # get parents by fid
+ parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+ # foo1 should no longer be returned in parent list
+ echo "$parent" | grep -F "$FID1" &&
+ error "$FID1 should no longer be in parent list"
+ # the new path should appear
+ echo "$parent" | grep -F "$FID2/$tfile.moved" ||
+ error "$FID2/$tfile.moved is not in parent list"
+
+ # 6.2) linkea update on unlink
+ rm -f $DIR/$tdir/d/foo2/link
+ parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+ # foo2/link should no longer be returned in parent list
+ echo "$parent" | grep -F "$FID2/link" &&
+ error "$FID2/link should no longer be in parent list"
+ true
+
+ rm -f $DIR/f
+ restore_lustre_params < $save
+}
+run_test 154f "get parent fids by reading link ea"
+
test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
run_test 155h "Verify big file correctness: read cache:off write_cache:off"
test_156() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local CPAGES=3
local BEFORE
test_160c() {
local rc=0
+ local server_version=$(lustre_version_code $SINGLEMDS)
+
+ [[ $server_version -gt $(version_code 2.5.57) ]] ||
+ [[ $server_version -gt $(version_code 2.5.1) &&
+ $server_version -lt $(version_code 2.5.50) ]] ||
+ { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; }
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# Registration step
run_test 161b "link ea sanity under remote directory"
test_161c() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.5) ]] &&
skip "Need MDS version at least 2.1.5" && return
test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
# regular file
FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
- check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
+ check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 ||
+ error "check path $tdir/d2/$tfile failed"
# softlink
ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink
FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]')
- check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0
+ check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 ||
+ error "check path $tdir/d2/p/q/r/slink failed"
# softlink to wrong file
ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong
FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]')
- check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0
+ check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 ||
+ error "check path $tdir/d2/p/q/r/slink.wrong failed"
# hardlink
ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink
mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file
FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]')
# fid2path dir/fsname should both work
- check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
- check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 ||
+ error "check path $tdir/d2/a/b/c/new_file failed"
+ check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 ||
+ error "check path $DIR/$tdir/d2/p/q/r/hlink failed"
# hardlink count: check that there are 2 links
# Doesnt work with CMD yet: 17935
# hardlink indexing: remove the first link
rm $DIR/$tdir/d2/p/q/r/hlink
- check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 ||
+ error "check path $DIR/$tdir/d2/a/b/c/new_file failed"
return 0
}
for ((i=0;i<5;i++)); do
FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
error "get fid for f$i failed"
- check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
+ check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0 ||
+ error "check path $tdir/striped_dir/f$i failed"
FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
error "get fid for d$i failed"
- check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
+ check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0 ||
+ error "check path $tdir/striped_dir/d$i failed"
done
return 0
}
run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======"
-# it would be good to share it with obdfilter-survey/libecho code
+# it would be good to share it with obdfilter-survey/iokit-libecho code
setup_obdecho_osc () {
local rc=0
local ost_nid=$1
test_180c() { # LU-2598
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] &&
skip "Need MDS version at least 2.4.0" && return
run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
test_183() { # LU-2275
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
[[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] &&
skip "Need MDS version at least 2.3.56" && return
}
run_test 187b "Test data version change on volatile file"
-# OST pools tests
-check_file_in_pool()
-{
- local file=$1
- local pool=$2
- local tlist="$3"
- local res=$($GETSTRIPE $file | grep 0x | cut -f2)
- for i in $res
- do
- for t in $tlist ; do
- [ "$i" -eq "$t" ] && continue 2
- done
-
- echo "pool list: $tlist"
- echo "striping: $res"
- error_noexit "$file not allocated in $pool"
- return 1
- done
- return 0
-}
-
-pool_add() {
- echo "Creating new pool"
- local pool=$1
-
- create_pool $FSNAME.$pool ||
- { error_noexit "No pool created, result code $?"; return 1; }
- [ $($LFS pool_list $FSNAME | grep -c $pool) -eq 1 ] ||
- { error_noexit "$pool not in lfs pool_list"; return 2; }
-}
-
-pool_add_targets() {
- echo "Adding targets to pool"
- local pool=$1
- local first=$2
- local last=$3
- local step=${4:-1}
-
- local list=$(seq $first $step $last)
-
- local t=$(for i in $list; do printf "$FSNAME-OST%04x_UUID " $i; done)
- do_facet mgs $LCTL pool_add \
- $FSNAME.$pool $FSNAME-OST[$first-$last/$step]
- wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$pool \
- | sort -u | tr '\n' ' ' " "$t" || {
- error_noexit "Add to pool failed"
- return 1
- }
- local lfscount=$($LFS pool_list $FSNAME.$pool | grep -c "\-OST")
- local addcount=$(((last - first) / step + 1))
- [ $lfscount -eq $addcount ] || {
- error_noexit "lfs pool_list bad ost count" \
- "$lfscount != $addcount"
- return 2
- }
-}
-
-pool_set_dir() {
- local pool=$1
- local tdir=$2
- echo "Setting pool on directory $tdir"
-
- $SETSTRIPE -c 2 -p $pool $tdir && return 0
-
- error_noexit "Cannot set pool $pool to $tdir"
- return 1
-}
-
-pool_check_dir() {
- local pool=$1
- local tdir=$2
- echo "Checking pool on directory $tdir"
-
- local res=$($GETSTRIPE --pool $tdir | sed "s/\s*$//")
- [ "$res" = "$pool" ] && return 0
-
- error_noexit "Pool on '$tdir' is '$res', not '$pool'"
- return 1
-}
-
-pool_dir_rel_path() {
- echo "Testing relative path works well"
- local pool=$1
- local tdir=$2
- local root=$3
-
- mkdir -p $root/$tdir/$tdir
- cd $root/$tdir
- pool_set_dir $pool $tdir || return 1
- pool_set_dir $pool ./$tdir || return 2
- pool_set_dir $pool ../$tdir || return 3
- pool_set_dir $pool ../$tdir/$tdir || return 4
- rm -rf $tdir; cd - > /dev/null
-}
-
-pool_alloc_files() {
- echo "Checking files allocation from directory pool"
- local pool=$1
- local tdir=$2
- local count=$3
- local tlist="$4"
-
- local failed=0
- for i in $(seq -w 1 $count)
- do
- local file=$tdir/file-$i
- touch $file
- check_file_in_pool $file $pool "$tlist" || \
- failed=$((failed + 1))
- done
- [ "$failed" = 0 ] && return 0
-
- error_noexit "$failed files not allocated in $pool"
- return 1
-}
-
-pool_create_files() {
- echo "Creating files in pool"
- local pool=$1
- local tdir=$2
- local count=$3
- local tlist="$4"
-
- mkdir -p $tdir
- local failed=0
- for i in $(seq -w 1 $count)
- do
- local file=$tdir/spoo-$i
- $SETSTRIPE -p $pool $file
- check_file_in_pool $file $pool "$tlist" || \
- failed=$((failed + 1))
- done
- [ "$failed" = 0 ] && return 0
-
- error_noexit "$failed files not allocated in $pool"
- return 1
-}
-
-pool_lfs_df() {
- echo "Checking 'lfs df' output"
- local pool=$1
-
- local t=$($LCTL get_param -n lov.$FSNAME-clilov-*.pools.$pool |
- tr '\n' ' ')
- local res=$($LFS df --pool $FSNAME.$pool |
- awk '{print $1}' |
- grep "$FSNAME-OST" |
- tr '\n' ' ')
- [ "$res" = "$t" ] && return 0
-
- error_noexit "Pools OSTs '$t' is not '$res' that lfs df reports"
- return 1
-}
-
-pool_file_rel_path() {
- echo "Creating files in a pool with relative pathname"
- local pool=$1
- local tdir=$2
-
- mkdir -p $tdir ||
- { error_noexit "unable to create $tdir"; return 1 ; }
- local file="/..$tdir/$tfile-1"
- $SETSTRIPE -p $pool $file ||
- { error_noexit "unable to create $file" ; return 2 ; }
-
- cd $tdir
- $SETSTRIPE -p $pool $tfile-2 || {
- error_noexit "unable to create $tfile-2 in $tdir"
- return 3
- }
-}
-
-pool_remove_first_target() {
- echo "Removing first target from a pool"
- local pool=$1
-
- local pname="lov.$FSNAME-*.pools.$pool"
- local t=$($LCTL get_param -n $pname | head -n1)
- do_facet mgs $LCTL pool_remove $FSNAME.$pool $t
- wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || {
- error_noexit "$t not removed from $FSNAME.$pool"
- return 1
- }
-}
-
-pool_remove_all_targets() {
- echo "Removing all targets from pool"
- local pool=$1
- local file=$2
- local pname="lov.$FSNAME-*.pools.$pool"
- for t in $($LCTL get_param -n $pname | sort -u)
- do
- do_facet mgs $LCTL pool_remove $FSNAME.$pool $t
- done
- wait_update $HOSTNAME "lctl get_param -n $pname" "" || {
- error_noexit "Pool $FSNAME.$pool cannot be drained"
- return 1
- }
- # striping on an empty/nonexistant pool should fall back
- # to "pool of everything"
- touch $file || {
- error_noexit "failed to use fallback striping for empty pool"
- return 2
- }
- # setstripe on an empty pool should fail
- $SETSTRIPE -p $pool $file 2>/dev/null && {
- error_noexit "expected failure when creating file" \
- "with empty pool"
- return 3
- }
- return 0
-}
-
-pool_remove() {
- echo "Destroying pool"
- local pool=$1
- local file=$2
-
- do_facet mgs $LCTL pool_destroy $FSNAME.$pool
-
- sleep 2
- # striping on an empty/nonexistant pool should fall back
- # to "pool of everything"
- touch $file || {
- error_noexit "failed to use fallback striping for missing pool"
- return 1
- }
- # setstripe on an empty pool should fail
- $SETSTRIPE -p $pool $file 2>/dev/null && {
- error_noexit "expected failure when creating file" \
- "with missing pool"
- return 2
- }
-
- # get param should return err once pool is gone
- if wait_update $HOSTNAME "lctl get_param -n \
- lov.$FSNAME-*.pools.$pool 2>/dev/null || echo foo" "foo"
- then
- remove_pool_from_list $FSNAME.$pool
- return 0
- fi
- error_noexit "Pool $FSNAME.$pool is not destroyed"
- return 3
-}
-
test_200() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
test_205() { # Job stats
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mgs_nodsh && skip "remote MGS with nodsh" && return
[ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
skip "Server doesn't support jobstats" && return 0
[[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return
trap jobstats_set EXIT
fi
+ local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ echo "Registered as changelog user $user"
+
# mkdir
cmd="mkdir $DIR/$tfile"
verify_jobstats "$cmd" "mdt"
cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename"
verify_jobstats "$cmd" "mdt"
+ # Ensure that jobid are present in changelog (if supported by MDS)
+ if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ]
+ then
+ $LFS changelog $MDT0 | tail -9
+ jobids=$($LFS changelog $MDT0 | tail -9 | grep -c "j=")
+ [ $jobids -eq 9 ] ||
+ error "Wrong changelog jobid count $jobids != 9"
+ fi
+
# cleanup
rm -f $DIR/jobstats_test_rename
[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] ||
{ skip "Need MDS version at least 2.4.52"; return 0; }
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
echo "==== test 1: verify get lease work"
$MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
# having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys
create_lnet_proc_files() {
- cat /proc/sys/lnet/$1 >$TMP/lnet_$1.out || error "cannot read /proc/sys/lnet/$1"
+ 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
local L2 # regexp for 2nd line (optional)
local BR # regexp for the rest (body)
- # /proc/sys/lnet/stats should look as 11 space-separated non-negative numerics
+ # lnet.stats should look as 11 space-separated non-negative numerics
BR="^$N $N $N $N $N $N $N $N $N $N $N$"
create_lnet_proc_files "stats"
- check_lnet_proc_stats "stats.out" "/proc/sys/lnet/stats" "$BR"
check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR"
remove_lnet_proc_files "stats"
- # /proc/sys/lnet/routes should look like this:
+ # lnet.routes should look like this:
# Routing disabled/enabled
# net hops priority state router
# where net is a string like tcp0, hops > 0, priority >= 0,
L2="^net +hops +priority +state +router$"
BR="^$NET +$N +(0|1) +(up|down) +$NID$"
create_lnet_proc_files "routes"
- check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2"
check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
remove_lnet_proc_files "routes"
- # /proc/sys/lnet/routers should look like this:
+ # lnet.routers should look like this:
# ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router
# where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down,
# last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are
L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$"
BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$"
create_lnet_proc_files "routers"
- check_lnet_proc_entry "routers.out" "/proc/sys/lnet/routers" "$BR" "$L1"
check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1"
remove_lnet_proc_files "routers"
- # /proc/sys/lnet/peers should look like this:
+ # lnet.peers should look like this:
# nid refs state last max rtr min tx min queue
# where nid is a string like 192.168.1.1@tcp2, refs > 0,
# state is up/down/NA, max >= 0. last, rtr, min, tx, min are
L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$"
BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$"
create_lnet_proc_files "peers"
- check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1"
check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1"
remove_lnet_proc_files "peers"
- # /proc/sys/lnet/buffers should look like this:
+ # lnet.buffers should look like this:
# pages count credits min
# where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0)
L1="^pages +count +credits +min$"
BR="^ +$N +$N +$I +$I$"
create_lnet_proc_files "buffers"
- check_lnet_proc_entry "buffers.out" "/proc/sys/lnet/buffers" "$BR" "$L1"
check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1"
remove_lnet_proc_files "buffers"
- # /proc/sys/lnet/nis should look like this:
+ # lnet.nis should look like this:
# nid status alive refs peer rtr max tx min
# where nid is a string like 192.168.1.1@tcp2, status is up/down,
# alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0,
L1="^nid +status +alive +refs +peer +rtr +max +tx +min$"
BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$"
create_lnet_proc_files "nis"
- check_lnet_proc_entry "nis.out" "/proc/sys/lnet/nis" "$BR" "$L1"
check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1"
remove_lnet_proc_files "nis"
- # can we successfully write to /proc/sys/lnet/stats?
- echo "0" >/proc/sys/lnet/stats || error "cannot write to /proc/sys/lnet/stats"
+ # 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 "/proc/sys/lnet exists and has proper content - bugs 18102, 21079, 21517"
+run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517"
test_216() { # bug 20317
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# LU-1512 try to reuse idle OI blocks
test_228a() {
[ $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
test_228b() {
[ $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
#LU-1881
test_228c() {
[ $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
touch $DIR/$tdir/$tfile || error "touch failed"
# OBD_FAIL_LLITE_XATTR_ENOMEM
$LCTL set_param fail_loc=0x1405
- if [ ! -f /etc/SuSE-release ]; then
+ # output of the form: attr 2 4 44 3 fc13 x86_64
+ V=($(IFS=".-" rpm -q attr))
+ if [[ ${V[1]} > 2 || ${V[2]} > 4 || ${V[3]} > 44 ||
+ ${V[1]} = 2 && ${V[2]} = 4 && ${V[3]} = 44 && ${V[4]} > 6 ]]; then
# attr pre-2.4.44-7 had a bug with rc
- # LU-3703 - SLES clients have older attr
+ # LU-3703 - SLES 11 and FC13 clients have older attr
getfattr -n user.attr $DIR/$tdir/$tfile &&
error "getfattr should have failed with ENOMEM"
+ else
+ skip "LU-3703: attr version $(getfattr --version) too old"
fi
$LCTL set_param fail_loc=0x0
rm -rf $DIR/$tdir
# The new system calls are supported in glibc >= 2.14.
test_237() {
- echo "Test file_handle syscalls" > $DIR/$tfile
+ echo "Test file_handle syscalls" > $DIR/$tfile ||
+ error "write failed"
check_fhandle_syscalls $DIR/$tfile ||
error "check_fhandle_syscalls failed"
}
# LU-4659 linkea consistency
test_238() {
+ local server_version=$(lustre_version_code $SINGLEMDS)
+
+ [[ $server_version -gt $(version_code 2.5.57) ]] ||
+ [[ $server_version -gt $(version_code 2.5.1) &&
+ $server_version -lt $(version_code 2.5.50) ]] ||
+ { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; }
+
touch $DIR/$tfile
ln $DIR/$tfile $DIR/$tfile.lnk
touch $DIR/$tfile.new
}
run_test 238 "Verify linkea consistency"
+test_239() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.60) ] &&
+ skip "Need MDS version at least 2.5.60" && return
+ local list=$(comma_list $(mdts_nodes))
+
+ 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)
+ [ "$changes" -eq 0 ] || error "$changes not synced"
+}
+run_test 239 "osp_sync test"
+
+test_240() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir -p $DIR/$tdir
+
+ $LFS mkdir -i 0 $DIR/$tdir/d0 ||
+ error "failed to mkdir $DIR/$tdir/d0 on MDT0"
+ $LFS mkdir -i 1 $DIR/$tdir/d0/d1 ||
+ error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1"
+
+ umount_client $MOUNT || error "umount failed"
+ #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713
+ do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1
+ mount_client $MOUNT || error "failed to mount client"
+
+ echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT"
+ stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1"
+}
+run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
+
+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
+ done
+}
+
+test_241_dio() {
+ for LOOP in $(seq $1); do
+ dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 \
+ iflag=direct 2>/dev/null
+ done
+}
+
+test_241() {
+ dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
+ ls -la $DIR/$tfile
+ cancel_lru_locks osc
+ test_241_bio 1000 &
+ PID=$!
+ test_241_dio 1000
+ wait $PID
+}
+run_test 241 "bio vs dio"
+
+cleanup_test_300() {
+ trap 0
+ umask $SAVE_UMASK
+}
test_striped_dir() {
local mdt_index=$1
local stripe_count
local stripe_index
mkdir -p $DIR/$tdir
- $LFS setdirstripe -i $mdt_index -c 2 -t all_char $DIR/$tdir/striped_dir ||
+
+ SAVE_UMASK=$(umask)
+ trap cleanup_test_300 RETURN EXIT
+
+ $LFS setdirstripe -i $mdt_index -c 2 -t all_char -m 755 \
+ $DIR/$tdir/striped_dir ||
error "set striped dir error"
+ local mode=$(stat -c%a $DIR/$tdir/striped_dir)
+ [ "$mode" = "755" ] || error "expect 755 got $mode"
+
stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
if [ "$stripe_count" != "2" ]; then
error "stripe_count is $stripe_count, expect 2"
rmdir $DIR/$tdir/striped_dir ||
error "rmdir striped dir error"
+
+ cleanup_test_300
+
true
}
$LFS setdirstripe -D -c $MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
error "set default stripe on striped dir error"
+ stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/striped_dir)
+ [ $stripe_count -eq $MDSCOUNT ] ||
+ error "default stripe wrong expect $MDSCOUNT get $stripe_count"
+
mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
for dir in $(find $DIR/$tdir/striped_dir/*); do
}
run_test 300g "check default striped directory for striped directory"
+test_300h() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local file
+
+ mkdir $DIR/$tdir
+
+ $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ createmany -o $DIR/$tdir/striped_dir/f- 10 ||
+ error "create files under striped dir failed"
+
+ # 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"
+
+ #set the stripe to be unknown hash type
+ #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901
+ $LCTL set_param fail_loc=0x1901
+ for ((i = 0; i < 10; i++)); do
+ $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i ||
+ error "stat f-$i failed"
+ rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed"
+ done
+
+ touch $DIR/$tdir/striped_dir/f0 &&
+ error "create under striped dir with unknown hash should fail"
+
+ $LCTL set_param fail_loc=0
+
+ umount_client $MOUNT || error "umount failed"
+ mount_client $MOUNT || error "mount failed"
+
+ return 0
+}
+run_test 300h "client handle unknown hash type striped directory"
+
test_400a() { # LU-1606, was conf-sanity test_74
local extra_flags=''
local out=$TMP/$tfile
local ls
#define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903
$LCTL set_param fail_loc=0x903
- # cancel_lru_locks mgc - does not work due to lctl set_param syntax
- for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do
- echo "clear" > $ls
- done
+
+ cancel_lru_locks MGC
+
FAIL_ON_ERROR=true cleanup
FAIL_ON_ERROR=true setup
}