#!/bin/bash
+# -*- mode: Bash; tab-width: 4; indent-tabs-mode: t; -*-
+# vim:autoindent:shiftwidth=4:tabstop=4:
#
# Run select tests by setting ONLY, or as arguments to the script.
# Skip specific tests by setting EXCEPT.
set -e
ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 16823 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 10764 16260
-ALWAYS_EXCEPT=" 27s 27u 42a 42b 42c 42d 45 51d 65a 65e 68b 75 119d $SANITY_EXCEPT"
+# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 10764 16260
+ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b 75 119d $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"}
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
LFIND=${LFIND:-"$LFS find"}
LVERIFY=${LVERIFY:-ll_dirstripe_verify}
-LSTRIPEINFO=${LSTRIPEINFO:-ll_getstripe_info}
LCTL=${LCTL:-lctl}
MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
init_test_env $@
. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 36f 36g 51b 51c 60c 63 64b 68 71 73 77f 78 101 103 115 120g 124b"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24v 27m 36f 36g 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
}
check_kernel_version() {
- VERSION_FILE=version
WANT_VER=$1
- GOT_VER=$(lctl get_param -n $VERSION_FILE | awk '/kernel:/ {print $2}')
- [ $GOT_VER == "patchless" ] && return 0
- [ $GOT_VER -ge $WANT_VER ] && return 0
+ GOT_VER=$(lctl get_param -n version | awk '/kernel:/ {print $2}')
+ case $GOT_VER in
+ patchless|patchless_client) return 0;;
+ *) [ $GOT_VER -ge $WANT_VER ] && return 0 ;;
+ esac
log "test needs at least kernel version $WANT_VER, running $GOT_VER"
return 1
}
}
run_test 17h "create objects: lov_free_memmd() doesn't lbug"
+test_17i() { #bug 20018
+ 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=0x80000144
+ ls -l $foo && error "error not detected"
+ return 0
+}
+run_test 17i "don't panic on short symlink"
+
test_18() {
touch $DIR/f
ls $DIR || error
}
run_test 24u "create stripe file"
+test_24v() {
+ local NRFILES=100000
+ local FREE_INODES=`lfs df -i|grep "filesystem summary" | awk '{print $5}'`
+ [ $FREE_INODES -lt $NRFILES ] && \
+ skip "not enough free inodes $FREE_INODES required $NRFILES" && \
+ return
+
+ mkdir -p $DIR/d24v
+ createmany -m $DIR/d24v/$tfile $NRFILES
+ ls $DIR/d24v >/dev/null || error "error in listing large dir"
+
+ rm $DIR/d24v -rf
+}
+run_test 24v "list directory with large files (handle hash collision, bug: 17560)"
+
test_25a() {
echo '== symlink sanity ============================================='
test_27w() { # bug 10997
mkdir -p $DIR/d27w || error "mkdir failed"
$LSTRIPE $DIR/d27w/f0 -s 65536 || error "lstripe failed"
- size=`$LSTRIPEINFO $DIR/d27w/f0 | awk {'print $1'}`
+ size=`$GETSTRIPE $DIR/d27w/f0 -qs`
[ $size -ne 65536 ] && error "stripe size $size != 65536" || true
[ "$OSTCOUNT" -lt "2" ] && skip "skipping multiple stripe count/offset test" && return
for i in `seq 1 $OSTCOUNT`; do
offset=$(($i-1))
$LSTRIPE $DIR/d27w/f$i -c $i -i $offset || error "lstripe -c $i -i $offset failed"
- count=`$LSTRIPEINFO $DIR/d27w/f$i | awk {'print $2'}`
- index=`$LSTRIPEINFO $DIR/d27w/f$i | awk {'print $3'}`
+ count=`$GETSTRIPE -qc $DIR/d27w/f$i`
+ index=`$GETSTRIPE -qo $DIR/d27w/f$i`
[ $count -ne $i ] && error "stripe count $count != $i" || true
[ $index -ne $offset ] && error "stripe offset $index != $offset" || true
done
}
run_test 27w "check lfs setstripe -c -s -i options ============="
+test_27x() {
+ [ "$OSTCOUNT" -lt "2" ] && skip "$OSTCOUNT < 2 OSTs" && return
+ DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | awk '{print $1 + 2}')
+ OFFSET=$(($OSTCOUNTi - 1))
+ OSTIDX=0
+ local OST=$(lfs osts | awk '/'${OSTIDX}': / { print $2 }' | sed -e 's/_UUID$//')
+
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE $DIR/$tdir -c 1 # 1 stripe per file
+ do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 1
+ sleep $DELAY
+ createmany -o $DIR/$tdir/$tfile $OSTCOUNT
+ for i in `seq 0 $OFFSET`; do
+ [ `$GETSTRIPE $DIR/$tdir/$tfile$i | grep -A 10 obdidx | awk '{print $1}' | grep -w "$OSTIDX"` ] &&
+ error "OST0 was degraded but new created file still use it"
+ done
+ do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 0
+}
+run_test 27x "create files while OST0 is degraded"
+
+test_27y() {
+ [ "$OSTCOUNT" -lt "2" ] && skip "$OSTCOUNT < 2 OSTs -- skipping" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
+ MDS_OSCS=`do_facet mds lctl dl | awk '/[oO][sS][cC].*md[ts]/ { print $4 }'`
+ DELAY=$(do_facet mds lctl get_param -n lov.*.qos_maxage | awk '{print $1 + 2}')
+ OFFSET=$(($OSTCOUNT-1))
+ OST=-1
+ for OSC in $MDS_OSCS; do
+ if [ $OST == -1 ]; then {
+ OST=`osc_to_ost $OSC`
+ } else {
+ echo $OSC "is Deactivate:"
+ do_facet mds lctl --device %$OSC deactivate
+ } fi
+ done
+
+ OSTIDX=$(lfs osts | grep ${OST} | awk '{print $1}' | sed -e 's/://')
+ mkdir -p $DIR/$tdir
+ $SETSTRIPE $DIR/$tdir -c 1 # 1 stripe / file
+
+ do_facet ost$OSTIDX lctl set_param -n obdfilter.$OST.degraded 1
+ sleep $DELAY
+ createmany -o $DIR/$tdir/$tfile $OSTCOUNT
+ do_facet ost$OSTIDX 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"` ] || \
+ error "files created on deactivated OSTs instead of degraded OST"
+ done
+ for OSC in $MDS_OSCS; do
+ [ `osc_to_ost $OSC` != $OST ] && {
+ echo $OSC "is activate"
+ do_facet mds lctl --device %$OSC activate
+ }
+ done
+}
+run_test 27y "create files while OST0 is degraded and the rest inactive"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
echo "mds $i: inodes count OLD ${OLDUSED[$i]} NEW ${NEWUSED[$i]}"
[ ${OLDUSED[$i]} -lt ${NEWUSED[$i]} ] || rc=$((rc + 1))
done
-
+
lctl set_param -n lmv.*.placement=$savePOLICY
[ $rc -ne $MDSCOUNT ] || \
[ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
mkdir -p $DIR/d52a
touch $DIR/d52a/foo
- chattr =a $DIR/d52a/foo || error "chattr =a failed"
+ chattr +a $DIR/d52a/foo || error "chattr +a failed"
echo bar >> $DIR/d52a/foo || error "append bar failed"
cp /etc/hosts $DIR/d52a/foo && error "cp worked"
rm -f $DIR/d52a/foo 2>/dev/null && error "rm worked"
link $DIR/d52a/foo $DIR/d52a/foo_link 2>/dev/null && error "link worked"
echo foo >> $DIR/d52a/foo || error "append foo failed"
mrename $DIR/d52a/foo $DIR/d52a/foo_ren && error "rename worked"
- lsattr $DIR/d52a/foo | egrep -q "^-+a-+ $DIR/d52a/foo" || error "lsattr"
+ lsattr $DIR/d52a/foo | egrep -q "^-+[ae]-+ $DIR/d52a/foo" || error "lsattr"
chattr -a $DIR/d52a/foo || error "chattr -a failed"
-
+ cp -r $DIR/d52a /tmp/
rm -fr $DIR/d52a || error "cleanup rm failed"
}
run_test 52a "append-only flag test (should return errors) ====="
[ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
mkdir -p $DIR/d52b
touch $DIR/d52b/foo
- chattr =i $DIR/d52b/foo || error
- cat test > $DIR/d52b/foo && error
- cp /etc/hosts $DIR/d52b/foo && error
- rm -f $DIR/d52b/foo 2>/dev/null && error
- link $DIR/d52b/foo $DIR/d52b/foo_link 2>/dev/null && error
- echo foo >> $DIR/d52b/foo && error
- mrename $DIR/d52b/foo $DIR/d52b/foo_ren && error
+ chattr +i $DIR/d52b/foo || error "chattr +i failed"
+ cat test > $DIR/d52b/foo && error "cat test worked"
+ cp /etc/hosts $DIR/d52b/foo && error "cp worked"
+ rm -f $DIR/d52b/foo 2>/dev/null && error "rm worked"
+ link $DIR/d52b/foo $DIR/d52b/foo_link 2>/dev/null && error "link worked"
+ echo foo >> $DIR/d52b/foo && error "echo worked"
+ mrename $DIR/d52b/foo $DIR/d52b/foo_ren && error "rename worked"
[ -f $DIR/d52b/foo ] || error
[ -f $DIR/d52b/foo_ren ] && error
- lsattr $DIR/d52b/foo | egrep -q "^-+i-+ $DIR/d52b/foo" || error
- chattr -i $DIR/d52b/foo || error
+ lsattr $DIR/d52b/foo | egrep -q "^-+[ie]-+ $DIR/d52b/foo" || error "lsattr"
+ chattr -i $DIR/d52b/foo || error "chattr failed"
rm -fr $DIR/d52b || error
}
mkdir -p $dir || error "creating $dir"
local num=$(get_mds_dir $dir)
local mymds=mds$num
-
+
echo "mcreating $FILECOUNT files"
createmany -m $dir/f 1 $FILECOUNT || \
error "creating files in $dir"
chown $RUNAS_ID $DIR/d99cvsroot
local oldPWD=$PWD # bug 13584, use $TMP as working dir
cd $TMP
-
+
$RUNAS cvs -d $DIR/d99cvsroot init || error
cd $oldPWD
}
local ra_MB=${READAHEAD_MB:-40}
local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
- [ $space -gt $((size / 1024)) ] ||
+ [ $space -gt $((size / 1024)) ] ||
{ skip "Need free space ${size}M, have $space" && return; }
echo Creating ${size}M test file $file
local testfile2=${testfile}2
local value=`getfattr -n trusted.lov $testfile 2> /dev/null | \
grep "trusted.lov" |sed -e 's/[^=]\+=//'`
-
+
$MCREATE $testfile2
- setfattr -n trusted.lov -v $value $testfile2
+ setfattr -n trusted.lov -v $value $testfile2
local tmp_file=${testfile}3
$GETSTRIPE -v $testfile2 > $tmp_file
local stripe_size=`grep "size" $tmp_file| awk '{print $2}'`
local testfile2=${testfile}2
local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
grep "lustre.lov" |sed -e 's/[^=]\+=//' `
-
+
$RUNAS $MCREATE $testfile2
- $RUNAS setfattr -n lustre.lov -v $value $testfile2
+ $RUNAS setfattr -n lustre.lov -v $value $testfile2
local tmp_file=${testfile}3
$RUNAS $GETSTRIPE -v $testfile2 > $tmp_file
local stripe_size=`grep "size" $tmp_file| awk '{print $2}'`
echo "performing cp ..."
run_acl_subtest cp || error
echo "performing getfacl-noacl..."
- run_acl_subtest getfacl-noacl || error
+ run_acl_subtest getfacl-noacl || error "getfacl-noacl test failed"
echo "performing misc..."
- run_acl_subtest misc || error
+ run_acl_subtest misc || error "misc test failed"
echo "performing permissions..."
- run_acl_subtest permissions || error
+ run_acl_subtest permissions || error "permissions failed"
echo "performing setfacl..."
- run_acl_subtest setfacl || error
+ run_acl_subtest setfacl || error "setfacl test failed"
# inheritance test got from HP
echo "performing inheritance..."
- cp $LUSTRE/tests/acl/make-tree . || error
- chmod +x make-tree || error
- run_acl_subtest inheritance || error
+ cp $LUSTRE/tests/acl/make-tree . || error "cannot copy make-tree"
+ chmod +x make-tree || error "chmod +x failed"
+ run_acl_subtest inheritance || error "inheritance test failed"
rm -f make-tree
cd $SAVE_PWD
lfs df -i $DIR || error "lfs df -i $DIR failed"
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`
lctl --device %$OSC deactivate
lfs df || error "lfs df with deactivated OSC failed"
test_118a() #bug 11710
{
reset_async
-
+
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
DIRTY=$(lctl get_param -n llite.*.dump_page_cache | grep -c dirty)
WRITEBACK=$(lctl get_param -n llite.*.dump_page_cache | grep -c writeback)
# until a subsequent RPC completes successfully without error.
multiop $DIR/$tfile Ow4096yc
rm -f $DIR/$tfile
-
+
return 0
}
run_test 118b "Reclaim dirty pages on fatal error =========="
if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
fi
-
+
rm -f $DIR/$tfile
echo "Dirty pages flushed via fsync on EROFS"
return 0
#define OBD_FAIL_OST_BRW_PAUSE_BULK
set_nodes_failloc "$(osts_nodes)" 0x214
# multiop should block due to fsync until pages are written
- multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
+ multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
MULTIPID=$!
sleep 1
if [[ $RC -eq 0 ]]; then
error "Must return error due to dropped pages, rc=$RC"
fi
-
+
lctl set_param fail_loc=0x0
LOCKED=$(lctl get_param -n llite.*.dump_page_cache | grep -c locked)
# simulate local -ENOMEM
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
-
+
lctl set_param fail_loc=0
if [[ $RC -eq 0 ]]; then
error "Must return error due to dropped pages, rc=$RC"
if [[ $LOCKED -ne 0 ]]; then
error "Locked pages remain in cache, locked=$LOCKED"
fi
-
+
if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
fi
# Should simulate ENOMEM error which is recoverable and should be handled by timeout
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
RC=$?
-
+
set_nodes_failloc "$(osts_nodes)" 0
if [[ $RC -eq 0 ]]; then
error "Must return error due to dropped pages, rc=$RC"
if [[ $LOCKED -ne 0 ]]; then
error "Locked pages remain in cache, locked=$LOCKED"
fi
-
+
if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
fi
#define OBD_FAIL_OST_BRW_WRITE_BULK 0x20e
set_nodes_failloc "$(osts_nodes)" 0x20e
-
+
# Should simulate ENOMEM error which is recoverable and should be handled by timeout
multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c &
PID=$!
sleep 5
set_nodes_failloc "$(osts_nodes)" 0
-
+
wait $PID
RC=$?
if [[ $RC -ne 0 ]]; then
if [[ $LOCKED -ne 0 ]]; then
error "Locked pages remain in cache, locked=$LOCKED"
fi
-
+
if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
fi
if [[ $LOCKED -ne 0 ]]; then
error "Locked pages remain in cache, locked=$LOCKED"
fi
-
+
# in recoverable error on OST we want resend and stay until it finished
if [[ $DIRTY -ne 0 || $WRITEBACK -ne 0 ]]; then
error "Dirty pages not flushed to disk, dirty=$DIRTY, writeback=$WRITEBACK"
test_121() { #bug #10589
rm -rf $DIR/$tfile
- writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out/ {print $1}')
+ writes=$(LANG=C dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk -F '+' '/out$/ {print $1}')
#define OBD_FAIL_LDLM_CANCEL_RACE 0x310
lctl set_param fail_loc=0x310
cancel_lru_locks osc > /dev/null
- reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in/ {print $1}')
+ reads=$(LANG=C dd if=$DIR/$tfile of=/dev/null 2>&1 | awk -F '+' '/in$/ {print $1}')
lctl set_param fail_loc=0
[ "$reads" -eq "$writes" ] || error "read" $reads "blocks, must be" $writes
}
test_123b () { # statahead(bug 15027)
mkdir -p $DIR/$tdir
createmany -o $DIR/$tdir/$tfile-%d 1000
-
+
cancel_lru_locks mdc
cancel_lru_locks osc
echo "got $COUNT $NAME"
[ ! $MIN ] && error "Missing min value for $NAME proc entry"
eval $NAME=$COUNT || error "Wrong proc format"
-
+
case $NAME in
read_bytes|write_bytes)
[ $MIN -lt 4096 ] && error "min is too small: $MIN"
trap cleanup_130 EXIT RETURN
local fm_file=$DIR/$tfile
- lfs setstripe -s 65536 -c 2 $fm_file || error "setstripe failed on $fm_file"
+ lfs setstripe -s 131072 -c 2 $fm_file || error "setstripe failed on $fm_file"
NUM_BLKS=512
- EXPECTED_LEN=$(( (NUM_BLKS / 2) * 4 ))
+ EXPECTED_LEN=$(( (NUM_BLKS / 2) * 64 ))
for ((i = 0; i < $NUM_BLKS; i++))
do
- dd if=/dev/zero of=$fm_file count=1 bs=4096 seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
+ dd if=/dev/zero of=$fm_file count=1 bs=64k seek=$((2*$i)) conv=notrunc > /dev/null 2>&1
done
filefrag -ves $fm_file || error "filefrag $fm_file failed"
- filefrag_op=`filefrag -ve $fm_file | grep -A 750 "ext:" | grep -v "ext:" | grep -v "found"`
+ filefrag_op=`filefrag -ve $fm_file | grep -A 12000 "ext:" | grep -v "ext:" | grep -v "found"`
last_lun=`echo $filefrag_op | cut -d: -f5`
}
run_test 131e "test read hitting hole"
+get_ost_param() {
+ local token=$1
+ local gl_sum=0
+ for node in $(osts_nodes); do
+ gl=$(do_node $node "$LCTL get_param -n ost.OSS.ost.stats" | awk '/'$token'/ {print $2}' | head -n 1)
+ [ x$gl = x"" ] && gl=0
+ gl_sum=$((gl_sum + gl))
+ done
+ echo $gl
+}
+
+som_mode_switch() {
+ local som=$1
+ local gl1=$2
+ local gl2=$3
+
+ if [ x$som = x"enabled" ]; then
+ [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected"
+ do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled"
+ else
+ [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected"
+ do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled"
+ fi
+
+ # do remount to make new mount-conf parameters actual
+ echo remounting...
+ sync
+ stopall
+ setupall
+}
+
+test_132() { #1028, SOM
+ local num=$(get_mds_dir $DIR)
+ local mymds=mds${num}
+
+ 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)
+
+ gl1=$(get_ost_param "ldlm_glimpse_enqueue")
+ stat $DIR/$tfile >/dev/null
+ gl2=$(get_ost_param "ldlm_glimpse_enqueue")
+ echo "====> SOM is "$som1", "$((gl2 - gl1))" glimpse RPC occured"
+ cancel_lru_locks osc
+ som_mode_switch $som1 $gl1 $gl2
+
+ som2=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1)
+ if [ $som1 == $som2 ]; then
+ error "som is still "$som2
+ if [ x$som2 = x"enabled" ]; then
+ som2="disabled"
+ else
+ som2="enabled"
+ fi
+ fi
+
+ gl1=$(get_ost_param "ldlm_glimpse_enqueue")
+ stat $DIR/$tfile >/dev/null
+ gl2=$(get_ost_param "ldlm_glimpse_enqueue")
+ echo "SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured"
+ som_mode_switch $som2 $gl1 $gl2
+}
+run_test 132 "som avoids glimpse rpc"
+
test_140() { #bug-17379
mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
cd $DIR/$tdir || error "Changing to $DIR/$tdir"
}
run_test 150 "truncate/append tests"
-function roc_access() {
- ACCNUM=`$LCTL get_param -n obdfilter.*.stats | \
- grep 'cache_access'| awk '{print $2}' | \
- awk '{sum=sum+$3} END{print sum}'`
- echo $ACCNUM
-}
-
function roc_hit() {
- ACCNUM=`$LCTL get_param -n obdfilter.*.stats | \
- grep 'cache_hit'|awk '{print $2}' | \
- awk '{sum=sum+$1} END{print sum}'`
- echo $ACCNUM
+ local list=$(comma_list $(osts_nodes))
+ local log=$TMP/${TESTSUITE}-$TESTNAME.param
+ do_nodes $list "$LCTL get_param -n obdfilter.*.stats" >$log
+
+ local ACCNUM=`awk '/^cache_hit/ {sum=sum+$2} END{print sum}' $log`
+ rm -f $log
+ echo $ACCNUM
}
test_151() {
- local CPAGES=3
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
- # check whether obdfilter is cache capable at all
- if ! $LCTL get_param -n obdfilter.*.read_cache_enable; then
- echo "not cache-capable obdfilter"
- return 0
- fi
+ local CPAGES=3
+ local list=$(comma_list $(osts_nodes))
- # check cache is enabled on all obdfilters
- if $LCTL get_param -n obdfilter.*.read_cache_enable | grep 0 >&/dev/null; then
- echo "oss cache is disabled"
- return 0
- fi
+ # check whether obdfilter is cache capable at all
+ if ! do_nodes $list $LCTL get_param -n obdfilter.*.read_cache_enable > /dev/null; then
+ echo "not cache-capable obdfilter"
+ return 0
+ fi
- $LCTL set_param -n obdfilter.*.writethrough_cache_enable 1
+ # check cache is enabled on all obdfilters
+ if do_nodes $list $LCTL get_param -n obdfilter.*.read_cache_enable | grep 0 >&/dev/null; then
+ echo "oss cache is disabled"
+ return 0
+ fi
- # pages should be in the case right after write
- dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES || error "dd failed"
- local BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $DIR/$tfile >/dev/null
- local AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
- fi
+ do_nodes $list $LCTL set_param -n obdfilter.*.writethrough_cache_enable 1
- # the following read invalidates the cache
- cancel_lru_locks osc
- $LCTL set_param -n obdfilter.*.read_cache_enable 0
- cat $DIR/$tfile >/dev/null
+ # pages should be in the case right after write
+ dd if=/dev/urandom of=$DIR/$tfile bs=4k count=$CPAGES || error "dd failed"
+ local BEFORE=`roc_hit`
+ cancel_lru_locks osc
+ cat $DIR/$tfile >/dev/null
+ local AFTER=`roc_hit`
+ if ! let "AFTER - BEFORE == CPAGES"; then
+ error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ fi
- # now data shouldn't be found in the cache
- BEFORE=`roc_hit`
- cancel_lru_locks osc
- cat $DIR/$tfile >/dev/null
- AFTER=`roc_hit`
- if let "AFTER - BEFORE != 0"; then
- error "IN CACHE: before: $BEFORE, after: $AFTER"
- fi
+ # the following read invalidates the cache
+ cancel_lru_locks osc
+ do_nodes $list $LCTL set_param -n obdfilter.*.read_cache_enable 0
+ cat $DIR/$tfile >/dev/null
- $LCTL set_param -n obdfilter.*.read_cache_enable 1
- rm -f $DIR/$tfile
+ # now data shouldn't be found in the cache
+ BEFORE=`roc_hit`
+ cancel_lru_locks osc
+ cat $DIR/$tfile >/dev/null
+ AFTER=`roc_hit`
+ if let "AFTER - BEFORE != 0"; then
+ error "IN CACHE: before: $BEFORE, after: $AFTER"
+ fi
+
+ do_nodes $list $LCTL set_param -n obdfilter.*.read_cache_enable 1
+ rm -f $DIR/$tfile
}
run_test 151 "test cache on oss and controls ==============================="
test_152() {
local TF="$TMP/$tfile"
- # simulate ENOMEM during write
-#define OBD_FAIL_OST_NOMEM 0x226
+ # simulate ENOMEM during write
+#define OBD_FAIL_OST_NOMEM 0x226
lctl set_param fail_loc=0x80000226
dd if=/dev/urandom of=$TF bs=6096 count=1 || error "dd failed"
cp $TF $DIR/$tfile
sync || error "sync failed"
lctl set_param fail_loc=0
-
+
# discard client's cache
cancel_lru_locks osc
cmp $TF $DIR/$tfile || error "cmp failed"
lctl set_param fail_loc=0
- rm -f $TF
+ rm -f $TF
}
run_test 152 "test read/write with enomem ============================"
ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna
ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor
local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[')
- if [ "$($LFS fid2path ${mds1_svc} $FID | wc -l)" != "5" ]; then
- $LFS fid2path ${mds1_svc} $FID
+ if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then
+ $LFS fid2path $DIR $FID
err17935 "bad link ea"
fi
# middle
rm $DIR/$tdir/$tfile
# rename
mv $DIR/$tdir/foo1/sofia $DIR/$tdir/foo2/maggie
- if [ "$($LFS fid2path ${mds1_svc} --link 1 $FID)" != "/$tdir/foo2/maggie" ]
+ if [ "$($LFS fid2path $DIR --link 1 $FID)" != "/$tdir/foo2/maggie" ]
then
- $LFS fid2path ${mds1_svc} $FID
+ $LFS fid2path $DIR $FID
err17935 "bad link rename"
fi
rm $DIR/$tdir/foo2/maggie
local longname=filename_avg_len_is_thirty_two_
createmany -l$DIR/$tdir/foo1/luna $DIR/$tdir/foo2/$longname 1000 || \
error "failed to hardlink many files"
- links=$($LFS fid2path ${mds1_svc} $FID | wc -l)
+ links=$($LFS fid2path $DIR $FID | wc -l)
echo -n "${links}/1000 links in link EA"
[ ${links} -gt 60 ] || err17935 "expected at least 60 links in link EA"
unlinkmany $DIR/$tdir/foo2/$longname 1000 || \
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" ${mds1_svc} $FID --link 0
+ check_path "/$tdir/d2/$tfile" $DIR $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" $DIR $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 '[')
- check_path "/$tdir/d2/a/b/c/new_file" ${mds1_svc} $FID --link 1
- check_path "/$tdir/d2/p/q/r/hlink" ${mds1_svc} $FID --link 0
- # check that there are 2 links
- ${LFS} fid2path ${mds1_svc} $FID | wc -l | grep -q 2 || \
- err17935 "expected 2 links"
+ # fid2path dir/fsname should both work
+ check_path "/$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1
+ check_path "/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0
- rm $DIR/$tdir/d2/p/q/r/hlink
- check_path "/$tdir/d2/a/b/c/new_file" ${mds1_svc} $FID --link 0
+ # hardlink count: check that there are 2 links
# Doesnt work with CMD yet: 17935
- return 0
+ ${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" $DIR $FID --link 0
+
+ return 0
}
run_test 162 "path lookup sanity"
-test_154() {
+test_163() {
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ copytool --test || { skip "copytool not runnable: $?" && return; }
+ copytool &
+ sleep 1
+ local uuid=$($LCTL get_param -n mdc.lustre-MDT0000-mdc-*.uuid)
+ # this proc file is temporary and linux-only
+ do_facet mds lctl set_param mdt.lustre-MDT0000.mdccomm=$uuid || error "lnl send failed"
+ kill $!
+}
+run_test 163 "LustreNetLink kernelcomms"
+
+test_169() {
# 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 "removing the temporary file"
rm -rf $DIR/$tfile || error "tmp file removal failed"
}
-run_test 154 "parallel read and truncate should not deadlock ==="
+run_test 169 "parallel read and truncate should not deadlock"
test_170() {
$LCTL clear # bug 18514
do_facet mgs $LCTL pool_new $FSNAME.$POOL
# get param should return err until pool is created
wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL 2>/dev/null || echo foo" "" || error "Pool creation of $POOL failed"
+ [ $($LFS pool_list $FSNAME | grep -c $POOL) -eq 1 ] || error "$POOL not in lfs pool_list"
}
run_test 200a "Create new pool =========================================="
do_facet mgs $LCTL pool_add $FSNAME.$POOL \
$FSNAME-OST[$TGTPOOL_FIRST-$TGTPOOL_MAX/$TGTPOOL_STEP]
wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$POOL | sort -u | tr '\n' ' ' " "$TGT" || error "Add to pool failed"
+ local lfscount=$($LFS pool_list $FSNAME.$POOL | grep -c "\-OST")
+ local addcount=$((($TGTPOOL_MAX - $TGTPOOL_FIRST) / $TGTPOOL_STEP + 1))
+ [ $lfscount -eq $addcount ] || error "lfs pool_list bad ost count $lfscount != $addcount"
}
run_test 200b "Add targets to a pool ===================================="
test_200d() {
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
- res=$($GETSTRIPE $POOL_DIR | grep pool: | cut -f8 -d " ")
- [ "$res" = $POOL ] || error "Pool on $POOL_DIR is not $POOL"
+ res=$($GETSTRIPE --pool $POOL_DIR | awk '/^pool:/ {print $2}')
+ [ "$res" = $POOL ] || error "Pool on $POOL_DIR is $res, not $POOL"
}
run_test 200d "Check pool on a directory ==============================="
}
run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
+test_214() { # for bug 20133
+ mkdir -p $DIR/d214p/d214c
+ for (( i=0; i < 340; i++ )) ; do
+ touch $DIR/d214p/d214c/a$i
+ done
+
+ ls -l $DIR/d214p || error "ls -l $DIR/d214p failed"
+ mv $DIR/d214p/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
+ ls $DIR/d214c || error "ls $DIR/d214c failed"
+ rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
+}
+run_test 214 "hash-indexed directory test - bug 20133"
+
#
# tests that do cleanup/setup should be run at the end
#