[ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.3.55) ] &&
TESTS="4094 4095"
+ # skip long symlink name for rhel6.5.
+ # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename))
+ grep -q '6.5' /etc/redhat-release && TESTS="59 60 61 4062 4063"
+
for i in $TESTS; do
local SYMNAME=$(str_repeat 'x' $i)
ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink"
echo "stop and checking mds${mds_index}: $cmd"
# e2fsck should not return error
- stop mds${mds_index} -f
+ stop mds${mds_index}
do_facet mds${mds_index} $cmd || rc=$?
start mds${mds_index} $devname $MDS_MOUNT_OPTS
local cmd
local rc=0
- for mdt_index in $(seq 1 $MDSCOUNT); do
+ # create/unlink in 17n only change 2 MDTs(MDT1/MDT2),
+ # so it only check MDT1/MDT2 instead of all of MDTs.
+ for mdt_index in $(seq 1 2); do
devname=$(mdsdevname $mdt_index)
cmd="$E2FSCK -fnvd $devname"
test_24d() {
test_mkdir $DIR/$tdir
test_mkdir $DIR/$tdir/d$testnum.1
- test_mkdir $DIR/$tdir/d$ttestnum.2
+ test_mkdir $DIR/$tdir/d$testnum.2
mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
$CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
$CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
trap simple_cleanup_common EXIT
+ # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
+ [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
+
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NRFILES
test_24A() { # LU-3182
local NFILES=5000
+ rm -rf $DIR/$tdir
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NFILES
local t=`ls $DIR/$tdir | wc -l`
[ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27
$SETSTRIPE -S 67108864 $FILE || error "setstripe failed"
BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+ [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE"
dd if=/dev/zero of=$FILE bs=4k count=1
BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+ [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE"
}
run_test 27k "limit i_blksize for broken user apps ============="
local dev=$(ostdevname $ost)
local oid_hex
- if [ $(facet_fstype ost$ost) != ldiskfs ]; then
- echo "Currently only works with ldiskfs-based OSTs"
- continue
- fi
-
- log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
-
- #don't unmount/remount the OSTs if we don't need to do that
- # LU-2577 changes filter_fid to be smaller, so debugfs needs
- # update too, until that use mount/ll_decode_filter_fid/mount
- local dir=$(facet_mntpt ost$ost)
- local opts=${OST_MOUNT_OPTS}
-
- if ! do_facet ost$ost test -b ${dev}; then
- opts=$(csa_add "$opts" -o loop)
- fi
-
- stop ost$ost
- do_facet ost$ost mount -t $(facet_fstype ost$ost) $opts $dev $dir ||
- { error "mounting $dev as $FSTYPE failed"; return 3; }
+ log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq"
seq=$(echo $seq | sed -e "s/^0x//g")
if [ $seq == 0 ]; then
else
oid_hex=$(echo $hex | sed -e "s/^0x//g")
fi
- local obj_file=$(do_facet ost$ost find $dir/O/$seq -name $oid_hex)
- local ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID $obj_file)
- do_facet ost$ost umount -d $dir
- start ost$ost $dev $OST_MOUNT_OPTS
+ local obj_file="O/$seq/d$((oid %32))/$oid_hex"
- # re-enable when debugfs will understand new filter_fid
- #local ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
- # $dev 2>/dev/null" | grep "parent=")
+ local ff
+ #
+ # Don't unmount/remount the OSTs if we don't need to do that.
+ # LU-2577 changes filter_fid to be smaller, so debugfs needs
+ # update too, until that use mount/ll_decode_filter_fid/mount.
+ # Re-enable when debugfs will understand new filter_fid.
+ #
+ if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then
+ ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \
+ $dev 2>/dev/null" | grep "parent=")
+ else
+ stop ost$ost
+ mount_fstype ost$ost
+ ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \
+ $(facet_mntpt ost$ost)/$obj_file)
+ unmount_fstype ost$ost
+ start ost$ost $dev $OST_MOUNT_OPTS
+ fi
- [ -z "$ff" ] && error "$obj_file: no filter_fid info"
+ [ -z "$ff" ] && error "$obj_file: no filter_fid info"
- echo "$ff" | sed -e 's#.*objid=#got: objid=#'
+ echo "$ff" | sed -e 's#.*objid=#got: objid=#'
- # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
- # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
- local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
- local ff_pseq=$(echo $ff_parent | cut -d: -f1)
- local ff_poid=$(echo $ff_parent | cut -d: -f2)
- local ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+ # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1]
+ # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1
+ local ff_parent=$(echo $ff|sed -e 's/.*parent=.//')
+ local ff_pseq=$(echo $ff_parent | cut -d: -f1)
+ local ff_poid=$(echo $ff_parent | cut -d: -f2)
+ local ff_pstripe
+ if echo $ff_parent | grep -q 'stripe='; then
+ ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//')
+ else
+ #
+ # $LL_DECODE_FILTER_FID does not print "stripe="; look
+ # into f_ver in this case. See the comment on
+ # ff_parent.
+ #
+ ff_pstripe=$(echo $ff_parent | cut -d: -f3 |
+ sed -e 's/\]//')
+ fi
# compare lmm_seq and filter_fid->ff_parent.f_seq
[ $ff_pseq = $lmm_seq ] ||
# compare lmm_object_id and filter_fid->ff_parent.f_oid
[ $ff_poid = $lmm_oid ] ||
error "FF parent OID $ff_poid != $lmm_oid"
- [ $ff_pstripe = $stripe_nr ] ||
+ (($ff_pstripe == $stripe_nr)) ||
error "FF stripe $ff_pstripe != $stripe_nr"
stripe_nr=$((stripe_nr + 1))
local restore_count=$($GETSTRIPE -c $MOUNT)
local restore_offset=$($GETSTRIPE -i $MOUNT)
$SETSTRIPE -c 0 -i -1 -S 0 $MOUNT
+ wait_update $HOSTNAME "$GETSTRIPE -c $MOUNT | sed 's/ *//g'" "1" 20 ||
+ error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
local default_size=$($GETSTRIPE -S $MOUNT)
- local default_count=$($GETSTRIPE -c $MOUNT)
local default_offset=$($GETSTRIPE -i $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 -i $restore_offset -S $restore_size $MOUNT
}
run_test 31m "link to file: the same, non-existing, dir==============="
test_31n() {
- [ -e /proc/self/fd/173 ] && echo "skipping, fd 173 is in use" && return
touch $DIR/$tfile || error "cannot create '$DIR/$tfile'"
nlink=$(stat --format=%h $DIR/$tfile)
[ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
- exec 173<$DIR/$tfile
- trap "exec 173<&-" EXIT
- nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+ local fd=$(free_fd)
+ local cmd="exec $fd<$DIR/$tfile"
+ eval $cmd
+ cmd="exec $fd<&-"
+ trap "eval $cmd" EXIT
+ nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
[ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1"
rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'"
- nlink=$(stat --dereference --format=%h /proc/self/fd/173)
+ nlink=$(stat --dereference --format=%h /proc/self/fd/$fd)
[ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0"
- exec 173<&-
+ eval $cmd
}
run_test 31n "check link count of unlinked file"
cleanup_test32_mount() {
trap 0
- $UMOUNT $DIR/$tdir/ext2-mountpoint
+ $UMOUNT -d $DIR/$tdir/ext2-mountpoint
}
test_32a() {
cleanup_testdir_mount() {
trap 0
- $UMOUNT $DIR/$tdir
+ $UMOUNT -d $DIR/$tdir
}
test_32q() {
}
run_test 39n "check that O_NOATIME is honored"
+test_39o() {
+ TESTDIR=$DIR/$tdir/$tfile
+ [ -e $TESTDIR ] && rm -rf $TESTDIR
+ test_mkdir -p $TESTDIR
+ cd $TESTDIR
+ links1=2
+ ls
+ mkdir a b
+ ls
+ links2=$(stat -c %h .)
+ [ $(($links1 + 2)) != $links2 ] &&
+ error "wrong links count $(($links1 + 2)) != $links2"
+ rmdir b
+ links3=$(stat -c %h .)
+ [ $(($links1 + 1)) != $links3 ] &&
+ error "wrong links count $links1 != $links3"
+ return 0
+}
+run_test 39o "directory cached attributes updated after create ========"
+
+test_39p() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local MDTIDX=1
+ TESTDIR=$DIR/$tdir/$tfile
+ [ -e $TESTDIR ] && rm -rf $TESTDIR
+ mkdir -p $TESTDIR
+ cd $TESTDIR
+ links1=2
+ ls
+ $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir1
+ $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir2
+ ls
+ links2=$(stat -c %h .)
+ [ $(($links1 + 2)) != $links2 ] &&
+ error "wrong links count $(($links1 + 2)) != $links2"
+ rmdir remote_dir2
+ links3=$(stat -c %h .)
+ [ $(($links1 + 1)) != $links3 ] &&
+ error "wrong links count $links1 != $links3"
+ return 0
+}
+run_test 39p "remote directory cached attributes updated after create ========"
+
+
test_40() {
dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
$RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
export NUMTEST=70000
test_51b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local BASE=$DIR/$tdir
+ local BASE=$DIR/d${base}.${TESTSUITE}
# cleanup the directory
rm -fr $BASE
run_test 51b "exceed 64k subdirectory nlink limit"
test_51ba() { # LU-993
- local BASE=$DIR/$tdir
+ local BASE=$DIR/d${base}.${TESTSUITE}
# unlink all but 100 subdirectories, then check it still works
local LEFT=100
[ -f $BASE/fnum ] && local NUMPREV=$(cat $BASE/fnum) && rm $BASE/fnum
local ost_last_id
local ostnum
local node
- local found=0
+ local found=false
+ local support_last_seq=true
+
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] ||
+ support_last_seq=false
# only test MDT0000
- local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
- for value in $(do_facet $SINGLEMDS lctl get_param osc.$mdtosc.prealloc_last_id) ; do
- param=$(echo ${value[0]} | cut -d "=" -f1)
- ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
- param_seq=$(echo ${param} |
- sed -e s/prealloc_last_id/prealloc_last_seq/g)
- mds_last_seq=$(do_facet $SINGLEMDS lctl get_param -n $param_seq)
- mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param)
+ local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS)
+ local value
+ for value in $(do_facet $SINGLEMDS \
+ $LCTL get_param osc.$mdtosc.prealloc_last_id) ; do
+ param=$(echo ${value[0]} | cut -d "=" -f1)
+ ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2)
+
+ if $support_last_seq; then
+ param_seq=$(echo $param |
+ sed -e s/prealloc_last_id/prealloc_last_seq/g)
+ mds_last_seq=$(do_facet $SINGLEMDS \
+ $LCTL get_param -n $param_seq)
+ fi
+ mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param)
ostnum=$(index_from_ostuuid ${ostname}_UUID)
node=$(facet_active_host ost$((ostnum+1)))
param="obdfilter.$ostname.last_id"
- for ost_last in $(do_node $node lctl get_param -n $param) ; do
- echo "$ostname.last_id=$ost_last ;MDS.last_id=$mds_last"
- ost_last_id=$(echo $ost_last | awk -F':' '{print $2}' |
- sed -e "s/^0x//g")
- ost_last_seq=$(echo $ost_last | awk -F':' '{print $1}')
- if [ $ost_last_seq = $mds_last_seq ]; then
- if [ $ost_last_id != $mds_last ]; then
- error "$ost_last != $mds_last_id"
- else
- found=1
- break
- fi
+ for ost_last in $(do_node $node $LCTL get_param -n $param) ; do
+ echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last"
+ ost_last_id=$ost_last
+
+ if $support_last_seq; then
+ ost_last_id=$(echo $ost_last |
+ awk -F':' '{print $2}' |
+ sed -e "s/^0x//g")
+ ost_last_seq=$(echo $ost_last |
+ awk -F':' '{print $1}')
+ [[ $ost_last_seq = $mds_last_seq ]] || continue
+ fi
+
+ if [[ $ost_last_id != $mds_last ]]; then
+ error "$ost_last_id != $mds_last"
+ else
+ found=true
+ break
fi
done
- done
- [ $found = 0 ] && error "can not match last_seq/last_id for $mdtosc"
+ done
+ $found || error "can not match last_seq/last_id for $mdtosc"
return 0
}
run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
df $tdir
dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
- $UMOUNT $tdir
+ $UMOUNT -d $tdir
losetup -d $loopdev
rm $loopdev
}
run_test 56x "lfs migration support"
test_56y() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
+ skip "No HSM support on MDS of $(get_lustre_version)," \
+ "need 2.4.53 at least" && return
local res=""
local dir0=$DIR/$tdir/$testnum
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 [ "$MDCFREE2" -lt "$((MDCFREE - 16))" ]; then
if [ "$MDSFREE" != "$MDSFREE2" ]; then
error "MDC before $MDCFREE != after $MDCFREE2"
else
#run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
# bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
-test_63a() { # was test_63
+# Though this test is irrelevant anymore, it helped to reveal some
+# other grant bugs (LU-4482), let's keep it.
+test_63a() { # was test_63
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
MAX_DIRTY_MB=`lctl get_param -n osc.*.max_dirty_mb | head -n 1`
- lctl set_param -n osc.*.max_dirty_mb 0
for i in `seq 10` ; do
dd if=/dev/zero of=$DIR/f63 bs=8k &
sleep 5
sleep 1
done
- lctl set_param -n osc.*.max_dirty_mb $MAX_DIRTY_MB
rm -f $DIR/f63 || true
}
run_test 63a "Verify oig_wait interruption does not crash ======="
test_101a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322
local s
local discard
local nreads=10000
run_test 101c "check stripe_size aligned read-ahead ================="
set_read_ahead() {
- $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
- $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
+ $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1
+ $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1
}
test_101d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local file=$DIR/$tfile
- local size=${FILESIZE_101c:-500}
+ local sz_MB=${FILESIZE_101d:-500}
local ra_MB=${READAHEAD_MB:-40}
- local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
- [ $space -gt $((size * 1024)) ] ||
- { skip "Need free space ${size}M, have ${space}K" && return; }
+ local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024))
+ [ $free_MB -lt $sz_MB ] &&
+ skip "Need free space ${sz_MB}M, have ${free_MB}M" && return
- echo "Creating test file $file of size ${size}M with ${space}K free space"
+ echo "Create test file $file size ${sz_MB}M, ${free_MB}M free"
$SETSTRIPE -c -1 $file || error "setstripe failed"
- dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
+
+ dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed"
echo Cancel LRU locks on lustre client to flush the client cache
cancel_lru_locks osc
- echo Disable read-ahead
- local old_READAHEAD=$(set_read_ahead 0)
+ echo Disable read-ahead
+ local old_READAHEAD=$(set_read_ahead 0)
- echo Reading the test file $file with read-ahead disabled
- time_ra_OFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size")
+ echo Reading the test file $file with read-ahead disabled
+ local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
- echo Cancel LRU locks on lustre client to flush the client cache
- cancel_lru_locks osc
- echo Enable read-ahead with ${ra_MB}MB
- set_read_ahead $ra_MB
+ echo Cancel LRU locks on lustre client to flush the client cache
+ cancel_lru_locks osc
+ echo Enable read-ahead with ${ra_MB}MB
+ set_read_ahead $ra_MB
- echo Reading the test file $file with read-ahead enabled
- time_ra_ON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size")
+ echo Reading the test file $file with read-ahead enabled
+ local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB")
- echo read-ahead disabled time read $time_ra_OFF
- echo read-ahead enabled time read $time_ra_ON
+ echo "read-ahead disabled time read $raOFF"
+ echo "read-ahead enabled time read $raON"
set_read_ahead $old_READAHEAD
rm -f $file
wait_delete_completed
- [ $time_ra_ON -lt $time_ra_OFF ] ||
- error "read-ahead enabled time read (${time_ra_ON}s) is more than
- read-ahead disabled time read (${time_ra_OFF}s) filesize ${size}M"
+ [ $raOFF -le 1 -o $raON -lt $raOFF ] ||
+ error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M"
}
-run_test 101d "file read with and without read-ahead enabled ================="
+run_test 101d "file read with and without read-ahead enabled"
test_101e() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- local file=$DIR/$tfile
- local size=500 #KB
- local count=100
- local blksize=1024
-
- local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
- local need_space=$((count * size))
- [ $space -gt $need_space ] ||
- { skip_env "Need free space $need_space, have $space" && return; }
-
- echo Creating $count ${size}K test files
- for ((i = 0; i < $count; i++)); do
- dd if=/dev/zero of=${file}_${i} bs=$blksize count=$size 2>/dev/null
- done
+ local file=$DIR/$tfile
+ local size_KB=500 #KB
+ local count=100
+ local bsize=1024
+
+ local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
+ local need_KB=$((count * size_KB))
+ [ $free_KB -le $need_KB ] &&
+ skip_env "Need free space $need_KB, have $free_KB" && return
+
+ echo "Creating $count ${size_KB}K test files"
+ for ((i = 0; i < $count; i++)); do
+ dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null
+ done
- echo Cancel LRU locks on lustre client to flush the client cache
- cancel_lru_locks osc
+ echo "Cancel LRU locks on lustre client to flush the client cache"
+ cancel_lru_locks osc
- echo Reset readahead stats
- $LCTL set_param -n llite.*.read_ahead_stats 0
+ echo "Reset readahead stats"
+ $LCTL set_param -n llite.*.read_ahead_stats 0
- for ((i = 0; i < $count; i++)); do
- dd if=${file}_${i} of=/dev/null bs=$blksize count=$size 2>/dev/null
- done
+ for ((i = 0; i < $count; i++)); do
+ dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null
+ done
- local miss=$($LCTL get_param -n llite.*.read_ahead_stats | \
- get_named_value 'misses' | cut -d" " -f1 | calc_total)
+ local miss=$($LCTL get_param -n llite.*.read_ahead_stats |
+ get_named_value 'misses' | cut -d" " -f1 | calc_total)
- for ((i = 0; i < $count; i++)); do
- rm -rf ${file}_${i} 2>/dev/null
- done
+ for ((i = 0; i < $count; i++)); do
+ rm -rf $file.$i 2>/dev/null
+ done
- #10000 means 20% reads are missing in readahead
- [ $miss -lt 10000 ] || error "misses too much for small reads"
+ #10000 means 20% reads are missing in readahead
+ [ $miss -lt 10000 ] || error "misses too much for small reads"
}
run_test 101e "check read-ahead for small read(1k) for small files(500k)"
cleanup_test102
+getxattr() { # getxattr path name
+ # Return the base64 encoding of the value of xattr name on path.
+ local path=$1
+ local name=$2
+
+ # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path
+ # file: $path
+ # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+ #
+ # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA=
+
+ getfattr --absolute-names --encoding=base64 --name=$name $path |
+ awk -F= -v name=$name '$1 == name {
+ print substr($0, index($0, "=") + 1);
+ }'
+}
+
+test_102n() { # LU-4101 mdt: protect internal xattrs
+ local file0=$DIR/$tfile.0
+ local file1=$DIR/$tfile.1
+ local xattr0=$TMP/$tfile.0
+ local xattr1=$TMP/$tfile.1
+ local name
+ local value
+
+ if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ]
+ then
+ skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
+ return
+ fi
+
+ rm -rf $file0 $file1 $xattr0 $xattr1
+ touch $file0 $file1
+
+ # Get 'before' xattrs of $file1.
+ getfattr --absolute-names --dump --match=- $file1 > $xattr0
+
+ for name in lov lma lmv link fid version som hsm lfsck_namespace; do
+ # Try to copy xattr from $file0 to $file1.
+ value=$(getxattr $file0 trusted.$name 2> /dev/null)
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to set a garbage xattr.
+ value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
+
+ setfattr --name=trusted.$name --value="$value" $file1 ||
+ error "setxattr 'trusted.$name' failed"
+
+ # Try to remove the xattr from $file1. We don't care if this
+ # appears to succeed or fail, we just don't want there to be
+ # any changes or crashes.
+ setfattr --remove=$trusted.$name $file1 2> /dev/null
+ done
+
+ # Get 'after' xattrs of file1.
+ getfattr --absolute-names --dump --match=- $file1 > $xattr1
+
+ if ! diff $xattr0 $xattr1; then
+ error "before and after xattrs of '$file1' differ"
+ fi
+
+ rm -rf $file0 $file1 $xattr0 $xattr1
+
+ return 0
+}
+run_test 102n "silently ignore setxattr on internal trusted xattrs"
+
run_acl_subtest()
{
$LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
echo "ok"
else
echo "failed - QOS mode won't be used"
- error_ignore 0000 "QOS imbalance criteria not met"
+ skip "QOS imbalance criteria not met"
simple_cleanup_common
return
fi
[ $MINC -gt 0 ] &&
echo "Wrote ${FILL}% more files to larger OST $MAXI1"
[ $MAXC -gt $MINC ] ||
- error_ignore 0000 "stripe QOS didn't balance free space"
-
+ error_ignore LU-9 "stripe QOS didn't balance free space"
simple_cleanup_common
}
run_test 116a "stripe QOS: free space balance ==================="
echo "Truncate succeeded."
rm -f $DIR/$tfile
}
-run_test 117 "verify fsfilt_extend =========="
+run_test 117 "verify osd extend =========="
NO_SLOW_RESENDCOUNT=4
export OLD_RESENDCOUNT=""
ENOSPC=28
EFBIG=27
+ rm -rf $DIR/$tdir
test_mkdir -p $DIR/$tdir
- MAX=$(stat -c%s "$DIR/$tdir")
+ # block size of mds1
+ local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
+ local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize)
+ local MAX=$((MDSBLOCKSIZE * 3))
set_dir_limits $MAX
- local I=0
+ local I=$(stat -c%s "$DIR/$tdir")
local J=0
while [ ! $I -gt $MAX ]; do
$MULTIOP $DIR/$tdir/$J Oc
#check two errors ENOSPC for new version of ext4 max_dir_size patch
#mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
#and EFBIG for previous versions
- if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
+ if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then
set_dir_limits 0
echo "return code $rc received as expected"
- multiop $DIR/$tdir/$J Oc
- rc=$?
+ multiop $DIR/$tdir/$J Oc ||
+ error_exit "multiop failed w/o dir size limit"
+
I=$(stat -c%s "$DIR/$tdir")
- if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
- return 0
+
+ if [ $(lustre_version_code $SINGLEMDS) -lt \
+ $(version_code 2.4.51) ]
+ then
+ [ $I -eq $MAX ] && return 0
else
- error_exit "return code $rc current dir size $I " \
- "previous limit $MAX"
+ [ $I -gt $MAX ] && return 0
fi
+ error_exit "current dir size $I, previous limit $MAX"
elif [ $rc -ne 0 ]; then
set_dir_limits 0
error_exit "return code $rc received instead of expected " \
}
run_test 154c "lfs path2fid and fid2path multiple arguments"
+test_154d() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.53) ]] &&
+ skip "Need MDS version at least 2.5.53" && return
+
+ if remote_mds; then
+ nid=$($LCTL list_nids | sed "s/\./\\\./g")
+ else
+ nid="0@lo"
+ fi
+ local proc_ofile="mdt.*.exports.'$nid'.open_files"
+ local fd
+ local cmd
+
+ rm -f $DIR/$tfile
+ touch $DIR/$tfile
+
+ fid=$($LFS path2fid $DIR/$tfile)
+ # Open the file
+ fd=$(free_fd)
+ cmd="exec $fd<$DIR/$tfile"
+ eval $cmd
+ fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile)
+ echo $fid_list | grep $fid
+ rc=$?
+
+ cmd="exec $fd>/dev/null"
+ eval $cmd
+ if [ $rc -ne 0 ]; then
+ error "FID $fid not found in open files list $fid_list"
+ fi
+}
+run_test 154d "Verify open file fid"
+
test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
BEFORE=`roc_hit`
cat $file >/dev/null
AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
-
+ if ! let "AFTER - BEFORE == 0"; then
+ error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
log "Turn on the read cache and turn off the write cache"
set_cache read on
cancel_lru_locks osc
cat $file >/dev/null
AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ if ! let "AFTER - BEFORE == 0"; then
+ error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
log "Read again; it should be satisfied from the cache."
BEFORE=`roc_hit`
#Changelogs
err17935 () {
if [ $MDSCOUNT -gt 1 ]; then
- error_ignore 17935 $*
+ error_ignore bz17935 $*
else
error $*
fi
local pages=${3:-64}
local rc=0
local id
+
+ local count=10
+ local obd_size=$(get_obd_size $node $OBD)
+ local page_size=$(get_page_size $node)
+ if [[ -n "$obd_size" ]]; then
+ local new_count=$((obd_size / (pages * page_size / 1024)))
+ [[ $new_count -ge $count ]] || count=$new_count
+ fi
+
do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" ||
rc=2; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
rc=4; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
- "test_brw 10 w v $pages $id" || rc=4; }
+ "test_brw $count w v $pages $id" || rc=4; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
rc=4; }
[ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
}
run_test 208 "Exclusive open"
+test_209() {
+ [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] &&
+ skip_env "must have disp_stripe" && return
+
+ touch $DIR/$tfile
+ sync; sleep 5; sync;
+
+ echo 3 > /proc/sys/vm/drop_caches
+ req_before=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
+
+ # open/close 500 times
+ for i in $(seq 500); do
+ cat $DIR/$tfile
+ done
+
+ echo 3 > /proc/sys/vm/drop_caches
+ req_after=$(awk '/ptlrpc_cache / { print $2 }' /proc/slabinfo)
+
+ echo "before: $req_before, after: $req_after"
+ [ $((req_after - req_before)) -ge 300 ] &&
+ error "open/close requests are not freed"
+ return 0
+}
+run_test 209 "read-only open/close requests should be freed promptly"
+
test_212() {
size=`date +%s`
size=$((size % 8192 + 1))
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
+
+ # LU-4201
+ dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1
+ $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size"
}
run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
test_229() { # LU-2482, LU-3448
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] &&
+ skip "No HSM support on MDS of $(get_lustre_version)," \
+ "need 2.4.53 at least" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
}
run_test 230a "Create remote directory and files under the remote directory"
-test_230b() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
- local MDTIDX=1
- local remote_dir=$DIR/$tdir/remote_dir
- local rc=0
-
- mkdir -p $DIR/$tdir
- $LFS mkdir -i $MDTIDX $remote_dir ||
- error "create remote directory failed"
-
- $LFS mkdir -i 0 $remote_dir/new_dir &&
- error "nested remote directory create succeed!"
-
- do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=1
- $LFS mkdir -i 0 $remote_dir/new_dir || rc=$?
- do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=0
-
- [ $rc -ne 0 ] &&
- error "create remote directory failed after set enable_remote_dir"
-
- rm -rf $remote_dir || error "first unlink remote directory failed"
-
- $RUNAS -G$RUNAS_GID $LFS mkdir -i $MDTIDX $DIR/$tfile &&
- error "chown worked"
-
- do_facet mds$MDTIDX lctl set_param \
- mdt.*.enable_remote_dir_gid=$RUNAS_GID
- $LFS mkdir -i $MDTIDX $remote_dir || rc=$?
- do_facet mds$MDTIDX lctl set_param mdt.*.enable_remote_dir_gid=0
-
- [ $rc -ne 0 ] &&
- error "create remote dir failed after set enable_remote_dir_gid"
-
- rm -r $DIR/$tdir || error "second unlink remote directory failed"
-}
-run_test 230b "nested remote directory should be failed"
-
test_231a()
{
# For simplicity this test assumes that max_pages_per_rpc
}
run_test 232 "failed lock should not block umount"
-test_233() {
+test_233a() {
[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] ||
{ skip "Need MDS version at least 2.3.64"; return; }
stat $MOUNT/.lustre/fid/$fid > /dev/null ||
error "cannot access $MOUNT using its FID '$fid'"
}
-run_test 233 "checking that OBF of the FS root succeeds"
+run_test 233a "checking that OBF of the FS root succeeds"
+
+test_233b() {
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.90) ] ||
+ { skip "Need MDS version at least 2.5.90"; return; }
+
+ local fid=$($LFS path2fid $MOUNT/.lustre)
+ stat $MOUNT/.lustre/fid/$fid > /dev/null ||
+ error "cannot access $MOUNT/.lustre using its FID '$fid'"
+
+ fid=$($LFS path2fid $MOUNT/.lustre/fid)
+ stat $MOUNT/.lustre/fid/$fid > /dev/null ||
+ error "cannot access $MOUNT/.lustre/fid using its FID '$fid'"
+}
+run_test 233b "checking that OBF of the FS .lustre succeeds"
test_234() {
local p="$TMP/sanityN-$TESTNAME.parameters"
cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
$SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
- exec {FD}<>$file2
+ local fd=$(free_fd)
+ local cmd="exec $fd<>$file2"
+ eval $cmd
rm $file2
- $LFS swap_layouts $file1 /proc/self/fd/${FD} ||
- error "cannot swap layouts of '$file1' and /proc/self/fd/${FD}"
- exec {FD}>&-
+ $LFS swap_layouts $file1 /proc/self/fd/${fd} ||
+ error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}"
+ cmd="exec $fd>&-"
+ eval $cmd
cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
#cleanup
}
run_test 236 "Layout swap on open unlinked file"
+# test to verify file handle related system calls
+# (name_to_handle_at/open_by_handle_at)
+# The new system calls are supported in glibc >= 2.14.
+
+test_237() {
+ echo "Test file_handle syscalls" > $DIR/$tfile
+ check_fhandle_syscalls $DIR/$tfile ||
+ error "check_fhandle_syscalls failed"
+}
+run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls"
+
#
# tests that do cleanup/setup should be run at the end
#
run_test 900 "umount should not race with any mgc requeue thread"
complete $SECONDS
+[ -f $EXT2_DEV ] && rm $EXT2_DEV || true
check_and_cleanup_lustre
if [ "$I_MOUNTED" != "yes" ]; then
lctl set_param debug="$OLDDEBUG" 2> /dev/null || true