set -e
ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742
-ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b $SANITY_EXCEPT"
-# bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443
-#ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"}
+# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 5188
+ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 68b $SANITY_EXCEPT"
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
# Tests that fail on uml
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
READS=${READS:-"reads"}
-TRUNCATE=${TRUNCATE:-truncate}
MUNLINK=${MUNLINK:-munlink}
SOCKETSERVER=${SOCKETSERVER:-socketserver}
SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
-IOPENTEST1=${IOPENTEST1:-iopentest1}
-IOPENTEST2=${IOPENTEST2:-iopentest2}
MEMHOG=${MEMHOG:-memhog}
DIRECTIO=${DIRECTIO:-directio}
ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24v 27m 36f 36g 36h 51b 51c 60c 63 64b 68 71 73 77f 78 101 103 115 120g 124b"
-SANITYLOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log}
FAIL_ON_ERROR=false
cleanup() {
exit 0
fi
-[ "$SANITYLOG" ] && rm -f $SANITYLOG || true
-
check_and_setup_lustre
DIR=${DIR:-$MOUNT}
# $RUNAS_ID may get set incorrectly somewhere else
[ $UID -eq 0 -a $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!"
-check_runas_id $RUNAS_ID $RUNAS_ID $RUNAS
+check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
build_test_filter
$RUNAS mkdir $DIR/d6g/d || error
chmod g+s $DIR/d6g/d || error
mkdir $DIR/d6g/d/subdir
- $CHECKSTAT -g \#$RUNAS_ID $DIR/d6g/d/subdir || error
+ $CHECKSTAT -g \#$RUNAS_GID $DIR/d6g/d/subdir || error
}
run_test 6g "Is new dir in sgid dir inheriting group?"
test_6h() { # bug 7331
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return
touch $DIR/f6h || error "touch failed"
- chown $RUNAS_ID:$RUNAS_ID $DIR/f6h || error "initial chown failed"
- $RUNAS -G$RUNAS_ID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked"
- $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_ID $DIR/f6h || error
+ chown $RUNAS_ID:$RUNAS_GID $DIR/f6h || error "initial chown failed"
+ $RUNAS -G$RUNAS_GID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked"
+ $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_GID $DIR/f6h || error
}
run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)"
run_test 17g "symlinks: really long symlink name ==============================="
test_17h() { #bug 17378
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
mkdir -p $DIR/$tdir
$SETSTRIPE $DIR/$tdir -c -1
#define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141
- do_facet mds lctl set_param fail_loc=0x80000141
+ do_facet $SINGLEMDS lctl set_param fail_loc=0x80000141
touch $DIR/$tdir/$tfile || true
}
run_test 17h "create objects: lov_free_memmd() doesn't lbug"
test_17i() { #bug 20018
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
mkdir -p $DIR/$tdir
local foo=$DIR/$tdir/$tfile
ln -s $foo $foo || error "create symlink failed"
#define OBD_FAIL_MDS_READLINK_EPROTO 0x143
- do_facet mds lctl set_param fail_loc=0x80000143
+ do_facet $SINGLEMDS lctl set_param fail_loc=0x80000143
ls -l $foo && error "error not detected"
return 0
}
run_test 17i "don't panic on short symlink"
+test_17k() { #bug 22301
+ rsync --help | grep -q xattr ||
+ skip_env "$(rsync --version| head -1) does not support xattrs"
+ mkdir -p $DIR/{$tdir,$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 ========================="
+
test_18() {
touch $DIR/f
ls $DIR || error
test_22() {
WDIR=$DIR/$tdir
mkdir -p $WDIR
- chown $RUNAS_ID $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 $WDIR/etc || error "checkstat -u failed"
+ $CHECKSTAT -u \#$RUNAS_ID -g \#$RUNAS_GID $WDIR/etc || error "checkstat -u failed"
}
run_test 22 "unpack tar archive as non-root user ==============="
}
run_test 24u "create stripe file"
+page_size() {
+ getconf PAGE_SIZE
+}
+
test_24v() {
local NRFILES=100000
local FREE_INODES=`lfs df -i|grep "filesystem summary" | awk '{print $5}'`
mkdir -p $DIR/d24v
createmany -m $DIR/d24v/$tfile $NRFILES
+
+ cancel_lru_locks mdc
+ lctl set_param mdc.*.stats clear
+
ls $DIR/d24v >/dev/null || error "error in listing large dir"
+ # 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
+ # 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=$(($(lctl get_param -n mdc.*.max_pages_per_rpc)*$(page_size)))
+ RPC_NUM=$(((NRFILES * DIRENT_SIZE + RPC_SIZE - 1) / RPC_SIZE + 1))
+ mds_readpage=`lctl get_param mdc.*.stats | \
+ awk '/^mds_readpage/ {print $2}'`
+ [ $mds_readpage -gt $RPC_NUM ] && \
+ error "large readdir doesn't take effect"
+
rm $DIR/d24v -rf
}
run_test 24v "list directory with large files (handle hash collision, bug: 17560)"
+test_24w() { # bug21506
+ SZ1=234852
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=4096 || return 1
+ 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" ] || \
+ error "Error reading at the end of the file $tfile"
+}
+run_test 24w "Reading a file larger than 4Gb"
+
test_25a() {
echo '== symlink sanity ============================================='
run_test 27m "create file while OST0 was full =================="
sleep_maxage() {
- local DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
+ local DELAY=$(do_facet $SINGLEMDS lctl get_param -n lov.*.qos_maxage | head -n 1 | awk '{print $1 * 2}')
sleep $DELAY
}
local MDSIDX=$(get_mds_dir "$DIR/$tdir")
echo OSTIDX=$OSTIDX MDSIDX=$MDSIDX
- local OST=$(lfs osts | grep ${OSTIDX}": " | \
- awk '{print $2}' | sed -e 's/_UUID$//')
+ local OST=$(ostname_from_index $OSTIDX)
local MDT_INDEX=$(lfs df | grep "\[MDT:$((MDSIDX - 1))\]" | awk '{print $1}' | \
sed -e 's/_UUID$//;s/^.*-//')
reset_enospc
rm -f $DIR/$tdir/$tfile
+ mkdir -p $DIR/$tdir
$MCREATE $DIR/$tdir/$tfile || error "mcreate $DIR/$tdir/$tfile failed"
$TRUNCATE $DIR/$tdir/$tfile 80000000 ||error "truncate $DIR/$tdir/$tfile failed"
$CHECKSTAT -s 80000000 $DIR/$tdir/$tfile || error "checkstat failed"
run_test 27u "skip object creation on OSC w/o objects =========="
test_27v() { # bug 4900
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- remote_ost_nodsh && skip "remote OST with nodsh" && return
+ [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && 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
touch $DIR/$tdir/$tfile
#define OBD_FAIL_TGT_DELAY_PRECREATE 0x705
# all except ost1
- for (( i=0; i < OSTCOUNT; i++ )) ; do
+ for (( i=1; i < OSTCOUNT; i++ )); do
do_facet ost$i lctl set_param fail_loc=0x705
done
local START=`date +%s`
local FINISH=`date +%s`
local TIMEOUT=`lctl get_param -n timeout`
- [ $((FINISH - START)) -ge $((TIMEOUT / 2)) ] && \
+ local PROCESS=$((FINISH - START))
+ [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
error "$FINISH - $START >= $TIMEOUT / 2"
-
+ sleep $((TIMEOUT / 2 - PROCESS))
reset_enospc
}
run_test 27v "skip object creation on slow OST ================="
run_test 27w "check lfs setstripe -c -s -i options ============="
test_27x() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
[ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
OFFSET=$(($OSTCOUNT - 1))
OSTIDX=0
- local OST=$(lfs osts | awk '/'${OSTIDX}': / { print $2 }' | sed -e 's/_UUID$//')
+ local OST=$(ostname_from_index $OSTIDX)
mkdir -p $DIR/$tdir
$SETSTRIPE $DIR/$tdir -c 1 # 1 stripe per file
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
local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS $FSNAME-OST0000)
local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
[ $fcount -eq 0 ] && skip "not enough space on OST0" && return
[ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT
- MDS_OSCS=`do_facet mds lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
+ MDS_OSCS=`do_facet $SINGLEMDS lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
OFFSET=$(($OSTCOUNT-1))
OST=-1
for OSC in $MDS_OSCS; do
OST=`osc_to_ost $OSC`
} else {
echo $OSC "is Deactivate:"
- do_facet mds lctl --device %$OSC deactivate
+ do_facet $SINGLEMDS lctl --device %$OSC deactivate
} fi
done
- OSTIDX=$(lfs osts | grep ${OST} | awk '{print $1}' | sed -e 's/://')
+ OSTIDX=$(index_from_ostuuid $OST)
mkdir -p $DIR/$tdir
$SETSTRIPE $DIR/$tdir -c 1 # 1 stripe / file
- do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 1
+ do_facet ost$((OSTIDX+1)) lctl set_param -n obdfilter.$OST.degraded 1
sleep_maxage
createmany -o $DIR/$tdir/$tfile $fcount
- do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 0
+ do_facet ost$((OSTIDX+1)) lctl set_param -n obdfilter.$OST.degraded 0
for i in `seq 0 $OFFSET`; do
[ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "$OSTIDX"` ] || \
for OSC in $MDS_OSCS; do
[ `osc_to_ost $OSC` != $OST ] && {
echo $OSC "is activate"
- do_facet mds lctl --device %$OSC activate
+ do_facet $SINGLEMDS lctl --device %$OSC activate
}
done
}
[ "$FSTYPE" != "ldiskfs" ] && skip "can not check trusted.fid FSTYPE=$FSTYPE" && return 0
# check the trusted.fid attribute of the OST objects of the file
- for (( i=0, j=19; i < ${lmm[8]}; i++, j+=4 )); do
+ for (( i=0, j=21; i < ${lmm[8]}; i++, j+=4 )); do
local obdidx=${lmm[$j]}
local devnum=$((obdidx + 1))
local objid=${lmm[$((j+1))]}
local group=${lmm[$((j+3))]}
local dev=$(ostdevname $devnum)
- local dir=${MOUNT%/*}/ost$devnum
+ local dir=$(facet_mntpt ost$devnum)
+
+ stop ost$devnum
do_facet ost$devnum mount -t $FSTYPE $dev $dir $OST_MOUNT_OPTS ||
{ error "mounting $dev as $FSTYPE failed"; return 3; }
[ $stripe -eq $i ] || { error "stripe mismatch"; return 6; }
echo -e "\t\tost $obdidx, objid $objid, group $group"
- do_facet ost$devnum umount -d $dev
+ do_facet ost$devnum umount -d $dir
+ start ost$devnum $dev $OST_MOUNT_OPTS
done
}
test_27z() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
mkdir -p $DIR/$tdir
$SETSTRIPE $DIR/$tdir/$tfile-1 -c 1 -o 0 -s 1m ||
- { error "setstripe -c -1 failed"; return 1; }
+ { error "setstripe -c 1 failed"; return 1; }
dd if=/dev/zero of=$DIR/$tdir/$tfile-1 bs=1M count=1 ||
{ error "dd 1 mb failed"; return 2; }
$SETSTRIPE $DIR/$tdir/$tfile-2 -c -1 -o $(($OSTCOUNT - 1)) -s 1m ||
- { error "setstripe -c 1 failed"; return 3; }
+ { error "setstripe -c -1 failed"; return 3; }
dd if=/dev/zero of=$DIR/$tdir/$tfile-2 bs=1M count=$OSTCOUNT ||
{ error "dd $OSTCOUNT mb failed"; return 4; }
sync
}
run_test 27z "check SEQ/OID on the MDT and OST filesystems"
+test_27A() { # b=19102
+ local restore_size=`$GETSTRIPE -s $MOUNT`
+ local restore_count=`$GETSTRIPE -c $MOUNT`
+ local restore_offset=`$GETSTRIPE -o $MOUNT`
+ $SETSTRIPE -c 0 -o -1 -s 0 $MOUNT
+ local default_size=`$GETSTRIPE -s $MOUNT`
+ local default_count=`$GETSTRIPE -c $MOUNT`
+ local default_offset=`$GETSTRIPE -o $MOUNT`
+ local dsize=$((1024 * 1024))
+ [ $default_size -eq $dsize ] || error "stripe size $default_size != $dsize"
+ [ $default_count -eq 1 ] || error "stripe count $default_count != 1"
+ [ $default_offset -eq -1 ] || error "stripe offset $default_offset != -1"
+ $SETSTRIPE -c $restore_count -o $restore_offset -s $restore_size $MOUNT
+}
+run_test 27A "check filesystem-wide default LOV EA values"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
}
run_test 29 "IT_GETATTR regression ============================"
-test_30() {
+test_30a() { # was test_30
cp `which ls` $DIR || cp /bin/ls $DIR
- $DIR/ls /
+ $DIR/ls / || error
rm $DIR/ls
}
-run_test 30 "run binary from Lustre (execve) ==================="
+run_test 30a "execute binary from Lustre (execve) =============="
+
+test_30b() {
+ cp `which ls` $DIR || cp /bin/ls $DIR
+ chmod go+rx $DIR/ls
+ $RUNAS $DIR/ls / || error
+ rm $DIR/ls
+}
+run_test 30b "execute binary from Lustre as non-root ==========="
+
+test_30c() { # b=22376
+ cp `which ls` $DIR || cp /bin/ls $DIR
+ chmod a-rw $DIR/ls
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ $RUNAS $DIR/ls / || error
+ rm -f $DIR/ls
+}
+run_test 30c "execute binary from Lustre without read perms ===="
test_31a() {
$OPENUNLINK $DIR/f31 $DIR/f31 || error
local write_bytes
local all_zeros
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
all_zeros=:
rm -fr $DIR/d33
mkdir -p $DIR/d33
for ostnum in $(seq $OSTCOUNT); do
# test-framework's OST numbering is one-based, while Lustre's
# is zero-based
- ostname=$(printf "lustre-OST%.4d" $((ostnum - 1)))
+ ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1)))
# Parsing llobdstat's output sucks; we could grep the /proc
# path, but that's likely to not be as portable as using the
# llobdstat utility. So we parse lctl output instead.
# Total up write_bytes after writing. We'd better find non-zeros.
for ostnum in $(seq $OSTCOUNT); do
- ostname=$(printf "lustre-OST%.4d" $((ostnum - 1)))
+ ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1)))
write_bytes=$(do_facet ost$ostnum lctl get_param -n \
obdfilter/$ostname/stats |
awk '/^write_bytes/ {print $7}' )
if $all_zeros
then
for ostnum in $(seq $OSTCOUNT); do
- ostname=$(printf "lustre-OST%.4d" $((ostnum - 1)))
+ ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1)))
echo "Check that write_bytes is present in obdfilter/*/stats:"
do_facet ost$ostnum lctl get_param -n \
obdfilter/$ostname/stats
test_36g() {
remote_ost_nodsh && skip "remote OST with nodsh" && return
+ local fmd_max_age
+ local fmd_before
+ local fmd_after
mkdir -p $DIR/$tdir
- export FMD_MAX_AGE=`do_facet ost1 lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | head -n 1`
- FMD_BEFORE="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`"
+ fmd_max_age=$(do_facet ost1 \
+ "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \
+ head -n 1")
+
+ fmd_before=$(do_facet ost1 \
+ "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo")
touch $DIR/$tdir/$tfile
- sleep $((FMD_MAX_AGE + 12))
- FMD_AFTER="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`"
- [ "$FMD_AFTER" -gt "$FMD_BEFORE" ] && \
- echo "AFTER : $FMD_AFTER > BEFORE $FMD_BEFORE" && \
+ sleep $((fmd_max_age + 12))
+ fmd_after=$(do_facet ost1 \
+ "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo")
+
+ echo "fmd_before: $fmd_before"
+ echo "fmd_after: $fmd_after"
+ [ "$fmd_after" -gt "$fmd_before" ] && \
+ echo "AFTER: $fmd_after > BEFORE: $fmd_before" && \
error "fmd didn't expire after ping" || true
}
run_test 36g "filter mod data cache expiry ====================="
$OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
echo "mtime"
- ls -l $DIR/$tfile $DIR/${tfile}2
+ ls -l --full-time $DIR/$tfile $DIR/${tfile}2
echo "atime"
- ls -lu $DIR/$tfile $DIR/${tfile}2
+ ls -lu --full-time $DIR/$tfile $DIR/${tfile}2
echo "ctime"
- ls -lc $DIR/$tfile $DIR/${tfile}2
+ ls -lc --full-time $DIR/$tfile $DIR/${tfile}2
error "O_TRUNC didn't change timestamps"
fi
}
local mtime1=`stat -c %Y $DIR1/$tfile`
touch -m -d @$TEST_39_MTIME $DIR1/$tfile
-
+
for (( i=0; i < 2; i++ )) ; do
local mtime2=`stat -c %Y $DIR1/$tfile`
[ $mtime2 = $TEST_39_MTIME ] || \
sleep 2
chmod o+r $DIR1/$tfile
-
+
for (( i=0; i < 2; i++ )) ; do
local mtime2=`stat -c %Y $DIR1/$tfile`
[ "$mtime1" = "$mtime2" ] || \
kill -USR1 $multipid
wait $multipid || error "multiop close failed"
-
+
for (( i=0; i < 2; i++ )) ; do
local mtime2=`stat -c %Y $DIR1/$tfile`
}
run_test 39k "write, utime, close, stat ========================"
+# this should be set to future
+TEST_39_ATIME=`date -d "1 year" +%s`
+
+test_39l() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local atime_diff=$(do_facet $SINGLEMDS lctl get_param -n mdd.*.atime_diff)
+
+ mkdir -p $DIR/$tdir
+
+ # test setting directory atime to future
+ touch -a -d @$TEST_39_ATIME $DIR/$tdir
+ local atime=$(stat -c %X $DIR/$tdir)
+ [ "$atime" = $TEST_39_ATIME ] || \
+ error "atime is not set to future: $atime, should be $TEST_39_ATIME"
+
+ # test setting directory atime from future to now
+ local d1=$(date +%s)
+ ls $DIR/$tdir
+ local d2=$(date +%s)
+
+ cancel_lru_locks mdc
+ atime=$(stat -c %X $DIR/$tdir)
+ [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \
+ error "atime is not updated from future: $atime, should be $d1<atime<$d2"
+
+ do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=2
+ sleep 3
+
+ # test setting directory atime when now > dir atime + atime_diff
+ d1=$(date +%s)
+ ls $DIR/$tdir
+ d2=$(date +%s)
+ cancel_lru_locks mdc
+ atime=$(stat -c %X $DIR/$tdir)
+ [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \
+ error "atime is not updated : $atime, should be $d2"
+
+ do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=60
+ sleep 3
+
+ # test not setting directory atime when now < dir atime + atime_diff
+ ls $DIR/$tdir
+ cancel_lru_locks mdc
+ atime=$(stat -c %X $DIR/$tdir)
+ [ "$atime" -ge "$d1" -a "$atime" -le "$d2" ] || \
+ error "atime is updated to $atime, should remain $d1<atime<$d2"
+
+ do_facet $SINGLEMDS lctl set_param -n mdd.*.atime_diff=$atime_diff
+}
+run_test 39l "directory atime update ==========================="
+
+test_39m() {
+ touch $DIR1/$tfile
+ sleep 2
+ local far_past_mtime=$(date -d "May 29 1953" +%s)
+ local far_past_atime=$(date -d "Dec 17 1903" +%s)
+
+ touch -m -d @$far_past_mtime $DIR1/$tfile
+ touch -a -d @$far_past_atime $DIR1/$tfile
+
+ for (( i=0; i < 2; i++ )) ; do
+ local timestamps=$(stat -c "%X %Y" $DIR1/$tfile)
+ [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \
+ error "atime or mtime set incorrectly"
+
+ cancel_lru_locks osc
+ if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi
+ done
+}
+run_test 39m "test atime and mtime before 1970"
+
test_40() {
dd if=/dev/zero of=$DIR/f40 bs=4096 count=1
$RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error
# ensure that all stripes have some grant before we test client-side cache
setup_test42() {
- [ "$SETUP_TEST42" ] && return
for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
dd if=/dev/zero of=$i bs=4k count=1
rm $i
done
- SETUP_TEST42=DONE
}
# Tests 42* verify that our behaviour is correct WRT caching, file closure,
}
run_test 42d "test complete truncate of file with cached dirty data"
-page_size() {
- getconf PAGE_SIZE
-}
-
test_42e() { # bug22074
local TDIR=$DIR/${tdir}e
local pagesz=$(page_size)
cp -p `which multiop` $DIR/d43/multiop || cp -p multiop $DIR/d43/multiop
MULTIOP_PROG=$DIR/d43/multiop multiop_bg_pause $TMP/test43.junk O_c || return 1
MULTIOP_PID=$!
- truncate $DIR/d43/multiop 0 && error "expected error, got success"
+ $TRUNCATE $DIR/d43/multiop 0 && error "expected error, got success"
kill -USR1 $MULTIOP_PID || return 2
wait $MULTIOP_PID || return 3
rm $TMP/test43.junk
}
run_test 51a "special situations: split htree with empty entry =="
-#export NUMTEST=70000
-# FIXME: I select a relatively small number to do basic test.
-# large number may give panic(). debugging on this is going on.
-export NUMTEST=70
+export NUMTEST=70000
test_51b() {
NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
[ $NUMFREE -lt 21000 ] && \
skip "not enough free inodes ($NUMFREE)" && \
return
- check_kernel_version 40 || NUMTEST=31000
[ $NUMFREE -lt $NUMTEST ] && NUMTEST=$(($NUMFREE - 50))
mkdir -p $DIR/d51b
}
run_test 51b "mkdir .../t-0 --- .../t-$NUMTEST ===================="
+test_51ba() { # LU-993
+ local BASE=$DIR/d51b
+ # unlink all but 100 subdirectories, then check it still works
+ local LEFT=100
+ local DELETE=$((NUMTEST - LEFT))
+
+ ! [ -d "${BASE}/t-$DELETE" ] && skip "test_51b() not run" && return 0
+
+ # for ldiskfs the nlink count should be 1, but this is OSD specific
+ # and so this is listed for informational purposes only
+ log "nlink before: $(stat -c %h $BASE)"
+ unlinkmany -d $BASE/t- $DELETE ||
+ error "unlink of first $DELETE subdirs failed"
+
+ log "nlink between: $(stat -c %h $BASE)"
+ local FOUND=$(ls -l ${BASE} | wc -l)
+ FOUND=$((FOUND - 1)) # trim the first line of ls output
+ [ $FOUND -ne $LEFT ] &&
+ error "can't find subdirs: found only $FOUND/$LEFT"
+
+ unlinkmany -d $BASE/t- $DELETE $LEFT ||
+ error "unlink of second $LEFT subdirs failed"
+ log "nlink after: $(stat -c %h $BASE)"
+}
+run_test 51ba "rmdir .../t-0 --- .../t-$NUMTEST"
+
test_51bb() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
}
run_test 54e "console/tty device works in lustre ======================"
-test_55() {
- rm -rf $DIR/d55
- mkdir $DIR/d55
- client_only && skip "Not a server" && return
- mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting"
- touch $DIR/d55/foo
- $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1"
- $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2"
- echo "check for $EXT2_DEV. Please wait..."
- rm -rf $DIR/d55/*
- $UMOUNT $DIR/d55 || error "unmounting"
-}
-run_test 55 "check iopen_connect_dentry() ======================"
+#The test_55 used to be iopen test and it was removed by bz#24037.
+#run_test 55 "check iopen_connect_dentry() ======================"
test_56a() { # was test_56
rm -rf $DIR/d56
[ "$OSTCOUNT" -lt 2 ] && \
skip_env "skipping other lfs getstripe --obd test" && return
OSTIDX=1
- OBDUUID=$(lfs osts | grep ${OSTIDX}": " | awk '{print $2}')
+ OBDUUID=$(ostuuid_from_index $OSTIDX)
FILENUM=`$GETSTRIPE -ir $DIR/d56 | grep -x $OSTIDX | wc -l`
FOUND=`$GETSTRIPE -r --obd $OBDUUID $DIR/d56 | grep obdidx | wc -l`
[ $FOUND -eq $FILENUM ] || \
test_56i() {
tdir=${tdir}i
mkdir -p $DIR/$tdir
- UUID=`$LFS osts | awk '/0: / { print $2 }'`
- OUT="`$LFIND -ost $UUID $DIR/$tdir`"
- [ "$OUT" ] && error "$LFIND returned directory '$OUT'" || true
+ UUID=$(ostuuid_from_index 0 $DIR/$tdir)
+ OUT=$($LFIND -obd $UUID $DIR/$tdir)
+ [ "$OUT" ] && error "$LFIND -obd returned directory '$OUT'" || true
}
-run_test 56i "check 'lfs find -ost UUID' skips directories ======="
+run_test 56i "check 'lfs find -obd UUID' skips directories ======="
test_56j() {
setup_56_special $NUMFILES $NUMDIRS
run_test 56n "check lfs find -type l ============================="
test_56o() {
- setup_56 $NUMFILES $NUMDIRS
TDIR=$DIR/${tdir}g
+ rm -rf $TDIR
+ setup_56 $NUMFILES $NUMDIRS
utime $TDIR/file1 > /dev/null || error "utime (1)"
utime $TDIR/file2 > /dev/null || error "utime (2)"
utime $TDIR/dir1 > /dev/null || error "utime (3)"
utime $TDIR/dir2 > /dev/null || error "utime (4)"
utime $TDIR/dir1/file1 > /dev/null || error "utime (5)"
+ dd if=/dev/zero count=1 >> $TDIR/dir1/file1 && sync
+
+ EXPECTED=4
+ NUMS=`$LFIND -mtime +0 $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find -mtime +0 $TDIR wrong: found $NUMS, expected $EXPECTED"
- EXPECTED=5
- NUMS=`$LFIND -mtime +1 $TDIR | wc -l`
+ EXPECTED=12
+ NUMS=`$LFIND -mtime 0 $TDIR | wc -l`
[ $NUMS -eq $EXPECTED ] || \
- error "lfs find -mtime $TDIR wrong: found $NUMS, expected $EXPECTED"
+ error "lfs find -mtime 0 $TDIR wrong: found $NUMS, expected $EXPECTED"
+
}
run_test 56o "check lfs find -mtime for old files =========================="
setup_56 $NUMFILES $NUMDIRS
- chgrp $RUNAS_ID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed"
+ chgrp $RUNAS_GID $TDIR/file* || error "chown $DIR/${tdir}g/file$i failed"
EXPECTED=$NUMFILES
- NUMS="`$LFIND -gid $RUNAS_ID $TDIR | wc -l`"
+ NUMS="`$LFIND -gid $RUNAS_GID $TDIR | wc -l`"
[ $NUMS -eq $EXPECTED ] || \
error "lfs find -gid $TDIR wrong: found $NUMS, expected $EXPECTED"
EXPECTED=$(( ($NUMFILES+1) * $NUMDIRS + 1))
- NUMS="`$LFIND ! -gid $RUNAS_ID $TDIR | wc -l`"
+ NUMS="`$LFIND ! -gid $RUNAS_GID $TDIR | wc -l`"
[ $NUMS -eq $EXPECTED ] || \
error "lfs find ! -gid $TDIR wrong: found $NUMS, expected $EXPECTED"
}
run_test 56q "check lfs find -gid and ! -gid ==============================="
+test_56r() {
+ setup_56 $NUMFILES $NUMDIRS
+ TDIR=$DIR/${tdir}g
+
+ EXPECTED=12
+ NUMS=`$LFIND -size 0 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR -size 0 wrong: found $NUMS, expected $EXPECTED"
+ EXPECTED=0
+ NUMS=`$LFIND ! -size 0 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR ! -size 0 wrong: found $NUMS, expected $EXPECTED"
+ echo "test" > $TDIR/56r && sync
+ echo "test2" > $TDIR/56r2 && sync
+ EXPECTED=1
+ NUMS=`$LFIND -size 5 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR -size 5 wrong: found $NUMS, expected $EXPECTED"
+ EXPECTED=1
+ NUMS=`$LFIND -size +5 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR -size +5 wrong: found $NUMS, expected $EXPECTED"
+ EXPECTED=2
+ NUMS=`$LFIND -size +0 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR -size +0 wrong: found $NUMS, expected $EXPECTED"
+ EXPECTED=2
+ NUMS=`$LFIND ! -size -5 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR ! -size -5 wrong: found $NUMS, expected $EXPECTED"
+ EXPECTED=12
+ NUMS=`$LFIND -size -5 -t f $TDIR | wc -l`
+ [ $NUMS -eq $EXPECTED ] || \
+ error "lfs find $TDIR -size -5 wrong: found $NUMS, expected $EXPECTED"
+}
+
+run_test 56r "check lfs find -size works =========================="
+
+test_56v() {
+ local FIND_MDT_IDX=0
+
+ TDIR=${tdir}g
+ rm -rf $TDIR
+ setup_56 $NUMFILES $NUMDIRS
+
+ UUID=$(mdtuuid_from_index $FIND_MDT_IDX $DIR/$TDIR)
+ for file in $($LFIND -mdt $UUID $DIR/$TDIR); do
+ file_mdt_idx=$($GETSTRIPE -M $file)
+ [ $file_mdt_idx -eq $FIND_MDT_IDX ] ||
+ error "wrong lfind -m not match getstripe -M"
+ done
+}
+run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' ======="
+
test_57a() {
# note test will not do anything if MDS is not local
remote_mds_nodsh && skip "remote MDS with nodsh" && return
run_test 57a "verify MDS filesystem created with large inodes =="
test_57b() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
local dir=$DIR/d57b
local FILECOUNT=100
sync
sleep 1
df $dir #make sure we get new statfs data
- local MDSFREE=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree)
+ local MDSFREE=$(do_facet $mymds \
+ lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
local MDCFREE=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
echo "opening files to create objects/EAs"
local FILE
sleep 1 #make sure we get new statfs data
df $dir
- local MDSFREE2=$(do_facet $mymds lctl get_param -n osd.*MDT000$((num -1)).kbytesfree)
+ local MDSFREE2=$(do_facet $mymds \
+ lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree)
local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree)
if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then
if [ "$MDSFREE" != "$MDSFREE2" ]; then
TEST60_HEAD="test_60 run $RANDOM"
test_60a() {
+ remote_mgs_nodsh && skip "remote MGS with nodsh" && return
[ ! -f run-llog.sh ] && skip_env "missing subtest run-llog.sh" && return
log "$TEST60_HEAD - from kernel mode"
- sh run-llog.sh
+ do_facet mgs sh run-llog.sh
}
run_test 60a "llog sanity tests run from kernel module =========="
mkdir -p $DIR/d65
if [ $STRIPECOUNT -le 0 ]; then
sc=1
- elif [ $STRIPECOUNT -gt 160 ]; then
-#LOV_MAX_STRIPE_COUNT is 160
- [ $OSTCOUNT -gt 160 ] && sc=160 || sc=$(($OSTCOUNT - 1))
+ elif [ $STRIPECOUNT -gt 2000 ]; then
+#LOV_MAX_STRIPE_COUNT is 2000
+ [ $OSTCOUNT -gt 2000 ] && sc=2000 || sc=$(($OSTCOUNT - 1))
else
sc=$(($STRIPECOUNT - 1))
fi
STRIPE_INDEX=`do_facet $SINGLEMDS lctl get_param -n lov.*md*.target_obd |
grep $STRIPE_OST | awk -F: '{print $1}' | head -n 1`
- [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue
+ [ -f $DIR/$tdir/${STRIPE_INDEX} ] && continue
echo "$SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1"
do_facet client $SETSTRIPE $DIR/$tdir/${STRIPE_INDEX} -i ${STRIPE_INDEX} -c 1
RC=$?
if [ ! -z "$LLITELOOPLOAD" ]; then
rmmod llite_lloop
unset LLITELOOPLOAD
- fi
+ fi
rm -f $DIR/f68*
}
# test case for lloop driver, basic function
test_68a() {
[ "$UID" != 0 ] && skip_env "must run as root" && return
+ llite_lloop_enabled || \
+ { skip_env "llite_lloop module disabled" && return; }
trap cleanup_68 EXIT
$DIRECTIO write ${f}.2 0 1 || error "directio write error"
do_facet ost1 lctl set_param fail_loc=0x217
- truncate $f 1 # vmtruncate() will ignore truncate() error.
+ $TRUNCATE $f 1 # vmtruncate() will ignore truncate() error.
$DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
do_facet ost1 lctl set_param fail_loc=0
}
run_test 71 "Running dbench on lustre (don't segment fault) ===="
-test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly
+test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly
check_kernel_version 43 || return 0
[ "$RUNAS_ID" = "$UID" ] && skip_env "RUNAS_ID = UID = $UID -- skipping" && return
# Check that testing environment is properly set up. Skip if not
- FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || {
+ FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_GID $RUNAS || {
skip_env "User $RUNAS_ID does not exist - skipping"
return 0
}
true
rm -f $DIR/f72
}
-run_test 72 "Test that remove suid works properly (bug5695) ===="
+run_test 72a "Test that remove suid works properly (bug5695) ===="
+
+test_72b() { # bug 24226 -- keep mode setting when size is not changing
+ local perm
+
+ [ "$RUNAS_ID" = "$UID" ] && \
+ skip_env "RUNAS_ID = UID = $UID -- skipping" && return
+ [ "$RUNAS_ID" -eq 0 ] && \
+ skip_env "RUNAS_ID = 0 -- skipping" && return
+
+ # Check that testing environment is properly set up. Skip if not
+ FAIL_ON_ERROR=false check_runas_id_ret $RUNAS_ID $RUNAS_ID $RUNAS || {
+ skip_env "User $RUNAS_ID does not exist - skipping"
+ return 0
+ }
+ touch $DIR/${tfile}-f{g,u}
+ mkdir $DIR/${tfile}-d{g,u}
+ chmod 770 $DIR/${tfile}-{f,d}{g,u}
+ chmod g+s $DIR/${tfile}-{f,d}g
+ chmod u+s $DIR/${tfile}-{f,d}u
+ for perm in 777 2777 4777; do
+ $RUNAS chmod $perm $DIR/${tfile}-fg && error "S/gid file allowed improper chmod to $perm"
+ $RUNAS chmod $perm $DIR/${tfile}-fu && error "S/uid file allowed improper chmod to $perm"
+ $RUNAS chmod $perm $DIR/${tfile}-dg && error "S/gid dir allowed improper chmod to $perm"
+ $RUNAS chmod $perm $DIR/${tfile}-du && error "S/uid dir allowed improper chmod to $perm"
+ done
+ true
+}
+run_test 72b "Test that we keep mode setting if without file data changed (bug 24226)"
# bug 3462 - multiple simultaneous MDC requests
test_73() {
}
run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
+test_74c() {
+#define OBD_FAIL_LDLM_NEW_LOCK
+ lctl set_param fail_loc=0x80000319
+ touch $DIR/$tfile && error "Touch successful"
+ true
+}
+run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
+
num_inodes() {
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
+ local SLAB_SETTINGS=`get_inode_slab_tunables`
+ local CPUS=`getconf _NPROCESSORS_ONLN`
+ # 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"
AFTER_INODES=`num_inodes`
echo "after inodes: $AFTER_INODES"
local wait=0
- while [ $AFTER_INODES -gt $BEFORE_INODES ]; do
+ while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do
sleep 2
AFTER_INODES=`num_inodes`
wait=$((wait+2))
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 ===="
return 0
}
-export ORIG_CSUM_TYPE=""
+export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type |
+ sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
CKSUM_TYPES=${CKSUM_TYPES:-"crc32 adler"}
+[ "$ORIG_CSUM_TYPE" = "crc32c" ] && CKSUM_TYPES="$CKSUM_TYPES crc32c"
set_checksum_type()
{
- [ "$ORIG_CSUM_TYPE" ] || \
- ORIG_CSUM_TYPE=`lctl get_param -n osc/*osc-[^mM]*/checksum_type |
- sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`
lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
log "set checksum type to $1"
return 0
error "elapsed for 1M@1T = $DIFF"
fi
true
- rm -f $DIR/$tfile
+ rm -f $DIR/$tfile
}
run_test 80 "Page eviction is equally fast at high offsets too ===="
+test_81a() { # LU-456
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
+ # MUST OR with the OBD_FAIL_ONCE (0x80000000)
+ do_facet ost0 lctl set_param fail_loc=0x80000228
+
+ # write should trigger a retry and success
+ $SETSTRIPE -i 0 -c 1 $DIR/$tfile
+ multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
+ RC=$?
+ if [ $RC -ne 0 ] ; then
+ error "write should success, but failed for $RC"
+ fi
+}
+run_test 81a "OST should retry write when get -ENOSPC ==============="
+
+test_81b() { # LU-456
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
+ # Don't OR with the OBD_FAIL_ONCE (0x80000000)
+ do_facet ost0 lctl set_param fail_loc=0x228
+
+ # write should retry several times and return -ENOSPC finally
+ $SETSTRIPE -i 0 -c 1 $DIR/$tfile
+ multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
+ RC=$?
+ ENOSPC=28
+ if [ $RC -ne $ENOSPC ] ; then
+ error "dd should fail for -ENOSPC, but succeed."
+ fi
+}
+run_test 81b "OST should return -ENOSPC when retry still fails ======="
+
+
test_99a() {
[ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && \
return
}
run_test 101 "check read-ahead for random reads ================"
-export SETUP_TEST101=no
-setup_test101() {
- [ "$SETUP_TEST101" = "yes" ] && return
+setup_test101b() {
mkdir -p $DIR/$tdir
STRIPE_SIZE=1048576
STRIPE_COUNT=$OSTCOUNT
STRIPE_OFFSET=0
- trap cleanup_test101 EXIT
+ trap cleanup_test101b EXIT
# prepare the read-ahead file
$SETSTRIPE $DIR/$tfile -s $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT
dd if=/dev/zero of=$DIR/$tfile bs=1024k count=100 2> /dev/null
- SETUP_TEST101=yes
}
-cleanup_test101() {
- [ "$SETUP_TEST101" = "yes" ] || return
+cleanup_test101b() {
trap 0
rm -rf $DIR/$tdir
- rm -f $DIR/$tfile
- SETUP_TEST101=no
+ rm -f $DIR/$tfile
}
calc_total() {
local FILE_LENGTH=$((STRIPE_SIZE*100))
local ITERATION=$((FILE_LENGTH/STRIDE_SIZE))
# prepare the read-ahead file
- setup_test101
+ setup_test101b
cancel_lru_locks osc
for BIDX in 2 4 8 16 32 64 128 256
do
cancel_lru_locks osc
ra_check_101 $BSIZE
done
- cleanup_test101
+ cleanup_test101b
true
}
run_test 101b "check stride-io mode read-ahead ================="
}
run_test 101d "file read with and without read-ahead enabled ================="
-export SETUP_TEST102=no
setup_test102() {
- [ "$SETUP_TEST102" = "yes" ] && return
mkdir -p $DIR/$tdir
chown $RUNAS_ID $DIR/$tdir
STRIPE_SIZE=65536
cd $DIR
$1 $TAR cf $TMP/f102.tar $tdir --xattrs
- SETUP_TEST102=yes
}
cleanup_test102() {
trap 0
- [ "$SETUP_TEST102" = "yes" ] || return 0
rm -f $TMP/f102.tar
- SETUP_TEST102=no
+ rm -rf $DIR/d0.sanity/d102
}
test_102a() {
echo "get/set/list trusted.lov xattr ..."
[ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return
local testfile=$DIR/$tfile
- $SETSTRIPE -s 65536 -i 1 -c 2 $testfile || error "setstripe failed"
+ $SETSTRIPE -s 65536 -i 1 -c $OSTCOUNT $testfile ||
+ error "setstripe failed"
+ local STRIPECOUNT=$(lfs getstripe -c $testfile) ||
+ error "getstripe failed"
getfattr -d -m "^trusted" $testfile 2> /dev/null | \
grep "trusted.lov" || error "can't get trusted.lov from $testfile"
local stripe_size=`grep "size" $tmp_file| awk '{print $2}'`
local stripe_count=`grep "count" $tmp_file| awk '{print $2}'`
[ "$stripe_size" -eq 65536 ] || error "stripe size $stripe_size != 65536"
- [ "$stripe_count" -eq 2 ] || error "stripe count $stripe_count != 2"
+ [ "$stripe_count" -eq $STRIPECOUNT ] ||
+ error "stripe count $stripe_count != $STRIPECOUNT"
rm -f $DIR/$tfile
}
run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
mkdir -p $DIR/$tdir
chown $RUNAS_ID $DIR/$tdir
local testfile=$DIR/$tdir/$tfile
- $RUNAS $SETSTRIPE -s 65536 -i 1 -c 2 $testfile||error "setstripe failed"
+ $RUNAS $SETSTRIPE -s 65536 -i 1 -c $OSTCOUNT $testfile ||
+ error "setstripe failed"
+ local STRIPECOUNT=$($RUNAS lfs getstripe -c $testfile) ||
+ error "getstripe failed"
$RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
grep "lustre.lov" || error "can't get lustre.lov from $testfile"
local stripe_size=`grep "size" $tmp_file| awk '{print $2}'`
local stripe_count=`grep "count" $tmp_file| awk '{print $2}'`
[ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
- [ $stripe_count -eq 2 ] || error "stripe count $stripe_count != 2"
+ [ $stripe_count -eq $STRIPECOUNT ] ||
+ error "stripe count $stripe_count != $STRIPECOUNT"
}
run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
}
run_test 102f "tar copy files, not keep osts ==========="
-test_102h() { # bug 15777
+grow_xattr() {
+ local xsize=${1:-1024} # in bytes
+ local file=$DIR/$tfile
+
[ -z $(lctl get_param -n mdc.*.connect_flags | grep xattr) ] &&
- skip "must have user_xattr" && return
+ skip "must have user_xattr" && return 0
[ -z "$(which setfattr 2>/dev/null)" ] &&
- skip_env "could not find setfattr" && return
+ skip_env "could not find setfattr" && return 0
+ [ -z "$(which getfattr 2>/dev/null)" ] &&
+ skip_env "could not find getfattr" && return 0
- XBIG=trusted.big
- XSIZE=1024
- touch $DIR/$tfile
- VALUE=datadatadatadatadatadatadatadata
- while [ $(echo $VALUE | wc -c) -lt $XSIZE ]; do
- VALUE="$VALUE$VALUE"
- done
- log "save $XBIG on $DIR/$tfile"
- setfattr -n $XBIG -v "$VALUE" $DIR/$tfile ||
- error "saving $XBIG on $DIR/$tfile failed"
- ORIG=$(getfattr -n $XBIG $DIR/$tfile 2> /dev/null | grep $XBIG)
- OSIZE=$(echo $ORIG | wc -c)
- [ $OSIZE -lt $XSIZE ] && error "set $XBIG too small ($OSIZE < $XSIZE)"
-
- XSML=trusted.sml
- log "save $XSML on $DIR/$tfile"
- setfattr -n $XSML -v val $DIR/$tfile ||
- error "saving $XSML on $DIR/$tfile failed"
- NEW=$(getfattr -n $XBIG $DIR/$tfile 2> /dev/null | grep $XBIG)
- if [ "$NEW" != "$ORIG" ]; then
- log "orig: $ORIG"
- log "new: $NEW"
- error "$XBIG different after saving $XSML"
- fi
+ touch $file
+
+ local value="$(generate_string $xsize)"
+
+ local xbig=trusted.big
+ log "save $xbig on $file"
+ setfattr -n $xbig -v $value $file ||
+ error "saving $xbig on $file failed"
+
+ local orig=$(get_xattr_value $xbig $file)
+ [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig"
+
+ local xsml=trusted.sml
+ log "save $xsml on $file"
+ setfattr -n $xsml -v val $file || error "saving $xsml on $file failed"
+
+ local new=$(get_xattr_value $xbig $file)
+ [[ "$new" != "$orig" ]] && error "$xbig different after saving $xsml"
+
+ log "grow $xsml on $file"
+ setfattr -n $xsml -v "$value" $file ||
+ error "growing $xsml on $file failed"
+
+ new=$(get_xattr_value $xbig $file)
+ [[ "$new" != "$orig" ]] && error "$xbig different after growing $xsml"
+ log "$xbig still valid after growing $xsml"
- log "grow $XSML on $DIR/$tfile"
- setfattr -n $XSML -v "$VALUE" $DIR/$tfile ||
- error "growing $XSML on $DIR/$tfile failed"
- NEW=$(getfattr -n $XBIG $DIR/$tfile 2> /dev/null | grep $XBIG)
- if [ "$NEW" != "$ORIG" ]; then
- log "orig: $ORIG"
- log "new: $NEW"
- error "$XBIG different after growing $XSML"
- fi
- log "$XBIG still valid after growing $XSML"
rm -f $file
}
+
+test_102h() { # bug 15777
+ grow_xattr 1024
+}
run_test 102h "grow xattr from inside inode to external block"
+test_102ha() {
+ large_xattr_enabled || { skip "large_xattr disabled" && return; }
+ grow_xattr $(max_xattr_size)
+}
+run_test 102ha "grow xattr from inside inode to external inode"
+
test_102i() { # bug 17038
touch $DIR/$tfile
ln -s $DIR/$tfile $DIR/${tfile}link
local default_size=`$GETSTRIPE -s $test_kdir`
local default_count=`$GETSTRIPE -c $test_kdir`
local default_offset=`$GETSTRIPE -o $test_kdir`
- $SETSTRIPE -s 65536 -i 1 -c 2 $test_kdir || error 'dir setstripe failed'
+ $SETSTRIPE -s 65536 -i 1 -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`
lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
- OSC=`lctl get_param -n devices | awk '/-osc-/ {print $4}' | head -n 1`
+ OSC=`lctl dl |grep OST0000-osc-[^M] |awk '{print $4}'`
lctl --device %$OSC deactivate
lfs df || error "lfs df with deactivated OSC failed"
- lctl --device %$OSC recover
+ lctl --device %$OSC activate
+ # wait the osc back to normal
+ wait_osc_import_state client ost FULL
+
lfs df || error "lfs df with reactivated OSC failed"
rm -f $DIR/$tfile
}
}
run_test 105d "flock race (should not freeze) ========"
+test_105e() { # bug 22660 && 22040
+ [ -z "`mount | grep \"$DIR.*flock\" | grep -v noflock`" ] && \
+ skip "mount w/o flock enabled" && return
+ touch $DIR/$tfile
+ flocks_test 3 $DIR/$tfile
+}
+run_test 105e "Two conflicting flocks from same process ======="
+
test_106() { #bug 10921
mkdir -p $DIR/$tdir
$DIR/$tdir && error "exec $DIR/$tdir succeeded"
}
run_test 118k "bio alloc -ENOMEM and IO TERM handling ========="
+test_118l()
+{
+ # LU-646
+ mkdir -p $DIR/$tdir
+ multiop $DIR/$tdir Dy || error "fsync dir failed"
+ rm -rf $DIR/$tdir
+}
+run_test 118l "fsync dir ========="
+
[ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
test_119a() # bug 11737
LRU_SIZE=$(lctl get_param -n $PARAM)
if [ $LRU_SIZE -gt $(default_lru_size) ]; then
NSDIR=$(echo $PARAM | cut -d "." -f1-3)
+ log "NSDIR=$NSDIR"
log "NS=$(basename $NSDIR)"
break
fi
# for 10h. After that locks begin to be killed by client.
local MAX_HRS=10
local LIMIT=`lctl get_param -n $NSDIR.pool.limit`
+ log "LIMIT=$LIMIT"
# Make LVF so higher that sleeping for $SLEEP is enough to _start_
# killing locks. Some time was spent for creating locks. This means
local LRU_SIZE_B=$LRU_SIZE
log "LVF=$LVF"
local OLD_LVF=`lctl get_param -n $NSDIR.pool.lock_volume_factor`
+ log "OLD_LVF=$OLD_LVF"
lctl set_param -n $NSDIR.pool.lock_volume_factor $LVF
# Let's make sure that we really have some margin. Client checks
done
echo ""
lctl set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
- local LRU_SIZE_A=`lctl get_param -n $NSDIR/lru_size`
+ local LRU_SIZE_A=`lctl get_param -n $NSDIR.lru_size`
[ $LRU_SIZE_B -gt $LRU_SIZE_A ] || {
error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
}
run_test 126 "check that the fsgid provided by the client is taken into account"
-test_127() { # bug 15521
+test_127a() { # bug 15521
$SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
$LCTL set_param osc.*.stats=0
FSIZE=$((2048 * 1024))
[ "$read_bytes" != 0 ] || error "no read done"
[ "$write_bytes" != 0 ] || error "no write done"
}
-run_test 127 "verify the client stats are sane"
+run_test 127a "verify the client stats are sane"
+
+test_127b() { # bug LU-333
+ $LCTL set_param llite.*.stats=0
+ FSIZE=65536 # sized fixed to match PAGE_SIZE for most clients
+ # perform 2 reads and writes so MAX is different from SUM.
+ dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
+ dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
+ cancel_lru_locks osc
+ dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1
+ dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1
+
+ $LCTL get_param llite.*.stats | grep samples > $TMP/${tfile}.tmp
+ while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
+ echo "got $COUNT $NAME"
+ eval $NAME=$COUNT || error "Wrong proc format"
+
+ case $NAME in
+ read_bytes)
+ [ $COUNT -ne 2 ] && error "count is not 2: $COUNT"
+ [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN"
+ [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX"
+ [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM"
+ ;;
+ write_bytes)
+ [ $COUNT -ne 2 ] && error "count is not 2: $COUNT"
+ [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN"
+ [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX"
+ [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM"
+ ;;
+ *) ;;
+ esac
+ done < $TMP/${tfile}.tmp
+
+ #check that we actually got some stats
+ [ "$read_bytes" ] || error "Missing read_bytes stats"
+ [ "$write_bytes" ] || error "Missing write_bytes stats"
+ [ "$read_bytes" != 0 ] || error "no read done"
+ [ "$write_bytes" != 0 ] || error "no write done"
+}
+run_test 127b "verify the llite client stats are sane"
test_128() { # bug 15212
touch $DIR/$tfile
run_test 128 "interactive lfs for 2 consecutive find's"
set_dir_limits () {
- local mntdev
- local node
+ local mntdev
+ local canondev
+ local node
local LDPROC=/proc/fs/ldiskfs
- for node in $(mdts_nodes); do
- devs=$(do_node $node "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')
- for dev in $devs; do
- mntdev=$(do_node $node "lctl get_param -n osd*.$dev.mntdev")
- do_node $node "echo $1 >$LDPROC/\\\$(basename $mntdev)/max_dir_size"
- done
+ for facet in $(get_facets MDS); 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"
done
}
test_129() {
- [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return 0
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
- EFBIG=27
- MAX=16384
+ EFBIG=27
+ MAX=16384
- set_dir_limits $MAX
+ set_dir_limits $MAX
- mkdir -p $DIR/$tdir
+ mkdir -p $DIR/$tdir
- I=0
- J=0
- while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
- multiop $DIR/$tdir/$J Oc
- rc=$?
- if [ $rc -eq $EFBIG ]; then
- set_dir_limits 0
- echo "return code $rc received as expected"
- return 0
- elif [ $rc -ne 0 ]; then
- set_dir_limits 0
- error_exit "return code $rc received instead of expected $EFBIG"
- fi
- J=$((J+1))
- I=$(stat -c%s "$DIR/$tdir")
- done
+ I=0
+ J=0
+ while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
+ multiop $DIR/$tdir/$J Oc
+ rc=$?
+ if [ $rc -eq $EFBIG ]; then
+ set_dir_limits 0
+ echo "return code $rc received as expected"
+ return 0
+ elif [ $rc -ne 0 ]; then
+ set_dir_limits 0
+ error_exit "return code $rc received instead of expected $EFBIG"
+ fi
+ J=$((J+1))
+ I=$(stat -c%s "$DIR/$tdir")
+ done
- error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
- do_facet $SINGLEMDS "echo 0 >$LDPROC"
+ set_dir_limits 0
+ error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
}
run_test 129 "test directory size limit ========================"
}
test_132() { #1028, SOM
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
local num=$(get_mds_dir $DIR)
local mymds=mds${num}
local MOUNTOPT_SAVE=$MOUNTOPT
}
run_test 132 "som avoids glimpse rpc"
+check_stats() {
+ local res
+ local count
+ case $1 in
+ $SINGLEMDS) res=`do_facet $SINGLEMDS $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$2"`
+ ;;
+ ost) res=`do_facet ost1 $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$2"`
+ ;;
+ *) error "Wrong argument $1" ;;
+ esac
+ echo $res
+ count=`echo $res | awk '{print $2}'`
+ [ -z "$res" ] && error "The counter for $2 on $1 was not incremented"
+ # if the argument $3 is zero, it means any stat increment is ok.
+ if [ $3 -gt 0 ] ; then
+ [ $count -ne $3 ] && error "The $2 counter on $1 is wrong - expected $3"
+ fi
+}
+
+test_133a() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p $DIR/${tdir}
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
+
+ # verify mdt stats first.
+ mkdir ${testdir} || error "mkdir failed"
+ check_stats $SINGLEMDS "mkdir" 1
+ touch ${testdir}/${tfile} || "touch failed"
+ check_stats $SINGLEMDS "open" 1
+ check_stats $SINGLEMDS "close" 1
+ mknod ${testdir}/${tfile}-pipe p || "mknod failed"
+ check_stats $SINGLEMDS "mknod" 1
+ rm -f ${testdir}/${tfile}-pipe || "pipe remove failed"
+ check_stats $SINGLEMDS "unlink" 1
+ rm -f ${testdir}/${tfile} || error "file remove failed"
+ check_stats $SINGLEMDS "unlink" 2
+
+ # remove working dir and check mdt stats again.
+ rmdir ${testdir} || error "rmdir failed"
+ check_stats $SINGLEMDS "rmdir" 1
+
+ local testdir1=$DIR/${tdir}/stats_testdir1
+ mkdir -p ${testdir}
+ mkdir -p ${testdir1}
+ touch ${testdir1}/test1
+ mv ${testdir1}/test1 ${testdir} || error "file crossdir rename"
+ check_stats $SINGLEMDS "crossdir_rename" 1
+
+ mv ${testdir}/test1 ${testdir}/test0 || error "file samedir rename"
+ check_stats $SINGLEMDS "samedir_rename" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133a "Verifying MDT stats ========================================"
+
+test_133b() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p ${testdir} || error "mkdir failed"
+ touch ${testdir}/${tfile} || "touch failed"
+ cancel_lru_locks mdc
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost1 $LCTL set_param obdfilter.*.stats=clear
+
+ # extra mdt stats verification.
+ chmod 444 ${testdir}/${tfile} || error "chmod failed"
+ check_stats $SINGLEMDS "setattr" 1
+ $LFS df || error "lfs failed"
+ check_stats $SINGLEMDS "statfs" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133b "Verifying extra MDT stats =================================="
+
+test_133c() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p ${testdir} || error "mkdir failed"
+
+ # verify obdfilter stats.
+ $LFS setstripe -c 1 -o 0 ${testdir}/${tfile}
+ sync
+ cancel_lru_locks osc
+
+ # clear stats.
+ 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"
+ sync
+ cancel_lru_locks osc
+ check_stats ost "write" 1
+
+ dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed"
+ check_stats ost "read" 1
+
+ > ${testdir}/${tfile} || error "truncate failed"
+ check_stats ost "punch" 1
+
+ rm -f ${testdir}/${tfile} || error "file remove failed"
+ check_stats ost "destroy" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133c "Verifying OST stats ========================================"
+
+order_2() {
+ local value=$1
+ local orig=$value
+ local order=1
+
+ while [ $value -ge 2 ]; do
+ order=$((order*2))
+ value=$((value/2))
+ done
+
+ if [ $orig -gt $order ]; then
+ order=$((order*2))
+ fi
+ echo $order
+}
+
+size_in_KMGT() {
+ local value=$1
+ local size=('K' 'M' 'G' 'T');
+ local i=0
+ local size_string=$value
+
+ while [ $value -ge 1024 ]; do
+ if [ $i -gt 3 ]; then
+ #T is the biggest unit we get here, if that is bigger,
+ #just return XXXT
+ size_string=${value}T
+ break
+ fi
+ value=$((value >> 10))
+ if [ $value -lt 1024 ]; then
+ size_string=${value}${size[$i]}
+ break
+ fi
+ i=$((i + 1))
+ done
+
+ echo $size_string
+}
+
+get_rename_size() {
+ local size=$1
+ local sample=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \
+ awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
+ echo $sample
+}
+
+test_133d() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ local testdir1=$DIR/${tdir}/stats_testdir1
+ local testdir2=$DIR/${tdir}/stats_testdir2
+
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
+
+ mkdir -p ${testdir1} || error "mkdir failed"
+ mkdir -p ${testdir2} || error "mkdir failed"
+
+ createmany -o $testdir1/test 512 || error "createmany failed"
+ local testdir1_size=$(ls -l $DIR/${tdir} | \
+ awk '/stats_testdir1/ {print $5}')
+ local testdir2_size=$(ls -l $DIR/${tdir} | \
+ awk '/stats_testdir2/ {print $5}')
+
+ testdir1_size=$(order_2 $testdir1_size)
+ testdir2_size=$(order_2 $testdir2_size)
+
+ testdir1_size=$(size_in_KMGT $testdir1_size)
+ testdir2_size=$(size_in_KMGT $testdir2_size)
+
+ # check samedir rename size
+ mv ${testdir1}/test0 ${testdir1}/test_0
+ local samedir=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \
+ grep 'same_dir')
+ local same_sample=$(get_rename_size $testdir1_size)
+ [ -z "$samedir" ] && error "samedir_rename_size count error"
+ [ $same_sample -eq 1 ] || error "samedir_rename_size count error"
+ echo "Check same dir rename stats success"
+
+ # check crossdir rename size
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
+ mv ${testdir1}/test_0 ${testdir2}/test_0
+ local crossdir=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats | \
+ grep 'crossdir')
+ local src_sample=$(get_rename_size $testdir1_size)
+ local tgt_sample=$(get_rename_size $testdir2_size)
+ [ -z "$crossdir" ] && error "crossdir_rename_size count error"
+ [ $src_sample -eq 1 ] || error "crossdir_rename_size count error"
+ [ $tgt_sample -eq 1 ] || error "crossdir_rename_size count error"
+ echo "Check cross dir rename stats success"
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133d "Verifying rename_stats ========================================"
+
test_140() { #bug-17379
mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
cd $DIR/$tdir || error "Changing to $DIR/$tdir"
}
run_test 154 "Opening a file by FID"
-test_155_load() {
+test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
- local list=$(comma_list $(osts_nodes))
- local big=$(do_nodes $list grep "cache" /proc/cpuinfo | \
- awk '{sum+=$4} END{print sum}')
-
- log big is $big K
dd if=/dev/urandom of=$temp bs=6096 count=1 || \
error "dd of=$temp bs=6096 count=1 failed"
echo "12345" >>$file
cmp $temp $file || error "$temp $file differ (append2)"
- dd if=/dev/urandom of=$temp bs=$((big*2)) count=1k || \
- error "dd of=$temp bs=$((big*2)) count=1k failed"
+ rm -f $temp $file
+ true
+}
+
+test_155_big_load() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ local temp=$TMP/$tfile
+ local file=$DIR/$tfile
+
+ free_min_max
+ local cache_size=$(do_facet ost$((MAXI+1)) \
+ "awk '/cache/ {sum+=\\\$4} END {print sum}' /proc/cpuinfo")
+ local large_file_size=$((cache_size * 2))
+
+ echo "OSS cache size: $cache_size KB"
+ echo "Large file size: $large_file_size KB"
+
+ [ $MAXV -le $large_file_size ] && \
+ skip_env "max available OST size needs > $large_file_size KB" && \
+ return 0
+
+ $SETSTRIPE $file -c 1 -i $MAXI || error "$SETSTRIPE $file failed"
+
+ dd if=/dev/urandom of=$temp bs=$large_file_size count=1k || \
+ error "dd of=$temp bs=$large_file_size count=1k failed"
cp $temp $file
ls -lh $temp $file
cancel_lru_locks osc
cmp $temp $file || error "$temp $file differ"
- rm -f $temp
+ rm -f $temp $file
true
}
test_155a() {
set_cache read on
set_cache writethrough on
- test_155_load
+ test_155_small_load
}
-run_test 155a "Verification of correctness: read cache:on write_cache:on"
+run_test 155a "Verify small file correctness: read cache:on write_cache:on"
test_155b() {
set_cache read on
set_cache writethrough off
- test_155_load
+ test_155_small_load
}
-run_test 155b "Verification of correctness: read cache:on write_cache:off"
+run_test 155b "Verify small file correctness: read cache:on write_cache:off"
test_155c() {
set_cache read off
set_cache writethrough on
- test_155_load
+ test_155_small_load
}
-run_test 155c "Verification of correctness: read cache:off write_cache:on"
+run_test 155c "Verify small file correctness: read cache:off write_cache:on"
test_155d() {
set_cache read off
set_cache writethrough off
- test_155_load
+ test_155_small_load
+}
+run_test 155d "Verify small file correctness: read cache:off write_cache:off"
+
+test_155e() {
+ set_cache read on
+ set_cache writethrough on
+ test_155_big_load
+}
+run_test 155e "Verify big file correctness: read cache:on write_cache:on"
+
+test_155f() {
+ set_cache read on
+ set_cache writethrough off
+ test_155_big_load
+}
+run_test 155f "Verify big file correctness: read cache:on write_cache:off"
+
+test_155g() {
+ set_cache read off
+ set_cache writethrough on
+ test_155_big_load
+}
+run_test 155g "Verify big file correctness: read cache:off write_cache:on"
+
+test_155h() {
+ set_cache read off
+ set_cache writethrough off
+ test_155_big_load
}
-run_test 155d "Verification of correctness: read cache:off write_cache:off "
+run_test 155h "Verify big file correctness: read cache:off write_cache:off"
test_156() {
local CPAGES=3
error $*
fi
}
+
+changelog_chmask()
+{
+ MASK=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_mask |\
+ grep -c $1)
+
+ if [ $MASK -eq 1 ]; then
+ do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="-$1"
+ else
+ do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="+$1"
+ fi
+}
+
test_160() {
- USER=$(do_facet $SINGLEMDS lctl --device $MDT0 changelog_register -n)
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
echo "Registered as changelog user $USER"
- do_facet $SINGLEMDS lctl get_param -n mdd.$MDT0.changelog_users | \
+ do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \
grep -q $USER || error "User $USER not found in changelog_users"
# change something
$LFS changelog $MDT0 | tail -5
echo "verifying changelog mask"
- do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="-mkdir"
- mkdir -p $DIR/$tdir/pics/2009/sofia
- do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="+mkdir"
- mkdir $DIR/$tdir/pics/2009/zachary
- DIRS=$($LFS changelog $MDT0 | tail -5 | grep -c MKDIR)
- [ $DIRS -eq 1 ] || err17935 "changelog mask count $DIRS != 1"
+ changelog_chmask "MKDIR"
+ changelog_chmask "CLOSE"
+
+ mkdir -p $DIR/$tdir/pics/zach/sofia
+ echo "zzzzzz" > $DIR/$tdir/pics/zach/file
+
+ changelog_chmask "MKDIR"
+ changelog_chmask "CLOSE"
+
+ mkdir -p $DIR/$tdir/pics/2008/sofia
+ echo "zzzzzz" > $DIR/$tdir/pics/zach/file
+
+ $LFS changelog $MDT0
+ MKDIRS=$($LFS changelog $MDT0 | tail -5 | grep -c "MKDIR")
+ CLOSES=$($LFS changelog $MDT0 | tail -5 | grep -c "CLOSE")
+ [ $MKDIRS -eq 1 ] || err17935 "MKDIR changelog mask count $DIRS != 1"
+ [ $CLOSES -eq 1 ] || err17935 "CLOSE changelog mask count $DIRS != 1"
# verify contents
echo "verifying target fid"
[ "$fidc" == "p=$fidf" ] || \
err17935 "pfid in changelog $fidc != dir fid $fidf"
- USER_REC1=$(do_facet $SINGLEMDS lctl get_param -n \
+ USER_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \
mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}')
$LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
- USER_REC2=$(do_facet $SINGLEMDS lctl get_param -n \
+ USER_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \
mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}')
echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
[ $USER_REC2 == $(($USER_REC1 + 5)) ] || \
err17935 "user index should be $(($USER_REC1 + 5)); is $USER_REC2"
- MIN_REC=$(do_facet $SINGLEMDS lctl get_param mdd.$MDT0.changelog_users | \
+ MIN_REC=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_users | \
awk 'min == "" || $2 < min {min = $2}; END {print min}')
FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
err17935 "first index should be $(($MIN_REC + 1)); is $FIRST_REC"
echo "verifying user deregister"
- do_facet $SINGLEMDS lctl --device $MDT0 changelog_deregister $USER
- do_facet $SINGLEMDS lctl get_param -n mdd.$MDT0.changelog_users | \
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+ do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \
grep -q $USER && error "User $USER still found in changelog_users"
- USERS=$(( $(do_facet $SINGLEMDS lctl get_param -n \
+ USERS=$(( $(do_facet $SINGLEMDS $LCTL get_param -n \
mdd.$MDT0.changelog_users | wc -l) - 2 ))
if [ $USERS -eq 0 ]; then
- LAST_REC1=$(do_facet $SINGLEMDS lctl get_param -n \
+ LAST_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \
mdd.$MDT0.changelog_users | head -1 | awk '{print $3}')
touch $DIR/$tdir/chloe
- LAST_REC2=$(do_facet $SINGLEMDS lctl get_param -n \
+ LAST_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \
mdd.$MDT0.changelog_users | head -1 | awk '{print $3}')
echo "verify changelogs are off if we were the only user: $LAST_REC1 == $LAST_REC2"
[ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
err17935 "path looked up \"${path}\" instead of \"${expected}\""
return 2
fi
- echo "fid $fid resolves to path $path"
+ echo "fid $fid resolves to path $path (expected $expected)"
}
test_162() {
- # Make changes to filesystem
- mkdir -p $DIR/$tdir/d2
- touch $DIR/$tdir/d2/$tfile
- touch $DIR/$tdir/d2/x1
- touch $DIR/$tdir/d2/x2
- mkdir -p $DIR/$tdir/d2/a/b/c
- mkdir -p $DIR/$tdir/d2/p/q/r
+ # Make changes to filesystem
+ mkdir -p $DIR/$tdir/d2
+ touch $DIR/$tdir/d2/$tfile
+ touch $DIR/$tdir/d2/x1
+ touch $DIR/$tdir/d2/x2
+ mkdir -p $DIR/$tdir/d2/a/b/c
+ mkdir -p $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
+ FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
+ check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
# 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
+ 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
+
+ # 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
# 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
-
- # hardlink count: check that there are 2 links
- # Doesnt work with CMD yet: 17935
+ 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
+
+ # hardlink count: check that there are 2 links
+ # Doesnt work with CMD yet: 17935
${LFS} fid2path $DIR $FID | wc -l | grep -q 2 || \
err17935 "expected 2 links"
# 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
+ rm $DIR/$tdir/d2/p/q/r/hlink
+ check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0
return 0
}
sleep 1
local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid)
# this proc file is temporary and linux-only
- do_facet mds lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
+ do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
error "kernel->userspace send failed"
kill -INT $!
}
local expected_good=$((good_line1 + good_line2*2))
rm -f $TMP/${tfile}*
- if [ $bad_line -ne $bad_line_new ]; then
+ # LU-231, short malformed line may not be counted into bad lines
+ if [ $bad_line -ne $bad_line_new ] &&
+ [ $bad_line -ne $((bad_line_new - 1)) ]; then
error "expected $bad_line bad lines, but got $bad_line_new"
return 1
fi
#define OBD_FAIL_PTLRPC_DUMP_LOG 0x50e
$LCTL set_param fail_loc=0x50e
$LCTL set_param fail_val=3000
- multiop_bg_pause $DIR/$tfile Os || true
+ multiop_bg_pause $DIR/$tfile O_s || true
+ local MULTIPID=$!
+ kill -USR1 $MULTIPID
# cause log dump
sleep 3
+ wait $MULTIPID
if dmesg | grep "recursive fault"; then
error "caught a recursive fault"
fi
local ost_nid=$1
local obdfilter_name=$2
echo "Creating new osc for $obdfilter_name on $ost_nid"
+ # make sure we can find loopback nid
+ $LCTL add_uuid $ost_nid $ost_nid >/dev/null 2>&1
+
[ $rc -eq 0 ] && { $LCTL attach osc ${obdfilter_name}_osc \
${obdfilter_name}_osc_UUID || rc=2; }
[ $rc -eq 0 ] && { $LCTL --device ${obdfilter_name}_osc setup \
}
test_180a() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
local rc=0
local rmmod_local=0
if ! module_loaded obdecho; then
- load_module obdecho/obdecho
- rmmod_local=1
+ load_module obdecho/obdecho
+ rmmod_local=1
fi
local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
- local host=$(awk '/current_connection:/ {print $2}' /proc/fs/lustre/osc/$osc/import)
- local target=$(awk '/target:/ {print $2}' /proc/fs/lustre/osc/$osc/import)
+ local host=$(lctl get_param -n osc.$osc.import |
+ awk '/current_connection:/ {print $2}' )
+ local target=$(lctl get_param -n osc.$osc.import |
+ awk '/target:/ {print $2}' )
target=${target%_UUID}
-
+
[[ -n $target ]] && { setup_obdecho_osc $host $target || rc=1; } || rc=1
[ $rc -eq 0 ] && { obdecho_create_test ${target}_osc client || rc=2; }
[[ -n $target ]] && cleanup_obdecho_osc $target
run_test 180a "test obdecho on osc"
test_180b() {
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
local rc=0
local rmmod_remote=0
- do_facet ost "lsmod | grep -q obdecho || " \
- "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \
- "modprobe obdecho; }" && rmmod_remote=1
- target=$(do_facet ost $LCTL dl | awk '/obdfilter/ {print $4;exit}')
- [[ -n $target ]] && { obdecho_create_test $target ost || rc=1; }
- [ $rmmod_remote -eq 1 ] && do_facet ost "rmmod obdecho"
+ do_facet ost1 "lsmod | grep -q obdecho || " \
+ "{ insmod ${LUSTRE}/obdecho/obdecho.ko || " \
+ "modprobe obdecho; }" && rmmod_remote=1
+ target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4;exit}')
+ [[ -n $target ]] && { obdecho_create_test $target ost1 || rc=1; }
+ [ $rmmod_remote -eq 1 ] && do_facet ost1 "rmmod obdecho"
return $rc
}
run_test 180b "test obdecho directly on obdfilter"
+test_181() { # bug 22177
+ mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
+ # create enough files to index the directory
+ createmany -o $DIR/$tdir/foobar 4000
+ # print attributes for debug purpose
+ lsattr -d .
+ # open dir
+ multiop_bg_pause $DIR/$tdir D_Sc || return 1
+ MULTIPID=$!
+ # remove the files & current working dir
+ unlinkmany $DIR/$tdir/foobar 4000
+ rmdir $DIR/$tdir
+ kill -USR1 $MULTIPID
+ wait $MULTIPID
+ stat $DIR/$tdir && error "open-unlinked dir was not removed!"
+ return 0
+}
+run_test 181 "Test open-unlinked dir ========================"
+
# OST pools tests
POOL=${POOL:-cea1}
TGT_COUNT=$OSTCOUNT
test_200d() {
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
- res=$($GETSTRIPE --pool $POOL_DIR | awk '/^pool:/ {print $2}')
- [ "$res" = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
+ res=$($GETSTRIPE --pool $POOL_DIR)
+ [ $res = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
}
run_test 200d "Check pool on a directory ==============================="
}
run_test 200g "lfs df a pool ============================================"
+test_200h() { # b=24039
+ mkdir -p $POOL_DIR || error "unable to create $POOL_DIR"
+
+ local file="/..$POOL_DIR/$tfile-1"
+ $SETSTRIPE -p $POOL $file || error "unable to create $file"
+
+ cd $POOL_DIR
+ $SETSTRIPE -p $POOL $tfile-2 || \
+ error "unable to create $tfile-2 in $POOL_DIR"
+}
+run_test 200h "Create files in a pool with relative pathname ============"
+
test_201a() {
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
TGT=$($LCTL get_param -n lov.$FSNAME-*.pools.$POOL | head -1)
test_201c() {
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
do_facet mgs $LCTL pool_destroy $FSNAME.$POOL
-
- sleep 2
+
+ sleep 2
# striping on an empty/nonexistant pool should fall back to "pool of everything"
touch ${POOL_DIR}/$tfile || error "failed to use fallback striping for missing pool"
# setstripe on an empty pool should fail
cleanup_pools $FSNAME
+# usage: default_attr <count | size | offset>
+default_attr() {
+ $LCTL get_param -n lov.$FSNAME-clilov-\*.stripe${1}
+}
+
+# usage: trim <string>
+# Trims leading and trailing whitespace from the parameter string
+trim() {
+ echo $@
+}
+
+# usage: check_default_stripe_attr <count | size | offset>
+check_default_stripe_attr() {
+ # $GETSTRIPE returns trailing whitespace which needs to be trimmed off
+ ACTUAL=$(trim $($GETSTRIPE --$1 $DIR/$tdir))
+ if [ $1 = "count" -o $1 = "size" ]; then
+ EXPECTED=`default_attr $1`;
+ else
+ # the 'stripeoffset' parameter prints as an unsigned int, so
+ # until this is fixed we hard-code -1 here
+ EXPECTED=-1;
+ fi
+ [ "x$ACTUAL" != "x$EXPECTED" ] &&
+ error "$DIR/$tdir has stripe $1 '$ACTUAL', not '$EXPECTED'"
+}
+
+# usage: check_raw_stripe_attr <count | size | offset>
+check_raw_stripe_attr() {
+ # $GETSTRIPE returns trailing whitespace which needs to be trimmed off
+ ACTUAL=$(trim $($GETSTRIPE --raw --$1 $DIR/$tdir))
+ if [ $1 = "count" -o $1 = "size" ]; then
+ EXPECTED=0;
+ else
+ EXPECTED=-1;
+ fi
+ [ "x$ACTUAL" != "x$EXPECTED" ] &&
+ error "$DIR/$tdir has raw stripe $1 '$ACTUAL', not '$EXPECTED'"
+}
+
+
+test_204a() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --count 0 --size 0 --offset -1 $DIR/$tdir
+
+ check_default_stripe_attr count
+ check_default_stripe_attr size
+ check_default_stripe_attr offset
+
+ return 0
+}
+run_test 204a "Print default stripe attributes ================="
+
+test_204b() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --count 1 $DIR/$tdir
+
+ check_default_stripe_attr size
+ check_default_stripe_attr offset
+
+ return 0
+}
+run_test 204b "Print default stripe size and offset ==========="
+
+test_204c() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --size 65536 $DIR/$tdir
+
+ check_default_stripe_attr count
+ check_default_stripe_attr offset
+
+ return 0
+}
+run_test 204c "Print default stripe count and offset ==========="
+
+test_204d() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --offset 0 $DIR/$tdir
+
+ check_default_stripe_attr count
+ check_default_stripe_attr size
+
+ return 0
+}
+run_test 204d "Print default stripe count and size ============="
+
+test_204e() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE -d $DIR/$tdir
+
+ check_raw_stripe_attr count
+ check_raw_stripe_attr size
+ check_raw_stripe_attr offset
+
+ return 0
+}
+run_test 204e "Print raw stripe attributes ================="
+
+test_204f() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --count 1 $DIR/$tdir
+
+ check_raw_stripe_attr size
+ check_raw_stripe_attr offset
+
+ return 0
+}
+run_test 204f "Print raw stripe size and offset ==========="
+
+test_204g() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --size 65536 $DIR/$tdir
+
+ check_raw_stripe_attr count
+ check_raw_stripe_attr offset
+
+ return 0
+}
+run_test 204g "Print raw stripe count and offset ==========="
+
+test_204h() {
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE --offset 0 $DIR/$tdir
+
+ check_raw_stripe_attr count
+ check_raw_stripe_attr size
+
+ return 0
+}
+run_test 204h "Print raw stripe count and size ============="
+
test_212() {
size=`date +%s`
size=$((size % 8192 + 1))
remove_lnet_proc_files "routers"
# /proc/sys/lnet/peers should look like this:
- # nid refs state max rtr min tx min queue
+ # 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. rtr, min, tx, min are
+ # state is up/down/NA, max >= 0. last, rtr, min, tx, min are
# numeric (0 or >0 or <0), queue >= 0.
- L1="^nid +refs +state +max +rtr +min +tx +min +queue$"
- BR="^$NID +$P +(up|down|NA) +$N +$I +$I +$I +$I +$N$"
+ 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"
run_test 215 "/proc/sys/lnet exists and has proper content - bugs 18102, 21079, 21517"
test_216() { # bug 20317
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
local node
local p="$TMP/sanityN-$TESTNAME.parameters"
save_lustre_params $HOSTNAME "osc.*.contention_seconds" > $p
}
run_test 216 "check lockless direct write works and updates file size and kms correctly"
+test_217() { # bug 22430
+ local node
+ local nid
+
+ for node in $(nodes_list); do
+ nid=$(host_nids_address $node $NETTYPE)
+ if [[ $nid = *-* ]] ; then
+ echo "lctl ping $nid@$NETTYPE"
+ lctl ping $nid@$NETTYPE
+ else
+ echo "skipping $node (no hyphen detected)"
+ fi
+ done
+}
+run_test 217 "check lctl ping for hostnames with hiphen ('-')"
+
+test_218() {
+ # do directio so as not to populate the page cache
+ log "creating a 10 Mb file"
+ multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
+ log "starting reads"
+ dd if=$DIR/$tfile of=/dev/null bs=4096 &
+ log "truncating the file"
+ multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
+ log "killing dd"
+ kill %+ || true # reads might have finished
+ echo "wait until dd is finished"
+ wait
+ log "removing the temporary file"
+ rm -rf $DIR/$tfile || error "tmp file removal failed"
+}
+run_test 218 "parallel read and truncate should not deadlock ======================="
+
+test_219() {
+ # write one partial page
+ dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
+ # set no grant so vvp_io_commit_write will do sync write
+ $LCTL set_param fail_loc=0x411
+ # write a full page at the end of file
+ dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
+
+ $LCTL set_param fail_loc=0
+ dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
+ $LCTL set_param fail_loc=0x411
+ dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
+}
+run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
+
+test_220() { #LU-325
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
+ local OSTIDX=0
+
+ mkdir -p $DIR/$tdir
+ local OST=$(lfs osts | grep ${OSTIDX}": " | \
+ awk '{print $2}' | sed -e 's/_UUID$//')
+
+ # on the mdt's osc
+ local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
+ local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_last_id)
+ local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_next_id)
+
+ $LFS df -i
+
+ 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 mgs $LCTL pool_new $FSNAME.$TESTNAME || return 1
+ do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
+
+ $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
+
+ MDSOBJS=$((last_id - next_id))
+ echo "preallocated objects on MDS is $MDSOBJS" "($last_id - $next_id)"
+
+ blocks=$($LFS df $MOUNT | awk '($1 == '$OSTIDX') { print $4 }')
+ echo "OST still has $count kbytes free"
+
+ echo "create $MDSOBJS files @next_id..."
+ createmany -o $DIR/$tdir/f $MDSOBJS || return 3
+
+ local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_last_id)
+ local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_next_id)
+
+ echo "after creation, last_id=$last_id2, next_id=$next_id2"
+ $LFS df -i
+
+ echo "cleanup..."
+
+ 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
+ echo "unlink $MDSOBJS files @$next_id..."
+ unlinkmany $DIR/$tdir/f $MDSOBJS || return 6
+}
+run_test 220 "preallocated MDS objects still used if ENOSPC from OST"
+
+test_221() {
+ cp `which date` $MOUNT
+
+ #define OBD_FAIL_LLITE_FAULT_TRUNC_RACE 0x1401
+ $LCTL set_param fail_loc=0x80001401
+
+ $MOUNT/date > /dev/null
+ rm -f $MOUNT/date
+}
+run_test 221 "make sure fault and truncate race to not cause OOM"
+
+test_222a () {
+ rm -rf $DIR/$tdir
+ mkdir -p $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 ================"
+
+test_222b () {
+ rm -rf $DIR/$tdir
+ mkdir -p $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
+ rm -r $DIR/$tdir || "AGL for rmdir failed"
+ $LCTL set_param fail_loc=0
+}
+run_test 222b "AGL for rmdir should not trigger CLIO lock failure ============="
+
+test_223 () {
+ rm -rf $DIR/$tdir
+ mkdir -p $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 ======================="
+
#
# tests that do cleanup/setup should be run at the end
#
}
run_test 900 "umount should not race with any mgc requeue thread"
-log "cleanup: ======================================================"
+complete $(basename $0) $SECONDS
check_and_cleanup_lustre
if [ "$I_MOUNTED" != "yes" ]; then
lctl set_param debug="$OLDDEBUG" 2> /dev/null || true
fi
-
-echo '=========================== finished ==============================='
-[ -f "$SANITYLOG" ] && cat $SANITYLOG && grep -q FAIL $SANITYLOG && exit 1 || true
-echo "$0: completed"
+exit_status