#!/bin/bash
-# -*- tab-width: 4; indent-tabs-mode: t; -*-
+# -*- tab-width: 8; indent-tabs-mode: t; -*-
#
# Run select tests by setting ONLY, or as arguments to the script.
# Skip specific tests by setting EXCEPT.
# bug number for skipped tests: LU-2036
ALWAYS_EXCEPT=" 76 $ALWAYS_EXCEPT"
+is_sles11() # LU-4351
+{
+ if [ -r /etc/SuSE-release ]
+ then
+ local vers=`grep VERSION /etc/SuSE-release | awk '{print $3}'`
+ if [ $vers -eq 11 ]
+ then
+ return 0
+ fi
+ fi
+ return 1
+}
+
+if is_sles11; then # LU-4351
+ ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c"
+fi
SRCDIR=$(cd $(dirname $0); echo $PWD)
export PATH=$PATH:/sbin
TMP=${TMP:-/tmp}
+CC=${CC:-cc}
CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
CREATETEST=${CREATETEST:-createtest}
LFS=${LFS:-lfs}
SETUP=${SETUP:-:}
TRACE=${TRACE:-""}
LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
+LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi}
. $LUSTRE/tests/test-framework.sh
init_test_env $@
. ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh}
init_logging
-[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b"
+[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
# bug number for skipped test: LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
DIR=${DIR:-$MOUNT}
assert_DIR
-MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid | \
- awk '{gsub(/_UUID/,""); print $1}' | head -1)
+MDT0=$($LCTL get_param -n mdc.*.mds_server_uuid |
+ awk '{ gsub(/_UUID/,""); print $1 }' | head -n1)
LOVNAME=$($LCTL get_param -n llite.*.lov.common_name | tail -n 1)
OSTCOUNT=$($LCTL get_param -n lov.$LOVNAME.numobd)
STRIPECOUNT=$($LCTL get_param -n lov.$LOVNAME.stripecount)
# LU-4471 - failed rmdir on remote directories still removes directory on MDT0
test_4() {
local MDTIDX=1
- local remote_dir=remote_dir
- test_mkdir $DIR/$remote_dir ||
+ test_mkdir $DIR/$tdir ||
error "Create remote directory failed"
- touch $DIR/$remote_dir/$tfile ||
+ touch $DIR/$tdir/$tfile ||
error "Create file under remote directory failed"
- rmdir $DIR/$remote_dir &&
- error "Expect error removing in-use dir $DIR/$remote_dir"
+ rmdir $DIR/$tdir &&
+ error "Expect error removing in-use dir $DIR/$tdir"
- test -d $DIR/$remote_dir || error "Remote directory disappeared"
+ test -d $DIR/$tdir || error "Remote directory disappeared"
+
+ rm -rf $DIR/$tdir || error "remove remote dir error"
}
run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)"
run_test 17e "symlinks: create recursive symlink (should return error) ===="
test_17f() {
- test_mkdir -p $DIR/d17f
- ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/d17f/111
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/d17f/222
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/d17f/333
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/d17f/444
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/d17f/555
- ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/d17f/666
- ls -l $DIR/d17f
+ test_mkdir -p $DIR/$tdir
+ ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555
+ ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666
+ ls -l $DIR/$tdir
}
run_test 17f "symlinks: long and very long symlink name ========================"
# 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"
+ grep -q '6.5' /etc/redhat-release &>/dev/null &&
+ TESTS="59 60 61 4062 4063"
for i in $TESTS; do
local SYMNAME=$(str_repeat 'x' $i)
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local mdt_idx
test_mkdir -p $DIR/$tdir
- if [ $MDSCOUNT -gt 1 ]; then
+ if [[ $MDSCOUNT -gt 1 ]]; then
mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
else
mdt_idx=0
test_17i() { #bug 20018
remote_mds_nodsh && skip "remote MDS with nodsh" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir
local foo=$DIR/$tdir/$tfile
local mdt_idx
- if [ $MDSCOUNT -gt 1 ]; then
+ if [[ $MDSCOUNT -gt 1 ]]; then
mdt_idx=$($LFS getdirstripe -i $DIR/$tdir)
else
mdt_idx=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"
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [[ -z "$(which rsync 2>/dev/null)" ]] &&
+ skip "no rsync command" && return 0
+ rsync --help | grep -q xattr ||
+ skip_env "$(rsync --version | head -n1) does not support xattrs"
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return 0
test_mkdir -p $DIR/$tdir
test_mkdir -p $DIR/$tdir.new
touch $DIR/$tdir/$tfile
run_test 17k "symlinks: rsync with xattrs enabled ========================="
test_17l() { # LU-279
+ [[ -z "$(which getfattr 2>/dev/null)" ]] &&
+ skip "no getfattr command" && return 0
mkdir -p $DIR/$tdir
touch $DIR/$tdir/$tfile
ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk
[ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
skip "only for ldiskfs MDT" && return 0
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- mkdir -p $DIR/$tdir
+ mkdir $DIR/$tdir
for ((i=0; i<10; i++)); do
- $LFS mkdir -i 1 $DIR/$tdir/remote_dir_${i} ||
+ $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} ||
error "create remote dir error $i"
createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
error "create files under remote dir failed $i"
done
- check_fs_consistency_17n || error "e2fsck report error"
+ check_fs_consistency_17n ||
+ error "e2fsck report error after create files under remote dir"
+
+ for ((i=0;i<10;i++)); do
+ rm -rf $DIR/$tdir/remote_dir_${i} ||
+ error "destroy remote dir error $i"
+ done
+
+ check_fs_consistency_17n ||
+ error "e2fsck report error after unlink files under remote dir"
+
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] &&
+ skip "lustre < 2.4.50 does not support migrate mv " && return
+
+ for ((i=0; i<10; i++)); do
+ mkdir -p $DIR/$tdir/remote_dir_${i}
+ createmany -o $DIR/$tdir/remote_dir_${i}/f 10 ||
+ error "create files under remote dir failed $i"
+ $LFS mv -M 1 $DIR/$tdir/remote_dir_${i} ||
+ error "migrate remote dir error $i"
+ done
+ check_fs_consistency_17n || error "e2fsck report error after migration"
for ((i=0;i<10;i++)); do
rm -rf $DIR/$tdir/remote_dir_${i} ||
error "destroy remote dir error $i"
done
- check_fs_consistency_17n || error "e2fsck report error"
+ check_fs_consistency_17n || error "e2fsck report error after unlink"
}
run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
test_17o() {
- [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ]] &&
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ] &&
skip "Need MDS version at least 2.3.64" && return
local WDIR=$DIR/${tdir}o
run_test 17o "stat file with incompat LMA feature"
test_18() {
- touch $DIR/f || error "Failed to touch $DIR/f: $?"
+ touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?"
ls $DIR || error "Failed to ls $DIR: $?"
}
run_test 18 "touch .../f ; ls ... =============================="
run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
test_24u() { # bug12192
- rm -rf $DIR/$tfile
$MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error
$CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size"
}
}
max_pages_per_rpc() {
- $LCTL get_param -n mdc.*.max_pages_per_rpc | head -1
+ $LCTL get_param -n mdc.*.max_pages_per_rpc | head -n1
}
test_24v() {
local NRFILES=100000
local FREE_INODES=$(mdt_free_inodes 0)
- [ $FREE_INODES -lt $NRFILES ] && \
+ [[ $FREE_INODES -lt $NRFILES ]] &&
skip "not enough free inodes $FREE_INODES required $NRFILES" &&
return
DIRENT_SIZE=48
RPC_SIZE=$(($(max_pages_per_rpc) * $(page_size)))
RPC_NUM=$(((NRFILES * DIRENT_SIZE + RPC_SIZE - 1) / RPC_SIZE + 1))
- mds_readpage=$(lctl get_param mdc.*MDT0000*.stats | \
+ mds_readpage=$(lctl get_param mdc.*MDT0000*.stats |
awk '/^mds_readpage/ {print $2}')
- [ $mds_readpage -gt $RPC_NUM ] && \
+ [[ $mds_readpage -gt $RPC_NUM ]] &&
error "large readdir doesn't take effect"
simple_cleanup_common
dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2
dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3
SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'`
- [ "$SZ1" = "$SZ2" ] || \
+ [[ "$SZ1" -eq "$SZ2" ]] ||
error "Error reading at the end of the file $tfile"
}
run_test 24w "Reading a file larger than 4Gb"
test_24x() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
run_test 24x "cross rename/link should be failed"
test_24y() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
run_test 24y "rename/link on the same dir should succeed"
test_24z() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local MDTIDX=1
local remote_src=$DIR/$tdir/remote_dir
rm -rf $DIR/$tdir
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NFILES
- local t=`ls $DIR/$tdir | wc -l`
- local u=`ls $DIR/$tdir | sort -u | wc -l`
- if [ $t -ne $NFILES -o $u -ne $NFILES ] ; then
- error "Expected $NFILES files, got $t ($u unique)"
+ local t=$(ls $DIR/$tdir | wc -l)
+ local u=$(ls $DIR/$tdir | sort -u | wc -l)
+ local v=$(ls -ai $DIR/$tdir | sort -u | wc -l)
+ if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then
+ error "Expected $NFILES files, got $t ($u unique $v .&..)"
fi
rm -rf $DIR/$tdir || error "Can not delete directories"
}
run_test 24A "readdir() returns correct number of entries."
+test_24B() { # LU-4805
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local count
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir ||
+ error "create striped dir failed"
+
+ count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
+ [ $count -eq 2 ] || error "Expected 2, got $count"
+
+ touch $DIR/$tdir/striped_dir/a
+
+ count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
+ [ $count -eq 3 ] || error "Expected 3, got $count"
+
+ touch $DIR/$tdir/striped_dir/.f
+
+ count=$(ls -ai $DIR/$tdir/striped_dir | wc -l)
+ [ $count -eq 4 ] || error "Expected 4, got $count"
+
+ rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24B "readdir for striped dir return correct number of entries"
+
+test_24C() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ mkdir $DIR/$tdir/d0
+ mkdir $DIR/$tdir/d1
+
+ $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir ||
+ error "create striped dir failed"
+
+ cd $DIR/$tdir/d0/striped_dir
+
+ local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}')
+ local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}')
+ local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
+
+ [ "$d0_ino" = "$parent_ino" ] ||
+ error ".. wrong, expect $d0_ino, get $parent_ino"
+
+ mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ ||
+ error "mv striped dir failed"
+
+ parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}')
+
+ [ "$d1_ino" = "$parent_ino" ] ||
+ error ".. wrong after mv, expect $d1_ino, get $parent_ino"
+}
+run_test 24C "check .. in striped dir"
+
test_25a() {
echo '== symlink sanity ============================================='
$GETSTRIPE $DIR/d27
$SETSTRIPE -c 1 $DIR/d27/f0 || error "setstripe failed"
$CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed"
- pass
log "== test_27a: write to one stripe file ========================="
cp /etc/hosts $DIR/d27/f0 || error
}
run_test 27a "one stripe file =================================="
test_27b() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
test_mkdir -p $DIR/d27
$SETSTRIPE -c 2 $DIR/d27/f01 || error "setstripe failed"
$GETSTRIPE -c $DIR/d27/f01
test_27i() {
touch $DIR/d27/fsome || error "touch failed"
- [ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ] || error "missing objects"
+ [[ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ]] || error "missing objects"
}
run_test 27i "$GETSTRIPE with some objects"
run_test 27l "check setstripe permissions (should return error)"
test_27m() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" &&
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" &&
return
- if [ $ORIGFREE -gt $MAXFREE ]; then
+ if [[ $ORIGFREE -gt $MAXFREE ]]; then
skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
return
fi
error "dd should fill OST0"
i=2
while $SETSTRIPE -i 0 -c 1 $DIR/$tdir/f27m_$i; do
- i=`expr $i + 1`
+ i=$((i + 1))
[ $i -gt 256 ] && break
done
- i=`expr $i + 1`
+ i=$((i + 1))
touch $DIR/$tdir/f27m_$i
[ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] &&
error "OST0 was full but new created file still use it"
- i=`expr $i + 1`
+ i=$((i + 1))
touch $DIR/$tdir/f27m_$i
[ `$GETSTRIPE $DIR/$tdir/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] &&
error "OST0 was full but new created file still use it"
}
test_27n() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 27n "create file with some full OSTs =================="
test_27o() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 27o "create file with all full OSTs (should error) ===="
test_27p() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 27p "append to a truncated file with some full OSTs ==="
test_27q() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 27q "append to truncated file with all OSTs full (should error) ==="
test_27r() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
test_27t() { # bug 10864
- WDIR=`pwd`
- WLFS=`which lfs`
- cd $DIR
- touch $tfile
- $WLFS getstripe $tfile
- cd $WDIR
+ WDIR=$(pwd)
+ WLFS=$(which lfs)
+ cd $DIR
+ touch $tfile
+ $WLFS getstripe $tfile
+ cd $WDIR
}
run_test 27t "check that utils parse path correctly"
test_27u() { # bug 4900
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
local index
local list=$(comma_list $(mdts_nodes))
TLOG=$DIR/$tfile.getstripe
$GETSTRIPE $DIR/$tdir > $TLOG
- OBJS=`awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj;}' $TLOG`
+ OBJS=$(awk -vobj=0 '($1 == 0) { obj += 1 } END { print obj; }' $TLOG)
unlinkmany $DIR/$tdir/t- 1000
- [ $OBJS -gt 0 ] && \
- error "$OBJS objects created on OST-0. See $TLOG" || pass
+ [[ $OBJS -gt 0 ]] &&
+ error "$OBJS objects created on OST-0. See $TLOG" || pass
}
run_test 27u "skip object creation on OSC w/o objects =========="
test_27v() { # bug 4900
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
remote_ost_nodsh && skip "remote OST with nodsh" && return
run_test 27w "check $SETSTRIPE -S option"
test_27wa() {
- [ "$OSTCOUNT" -lt "2" ] &&
- skip_env "skipping multiple stripe count/offset test" && return
+ [[ $OSTCOUNT -lt 2 ]] &&
+ skip_env "skipping multiple stripe count/offset test" && return
test_mkdir -p $DIR/$tdir || error "mkdir failed"
for i in $(seq 1 $OSTCOUNT); do
test_27x() {
remote_ost_nodsh && skip "remote OST with nodsh" && return
- [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
OFFSET=$(($OSTCOUNT - 1))
OSTIDX=0
run_test 27x "create files while OST0 is degraded"
test_27y() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && return
+ [[ $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
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
osc.$mdtosc.prealloc_next_id)
local fcount=$((last_id - next_id))
- [ $fcount -eq 0 ] && skip "not enough space on OST0" && return
- [ $fcount -gt $OSTCOUNT ] && fcount=$OSTCOUNT
+ [[ $fcount -eq 0 ]] && skip "not enough space on OST0" && return
+ [[ $fcount -gt $OSTCOUNT ]] && fcount=$OSTCOUNT
local MDS_OSCS=$(do_facet $SINGLEMDS lctl dl |
awk '/[oO][sS][cC].*md[ts]/ { print $4 }')
run_test 27B "call setstripe on open unlinked file/rename victim"
test_27C() { #LU-2871
- [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs" && return
declare -a ost_idx
local index
let LOCKUNUSEDCOUNTCURRENT=$LOCKUNUSEDCOUNTCURRENT+$unused_count
done
- if [ "$LOCKCOUNTCURRENT" -gt "$LOCKCOUNTORIG" ]; then
- lctl set_param -n ldlm.dump_namespaces ""
+ if [[ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]]; then
+ $LCTL set_param -n ldlm.dump_namespaces ""
error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
$LCTL dk | sort -k4 -t: > $TMP/test_29.dk
log "dumped log to $TMP/test_29.dk (bug 5793)"
return 2
fi
- if [ "$LOCKUNUSEDCOUNTCURRENT" -gt "$LOCKUNUSEDCOUNTORIG" ]; then
+ if [[ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]]; then
error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
$LCTL dk | sort -k4 -t: > $TMP/test_29.dk
log "dumped log to $TMP/test_29.dk (bug 5793)"
run_test 29 "IT_GETATTR regression ============================"
test_30a() { # was test_30
- cp `which ls` $DIR || cp /bin/ls $DIR
+ cp $(which ls) $DIR || cp /bin/ls $DIR
$DIR/ls / || error
rm $DIR/ls
}
done
wait
local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
- [ $LINKS -gt 1 ] && ls $DIR/$tdir &&
+ [[ $LINKS -gt 1 ]] && ls $DIR/$tdir &&
error "$LINKS duplicate links to $tfile.$LOOP" &&
break || true
done
}
run_test 31o "duplicate hard links with same filename"
+test_31p() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir
+
+ opendirunlink $DIR/$tdir/striped_dir/test1 ||
+ error "open unlink test1 failed"
+ opendirunlink $DIR/$tdir/striped_dir/test2 ||
+ error "open unlink test2 failed"
+
+ $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 ||
+ error "test1 still exists"
+ $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 ||
+ error "test2 still exists"
+}
+run_test 31p "remove of open striped directory"
+
cleanup_test32_mount() {
trap 0
$UMOUNT -d $DIR/$tdir/ext2-mountpoint
run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
test_32o() {
- rm -fr $DIR/d32o $DIR/$tfile
touch $DIR/$tfile
test_mkdir -p $DIR/d32o/tmp
TMP_DIR=$DIR/d32o/tmp
run_test 33c "test llobdstat and write_bytes"
test_33d() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
local MDTIDX=1
local remote_dir=$DIR/$tdir/remote_dir
}
run_test 33d "openfile with 444 modes and malformed flags under remote dir"
+test_33e() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ local l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode"
+
+ rmdir $DIR/$tdir/* || error "rmdir failed"
+
+ umask 777
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777"
+
+ rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed"
+
+ umask 000
+ $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir
+ $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1
+ mkdir $DIR/$tdir/local_dir
+
+ s0_mode=$(stat -c%f $DIR/$tdir/striped_dir)
+ s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1)
+ l_mode=$(stat -c%f $DIR/$tdir/local_dir)
+
+ [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] ||
+ error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0"
+}
+run_test 33e "mkdir and striped directory should have same mode"
+
TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
test_34a() {
rm -f $DIR/f34
echo "fmd_before: $fmd_before"
echo "fmd_after: $fmd_after"
- [ "$fmd_after" -gt "$fmd_before" ] && \
- echo "AFTER: $fmd_after > BEFORE: $fmd_before" && \
+ [[ $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 ====================="
}
run_test 36h "utime on file racing with OST BRW write =========="
+test_36i() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir
+
+ local mtime=$(stat -c%Y $DIR/$tdir/striped_dir)
+ local new_mtime=$((mtime + 200))
+
+ #change Modify time of striped dir
+ touch -m -d @$new_mtime $DIR/$tdir/striped_dir ||
+ error "change mtime failed"
+
+ local got=$(stat -c%Y $DIR/$tdir/striped_dir)
+
+ [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got"
+}
+run_test 36i "change mtime on striped directory"
+
# test_37 - duplicate with tests 32q 32r
test_38() {
run_test 39 "mtime changed on create ==========================="
test_39b() {
- test_mkdir -p $DIR/$tdir
+ test_mkdir -p -c1 $DIR/$tdir
cp -p /etc/passwd $DIR/$tdir/fopen
cp -p /etc/passwd $DIR/$tdir/flink
cp -p /etc/passwd $DIR/$tdir/funlink
run_test 39o "directory cached attributes updated after create ========"
test_39p() {
- [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return
local MDTIDX=1
TESTDIR=$DIR/$tdir/$tfile
[ -e $TESTDIR ] && rm -rf $TESTDIR
run_test 41 "test small file write + fstat ====================="
count_ost_writes() {
- lctl get_param -n osc.*.stats |
- awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
+ lctl get_param -n osc.*.stats |
+ awk -vwrites=0 '/ost_write/ { writes += $2 } \
+ END { printf("%0.0f", writes) }'
}
# decent default
setup_test42
cancel_lru_locks osc
stop_writeback
- sync
- dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
- BEFOREWRITES=`count_ost_writes`
- $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
- AFTERWRITES=`count_ost_writes`
- if [ $BEFOREWRITES -lt $AFTERWRITES ]; then
- error "$BEFOREWRITES < $AFTERWRITES on unlink"
- fi
- BEFOREWRITES=`count_ost_writes`
- sync || error "sync: $?"
- AFTERWRITES=`count_ost_writes`
- if [ $BEFOREWRITES -lt $AFTERWRITES ]; then
- error "$BEFOREWRITES < $AFTERWRITES on sync"
- fi
- dmesg | grep 'error from obd_brw_async' && error 'error writing back'
+ sync
+ dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
+ BEFOREWRITES=$(count_ost_writes)
+ $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
+ AFTERWRITES=$(count_ost_writes)
+ if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
+ error "$BEFOREWRITES < $AFTERWRITES on unlink"
+ fi
+ BEFOREWRITES=$(count_ost_writes)
+ sync || error "sync: $?"
+ AFTERWRITES=$(count_ost_writes)
+ if [[ $BEFOREWRITES -lt $AFTERWRITES ]]; then
+ error "$BEFOREWRITES < $AFTERWRITES on sync"
+ fi
+ dmesg | grep 'error from obd_brw_async' && error 'error writing back'
start_writeback
- return 0
+ return 0
}
run_test 42b "test destroy of file with cached dirty data ======"
dd if=/dev/zero of=$TDIR/w$i bs="$max_dirty_mb"M count=1
break
done
- [ $i -gt $warmup_files ] && error "OST0 is still cold"
+ [[ $i -gt $warmup_files ]] && error "OST0 is still cold"
sync
$LCTL get_param $proc_osc0/cur_dirty_bytes
$LCTL get_param $proc_osc0/cur_grant_bytes
$have_ppr || continue
# we only want the percent stat for < 16 pages
- [ $(echo $PPR | tr -d ':') -ge $pages ] && break
+ [[ $(echo $PPR | tr -d ':') -ge $pages ]] && break
percent=$((percent + WPCT))
- if [ $percent -gt 15 ]; then
+ if [[ $percent -gt 15 ]]; then
error "less than 16-pages write RPCs" \
"$percent% > 15%"
break
run_test 43c "md5sum of copy into lustre========================"
test_44() {
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
dd if=$DIR/f1 bs=4k count=1 > /dev/null
}
run_test 44 "zero length read from a sparse stripe ============="
test_44a() {
- local nstripe=`$LCTL lov_getconfig $DIR | grep default_stripe_count: | \
- awk '{print $2}'`
- [ -z "$nstripe" ] && skip "can't get stripe info" && return
- [ "$nstripe" -gt "$OSTCOUNT" ] && skip "Wrong default_stripe_count: $nstripe (OSTCOUNT: $OSTCOUNT)" && return
- local stride=`$LCTL lov_getconfig $DIR | grep default_stripe_size: | \
- awk '{print $2}'`
- if [ $nstripe -eq 0 -o $nstripe -eq -1 ] ; then
- nstripe=`$LCTL lov_getconfig $DIR | grep obd_count: | awk '{print $2}'`
- fi
+ local nstripe=$($LCTL lov_getconfig $DIR | grep default_stripe_count: |
+ awk '{ print $2 }')
+ [ -z "$nstripe" ] && skip "can't get stripe info" && return
+ [[ $nstripe -gt $OSTCOUNT ]] &&
+ skip "Wrong default_stripe_count: $nstripe (OSTCOUNT: $OSTCOUNT)" &&
+ return
+ local stride=$($LCTL lov_getconfig $DIR | grep default_stripe_size: |
+ awk '{ print $2 }')
+ if [[ $nstripe -eq 0 || $nstripe -eq -1 ]]; then
+ nstripe=$($LCTL lov_getconfig $DIR | grep obd_count: |
+ awk '{ print $2 }')
+ fi
- OFFSETS="0 $((stride/2)) $((stride-1))"
- for offset in $OFFSETS ; do
- for i in `seq 0 $((nstripe-1))`; do
- local GLOBALOFFSETS=""
- local size=$((((i + 2 * $nstripe )*$stride + $offset))) # Bytes
- local myfn=$DIR/d44a-$size
- echo "--------writing $myfn at $size"
- ll_sparseness_write $myfn $size || error "ll_sparseness_write"
- GLOBALOFFSETS="$GLOBALOFFSETS $size"
- ll_sparseness_verify $myfn $GLOBALOFFSETS \
- || error "ll_sparseness_verify $GLOBALOFFSETS"
-
- for j in `seq 0 $((nstripe-1))`; do
- size=$((((j + $nstripe )*$stride + $offset))) # Bytes
- ll_sparseness_write $myfn $size || error "ll_sparseness_write"
- GLOBALOFFSETS="$GLOBALOFFSETS $size"
- done
- ll_sparseness_verify $myfn $GLOBALOFFSETS \
- || error "ll_sparseness_verify $GLOBALOFFSETS"
- rm -f $myfn
- done
- done
+ OFFSETS="0 $((stride/2)) $((stride-1))"
+ for offset in $OFFSETS; do
+ for i in $(seq 0 $((nstripe-1))); do
+ local GLOBALOFFSETS=""
+ # size in Bytes
+ local size=$((((i + 2 * $nstripe )*$stride + $offset)))
+ local myfn=$DIR/d44a-$size
+ echo "--------writing $myfn at $size"
+ ll_sparseness_write $myfn $size ||
+ error "ll_sparseness_write"
+ GLOBALOFFSETS="$GLOBALOFFSETS $size"
+ ll_sparseness_verify $myfn $GLOBALOFFSETS ||
+ error "ll_sparseness_verify $GLOBALOFFSETS"
+
+ for j in $(seq 0 $((nstripe-1))); do
+ # size in Bytes
+ size=$((((j + $nstripe )*$stride + $offset)))
+ ll_sparseness_write $myfn $size ||
+ error "ll_sparseness_write"
+ GLOBALOFFSETS="$GLOBALOFFSETS $size"
+ done
+ ll_sparseness_verify $myfn $GLOBALOFFSETS ||
+ error "ll_sparseness_verify $GLOBALOFFSETS"
+ rm -f $myfn
+ done
+ done
}
run_test 44a "test sparse pwrite ==============================="
stop_writeback
sync
do_dirty_record "echo blah > $f"
- [ $before -eq $after ] && error "write wasn't cached"
+ [[ $before -eq $after ]] && error "write wasn't cached"
do_dirty_record "> $f"
- [ $before -gt $after ] || error "truncate didn't lower dirty count"
+ [[ $before -gt $after ]] || error "truncate didn't lower dirty count"
do_dirty_record "echo blah > $f"
- [ $before -eq $after ] && error "write wasn't cached"
+ [[ $before -eq $after ]] && error "write wasn't cached"
do_dirty_record "sync"
- [ $before -gt $after ] || error "writeback didn't lower dirty count"
+ [[ $before -gt $after ]] || error "writeback didn't lower dirty count"
do_dirty_record "echo blah > $f"
- [ $before -eq $after ] && error "write wasn't cached"
+ [[ $before -eq $after ]] && error "write wasn't cached"
do_dirty_record "cancel_lru_locks osc"
- [ $before -gt $after ] || error "lock cancellation didn't lower dirty count"
+ [[ $before -gt $after ]] ||
+ error "lock cancellation didn't lower dirty count"
start_writeback
}
run_test 45 "osc io page accounting ============================"
test_49() { # LU-1030
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# get ost1 size - lustre-OST0000
- ost1_size=$(do_facet ost1 lfs df |grep ${ost1_svc} |awk '{print $4}')
+ ost1_size=$(do_facet ost1 $LFS df | grep ${ost1_svc} |
+ awk '{ print $4 }')
# write 800M at maximum
- [ $ost1_size -gt 819200 ] && ost1_size=819200
+ [[ $ost1_size -lt 2 ]] && ost1_size=2
+ [[ $ost1_size -gt 819200 ]] && ost1_size=819200
- lfs setstripe -c 1 -i 0 $DIR/$tfile
+ $SETSTRIPE -c 1 -i 0 $DIR/$tfile
dd if=/dev/zero of=$DIR/$tfile bs=4k count=$((ost1_size >> 2)) &
local dd_pid=$!
# change max_pages_per_rpc while writing the file
local osc1_mppc=osc.$(get_osc_import_name client ost1).max_pages_per_rpc
- local orig_mppc=`$LCTL get_param -n $osc1_mppc`
+ local orig_mppc=$($LCTL get_param -n $osc1_mppc)
# loop until dd process exits
while ps ax -opid | grep -wq $dd_pid; do
$LCTL set_param $osc1_mppc=$((RANDOM % 256 + 1))
test_51a() { # was test_51
# bug 1516 - create an empty entry right after ".." then split dir
- test_mkdir -p $DIR/$tdir
+ test_mkdir -c1 $DIR/$tdir
touch $DIR/$tdir/foo
$MCREATE $DIR/$tdir/bar
rm $DIR/$tdir/foo
createmany -m $DIR/$tdir/longfile 201
FNUM=202
- while [ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]; do
+ while [[ $(ls -sd $DIR/$tdir | awk '{ print $1 }') -eq 4 ]]; do
$MCREATE $DIR/$tdir/longfile$FNUM
FNUM=$(($FNUM + 1))
echo -n "+"
# cleanup the directory
rm -fr $BASE
- test_mkdir -p $BASE
+ test_mkdir -p -c1 $BASE
local mdtidx=$(printf "%04x" $($LFS getstripe -M $BASE))
local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
- [ $numfree -lt 21000 ] && skip "not enough free inodes ($numfree)" &&
+ [[ $numfree -lt 21000 ]] && skip "not enough free inodes ($numfree)" &&
return
- [ $numfree -lt $NUMTEST ] && NUMTEST=$(($numfree - 50)) &&
+ [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
echo "reduced count to $NUMTEST due to inodes"
# need to check free space for the directories as well
local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
numfree=$((blkfree / 4))
- [ $numfree -lt $NUMTEST ] && NUMTEST=$(($numfree - 50)) &&
+ [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
echo "reduced count to $NUMTEST due to blocks"
createmany -d $BASE/d $NUMTEST && echo $NUMTEST > $BASE/fnum ||
# regardless of whether the backing filesystem tracks nlink accurately
# or not, the nlink count shouldn't be more than "." and ".." here
local AFTER=$(stat -c %h $BASE)
- [ $AFTER -gt 2 ] && error "nlink after: $AFTER > 2" ||
+ [[ $AFTER -gt 2 ]] && error "nlink after: $AFTER > 2" ||
echo "nlink after: $AFTER"
}
run_test 51ba "verify nlink for many subdirectory cleanup"
test_51d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ "$OSTCOUNT" -lt "3" ] && skip_env "skipping test with few OSTs" && return
- test_mkdir -p $DIR/$tdir
- createmany -o $DIR/$tdir/t- 1000
- $GETSTRIPE $DIR/$tdir > $TMP/files
- for N in `seq 0 $((OSTCOUNT - 1))`; do
- OBJS[$N]=`awk -vobjs=0 '($1 == '$N') { objs += 1 } END { print objs;}' $TMP/files`
- OBJS0[$N]=`grep -A 1 idx $TMP/files | awk -vobjs=0 '($1 == '$N') { objs += 1 } END { print objs;}'`
- log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
- done
- unlinkmany $DIR/$tdir/t- 1000
-
- NLAST=0
- for N in `seq 1 $((OSTCOUNT - 1))`; do
- [ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ] && \
- error "OST $N has less objects vs OST $NLAST (${OBJS[$N]} < ${OBJS[$NLAST]}"
- [ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ] && \
- error "OST $N has less objects vs OST $NLAST (${OBJS[$N]} < ${OBJS[$NLAST]}"
-
- [ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ] && \
- error "OST $N has less #0 objects vs OST $NLAST (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
- [ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ] && \
- error "OST $N has less #0 objects vs OST $NLAST (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
- NLAST=$N
- done
+ [[ $OSTCOUNT -lt 3 ]] &&
+ skip_env "skipping test with few OSTs" && return
+ test_mkdir -p $DIR/$tdir
+ createmany -o $DIR/$tdir/t- 1000
+ $GETSTRIPE $DIR/$tdir > $TMP/files
+ for N in $(seq 0 $((OSTCOUNT - 1))); do
+ OBJS[$N]=$(awk -vobjs=0 '($1 == '$N') { objs += 1 } \
+ END { printf("%0.0f", objs) }' $TMP/files)
+ OBJS0[$N]=$(grep -A 1 idx $TMP/files | awk -vobjs=0 \
+ '($1 == '$N') { objs += 1 } \
+ END { printf("%0.0f", objs) }')
+ log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
+ done
+ unlinkmany $DIR/$tdir/t- 1000
+
+ NLAST=0
+ for N in $(seq 1 $((OSTCOUNT - 1))); do
+ [[ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ]] &&
+ error "OST $N has less objects vs OST $NLAST" \
+ " (${OBJS[$N]} < ${OBJS[$NLAST]}"
+ [[ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ]] &&
+ error "OST $N has less objects vs OST $NLAST" \
+ " (${OBJS[$N]} < ${OBJS[$NLAST]}"
+
+ [[ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ]] &&
+ error "OST $N has less #0 objects vs OST $NLAST" \
+ " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
+ [[ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ]] &&
+ error "OST $N has less #0 objects vs OST $NLAST" \
+ " (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
+ NLAST=$N
+ done
}
run_test 51d "check object distribution ===================="
loopdev="$DIR/loop54c"
trap 0
- $UMOUNT -d $tdir || rc=$?
+ $UMOUNT -d $DIR/$tdir || rc=$?
losetup -d $loopdev || true
- rm $loopdev
+ losetup -d $LOOPDEV || true
+ rm -rf $loopdev $DIR/$tfile $DIR/$tdir
return $rc
}
test_54c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- tfile="$DIR/f54c"
- tdir="$DIR/d54c"
loopdev="$DIR/loop54c"
find_loop_dev
[ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
- mknod $loopdev b 7 $LOOPNUM
- echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
- dd if=/dev/zero of=$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
- losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
trap cleanup_54c EXIT
+ mknod $loopdev b 7 $LOOPNUM
+ echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)."
+ dd if=/dev/zero of=$DIR/$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null
+ losetup $loopdev $DIR/$tfile ||
+ error "can't set up $loopdev for $DIR/$tfile"
mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
- test_mkdir -p $tdir
- mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir"
- dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
- df $tdir
- dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
+ test_mkdir -p $DIR/$tdir
+ mount -t ext2 $loopdev $DIR/$tdir ||
+ error "error mounting $loopdev on $DIR/$tdir"
+ dd if=/dev/zero of=$DIR/$tdir/tmp bs=$(get_page_size client) count=30 ||
+ error "dd write"
+ df $DIR/$tdir
+ dd if=$DIR/$tdir/tmp of=/dev/zero bs=$(get_page_size client) count=30 ||
+ error "dd read"
cleanup_54c
}
run_test 54c "block device works in lustre ====================="
test_mkdir -p $DIR/$tdir/dir
NUMFILES=3
NUMFILESx2=$(($NUMFILES * 2))
- for i in `seq 1 $NUMFILES` ; do
+ for i in $(seq 1 $NUMFILES); do
touch $DIR/$tdir/file$i
touch $DIR/$tdir/dir/file$i
done
# test lfs getstripe with --recursive
- FILENUM=`$GETSTRIPE --recursive $DIR/$tdir | grep -c obdidx`
- [ $FILENUM -eq $NUMFILESx2 ] ||
- error "$GETSTRIPE --recursive: found $FILENUM, not $NUMFILESx2"
- FILENUM=`$GETSTRIPE $DIR/$tdir | grep -c obdidx`
- [ $FILENUM -eq $NUMFILES ] ||
- error "$GETSTRIPE $DIR/$tdir: found $FILENUM, not $NUMFILES"
- echo "$GETSTRIPE --recursive passed."
+ FILENUM=$($GETSTRIPE --recursive $DIR/$tdir | grep -c obdidx)
+ [[ $FILENUM -eq $NUMFILESx2 ]] ||
+ error "$GETSTRIPE --recursive: found $FILENUM, not $NUMFILESx2"
+ FILENUM=$($GETSTRIPE $DIR/$tdir | grep -c obdidx)
+ [[ $FILENUM -eq $NUMFILES ]] ||
+ error "$GETSTRIPE $DIR/$tdir: found $FILENUM, not $NUMFILES"
+ echo "$GETSTRIPE --recursive passed."
# test lfs getstripe with file instead of dir
- FILENUM=`$GETSTRIPE $DIR/$tdir/file1 | grep -c obdidx`
- [ $FILENUM -eq 1 ] || error \
- "$GETSTRIPE $DIR/$tdir/file1: found $FILENUM, not 1"
- echo "$GETSTRIPE file1 passed."
+ FILENUM=$($GETSTRIPE $DIR/$tdir/file1 | grep -c obdidx)
+ [[ $FILENUM -eq 1 ]] ||
+ error "$GETSTRIPE $DIR/$tdir/file1: found $FILENUM, not 1"
+ echo "$GETSTRIPE file1 passed."
#test lfs getstripe with --verbose
- [ `$GETSTRIPE --verbose $DIR/$tdir |
- grep -c lmm_magic` -eq $NUMFILES ] ||
- error "$GETSTRIPE --verbose $DIR/$tdir: want $NUMFILES"
- [ `$GETSTRIPE $DIR/$tdir | grep -c lmm_magic` -eq 0 ] ||
- error "$GETSTRIPE $DIR/$tdir: showed lmm_magic"
- echo "$GETSTRIPE --verbose passed."
+ [[ $($GETSTRIPE --verbose $DIR/$tdir |
+ grep -c lmm_magic) -eq $NUMFILES ]] ||
+ error "$GETSTRIPE --verbose $DIR/$tdir: want $NUMFILES"
+ [[ $($GETSTRIPE $DIR/$tdir | grep -c lmm_magic) -eq 0 ]] ||
+ rror "$GETSTRIPE $DIR/$tdir: showed lmm_magic"
+ echo "$GETSTRIPE --verbose passed."
#test lfs getstripe with --obd
$GETSTRIPE --obd wrong_uuid $DIR/$tdir 2>&1 |
- grep -q "unknown obduuid" ||
- error "$GETSTRIPE --obd wrong_uuid should return error message"
+ grep -q "unknown obduuid" ||
+ error "$GETSTRIPE --obd wrong_uuid should return error message"
- [ "$OSTCOUNT" -lt 2 ] &&
+ [[ $OSTCOUNT -lt 2 ]] &&
skip_env "skipping other $GETSTRIPE --obd test" && return
OSTIDX=1
OBDUUID=$(ostuuid_from_index $OSTIDX)
- FILENUM=`$GETSTRIPE -ir $DIR/$tdir | grep -x $OSTIDX | wc -l`
- FOUND=`$GETSTRIPE -r --obd $OBDUUID $DIR/$tdir | grep obdidx | wc -l`
- [ $FOUND -eq $FILENUM ] ||
- error "$GETSTRIPE --obd wrong: found $FOUND, expected $FILENUM"
- [ `$GETSTRIPE -r -v --obd $OBDUUID $DIR/$tdir |
- sed '/^[ ]*'${OSTIDX}'[ ]/d' |
- sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l` -eq 0 ] ||
- error "$GETSTRIPE --obd: should not show file on other obd"
- echo "$GETSTRIPE --obd passed"
+ FILENUM=$($GETSTRIPE -ir $DIR/$tdir | grep "^$OSTIDX\$" | wc -l)
+ FOUND=$($GETSTRIPE -r --obd $OBDUUID $DIR/$tdir | grep obdidx | wc -l)
+ [[ $FOUND -eq $FILENUM ]] ||
+ error "$GETSTRIPE --obd wrong: found $FOUND, expected $FILENUM"
+ [[ $($GETSTRIPE -r -v --obd $OBDUUID $DIR/$tdir |
+ sed '/^[ ]*'${OSTIDX}'[ ]/d' |
+ sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l) -eq 0 ]] ||
+ error "$GETSTRIPE --obd: should not show file on other obd"
+ echo "$GETSTRIPE --obd passed"
}
run_test 56a "check $GETSTRIPE"
TDIR=$DIR/${tdir}s
setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT"
- if [ $OSTCOUNT -gt 1 ]; then
+ if [[ $OSTCOUNT -gt 1 ]]; then
$SETSTRIPE -c 1 $TDIR/$tfile.{0,1,2,3}
ONESTRIPE=4
EXTRA=4
EXPECTED=$(((NUMDIRS + 1) * NUMFILES))
CMD="$LFIND -stripe-count $OSTCOUNT -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
EXPECTED=$(((NUMDIRS + 1) * NUMFILES + EXTRA))
CMD="$LFIND -stripe-count +0 -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
EXPECTED=$ONESTRIPE
CMD="$LFIND -stripe-count 1 -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
CMD="$LFIND -stripe-count -2 -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
EXPECTED=0
CMD="$LFIND -stripe-count $((OSTCOUNT + 1)) -type f $TDIR"
NUMS=$($CMD | wc -l)
- [ $NUMS -eq $EXPECTED ] ||
+ [ $NUMS -eq $EXPECTED ] || {
+ $GETSTRIPE -R $TDIR
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
+ }
}
run_test 56s "check lfs find -stripe-count works"
TDIR=$DIR/${tdir}u
setup_56 $NUMFILES $NUMDIRS "-i 0"
- if [ $OSTCOUNT -gt 1 ]; then
+ if [[ $OSTCOUNT -gt 1 ]]; then
$SETSTRIPE -i 1 $TDIR/$tfile.{0,1,2,3}
ONESTRIPE=4
else
[ $NUMS -eq $EXPECTED ] ||
error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED"
- if [ $OSTCOUNT -gt 1 ]; then
+ if [[ $OSTCOUNT -gt 1 ]]; then
EXPECTED=$(((NUMDIRS + 1) * NUMFILES + ONESTRIPE))
CMD="$LFIND -stripe-index 0,1 -type f $TDIR"
NUMS=$($CMD | wc -l)
test_56x() {
check_swap_layouts_support && return 0
- [ "$OSTCOUNT" -lt "2" ] &&
+ [[ $OSTCOUNT -lt 2 ]] &&
skip_env "need 2 OST, skipping test" && return
local dir0=$DIR/$tdir/$testnum
for DEV in $(do_facet $SINGLEMDS lctl get_param -n $MNTDEV); do
do_facet $SINGLEMDS $DUMPE2FS -h $DEV > $TMP/t57a.dump ||
error "can't access $DEV"
- DEVISIZE=`awk '/Inode size:/ { print $3 }' $TMP/t57a.dump`
- [ "$DEVISIZE" -gt 128 ] || error "inode size $DEVISIZE"
+ DEVISIZE=$(awk '/Inode size:/ { print $3 }' $TMP/t57a.dump)
+ [[ $DEVISIZE -gt 128 ]] || error "inode size $DEVISIZE"
rm $TMP/t57a.dump
done
}
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 - 16))" ]; then
+ if [[ $MDCFREE2 -lt $((MDCFREE - 16)) ]]; then
if [ "$MDSFREE" != "$MDSFREE2" ]; then
error "MDC before $MDCFREE != after $MDCFREE2"
else
else
print from_begin
}"`
- [ $LLOG_COUNT -gt 50 ] && error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)"|| true
+ [[ $LLOG_COUNT -gt 50 ]] &&
+ error "CDEBUG_LIMIT not limiting messages ($LLOG_COUNT)" || true
}
run_test 60b "limit repeated messages from CERROR/CWARN ========"
test_65c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- if [ $OSTCOUNT -gt 1 ]; then
+ if [[ $OSTCOUNT -gt 1 ]]; then
test_mkdir -p $DIR/$tdir
$SETSTRIPE -S $(($STRIPESIZE * 4)) -i 1 \
-c $(($OSTCOUNT - 1)) $DIR/$tdir || error "setstripe"
test_65d() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir
- if [ $STRIPECOUNT -le 0 ]; then
+ if [[ $STRIPECOUNT -le 0 ]]; then
sc=1
- elif [ $STRIPECOUNT -gt 2000 ]; then
+ elif [[ $STRIPECOUNT -gt 2000 ]]; then
#LOV_MAX_STRIPE_COUNT is 2000
- [ $OSTCOUNT -gt 2000 ] && sc=2000 || sc=$(($OSTCOUNT - 1))
+ [[ $OSTCOUNT -gt 2000 ]] && sc=2000 || sc=$(($OSTCOUNT - 1))
else
sc=$(($STRIPECOUNT - 1))
fi
$SETSTRIPE -S $STRIPESIZE -c $sc $DIR/$tdir || error "setstripe"
touch $DIR/$tdir/f4 $DIR/$tdir/f5
$LVERIFY $DIR/$tdir $DIR/$tdir/f4 $DIR/$tdir/f5 ||
- error "lverify failed"
+ error "lverify failed"
}
run_test 65d "directory setstripe -S $STRIPESIZE -c stripe_count"
test_65k() { # bug11679
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ "$OSTCOUNT" -lt 2 ] && skip_env "too few OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "too few OSTs" && return
remote_mds_nodsh && skip "remote MDS with nodsh" && return
echo "Check OST status: "
skip_env "User $RUNAS_ID does not exist - skipping"
return 0
}
- # We had better clear the $DIR to get enough space for dd
- rm -rf $DIR/*
touch $DIR/$tfile
chmod 777 $DIR/$tfile
chmod ug+s $DIR/$tfile
# very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
# will spin in a tight reconnection loop
touch $DIR/f74a
- lctl set_param fail_loc=0x8000030e
+ $LCTL set_param fail_loc=0x8000030e
# get any lock that won't be difficult - lookup works.
ls $DIR/f74a
- lctl set_param fail_loc=0
- true
+ $LCTL set_param fail_loc=0
rm -f $DIR/f74a
+ true
}
run_test 74a "ldlm_enqueue freed-export error path, ls (shouldn't LBUG)"
#
# very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
# will spin in a tight reconnection loop
- lctl set_param fail_loc=0x8000030e
+ $LCTL set_param fail_loc=0x8000030e
# get a "difficult" lock
touch $DIR/f74b
- lctl set_param fail_loc=0
- true
+ $LCTL set_param fail_loc=0
rm -f $DIR/f74b
+ true
}
run_test 74b "ldlm_enqueue freed-export error path, touch (shouldn't LBUG)"
test_74c() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-#define OBD_FAIL_LDLM_NEW_LOCK
- lctl set_param fail_loc=0x80000319
- touch $DIR/$tfile && error "Touch successful"
+ #define OBD_FAIL_LDLM_NEW_LOCK
+ $LCTL set_param fail_loc=0x319
+ touch $DIR/$tfile && error "touch successful"
+ $LCTL set_param fail_loc=0
true
}
run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)"
# per-cpu cache is still allowed
set_inode_slab_tunables "1 1 0"
cancel_lru_locks osc
- BEFORE_INODES=`num_inodes`
+ BEFORE_INODES=$(num_inodes)
echo "before inodes: $BEFORE_INODES"
local COUNT=1000
[ "$SLOW" = "no" ] && COUNT=100
- for i in `seq $COUNT`; do
+ for i in $(seq $COUNT); do
touch $DIR/$tfile
rm -f $DIR/$tfile
done
cancel_lru_locks osc
- AFTER_INODES=`num_inodes`
+ AFTER_INODES=$(num_inodes)
echo "after inodes: $AFTER_INODES"
local wait=0
- while [ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]; do
+ while [[ $((AFTER_INODES-1*CPUS)) -gt $BEFORE_INODES ]]; do
sleep 2
- AFTER_INODES=`num_inodes`
+ AFTER_INODES=$(num_inodes)
wait=$((wait+2))
echo "wait $wait seconds inodes: $AFTER_INODES"
if [ $wait -gt 30 ]; then
echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 1024))
echo "MemTotal: $MEMTOTAL"
-# reserve 256MB of memory for the kernel and other running processes,
-# and then take 1/2 of the remaining memory for the read/write buffers.
- if [ $MEMTOTAL -gt 512 ] ;then
- MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
- else
- # for those poor memory-starved high-end clusters...
- MEMTOTAL=$((MEMTOTAL / 2))
- fi
+
+ # reserve 256MB of memory for the kernel and other running processes,
+ # and then take 1/2 of the remaining memory for the read/write buffers.
+ if [ $MEMTOTAL -gt 512 ] ;then
+ MEMTOTAL=$(((MEMTOTAL - 256 ) / 2))
+ else
+ # for those poor memory-starved high-end clusters...
+ MEMTOTAL=$((MEMTOTAL / 2))
+ fi
echo "Mem to use for directio: $MEMTOTAL"
- [ $F78SIZE -gt $MEMTOTAL ] && F78SIZE=$MEMTOTAL
- [ $F78SIZE -gt 512 ] && F78SIZE=512
- [ $F78SIZE -gt $((MAXFREE / 1024)) ] && F78SIZE=$((MAXFREE / 1024))
- SMALLESTOST=`lfs df $DIR |grep OST | awk '{print $4}' |sort -n |head -1`
+
+ [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL
+ [[ $F78SIZE -gt 512 ]] && F78SIZE=512
+ [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024))
+ SMALLESTOST=$(lfs df $DIR | grep OST | awk '{ print $4 }' | sort -n |
+ head -n1)
echo "Smallest OST: $SMALLESTOST"
- [ $SMALLESTOST -lt 10240 ] && \
+ [[ $SMALLESTOST -lt 10240 ]] &&
skip "too small OSTSIZE, useless to run large O_DIRECT test" && return 0
- [ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ] && \
+ [[ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024 - 80)) ]] &&
F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024 - 80))
[ "$SLOW" = "no" ] && NSEQ=1 && [ $F78SIZE -gt 32 ] && F78SIZE=32
echo "File size: $F78SIZE"
$SETSTRIPE -c $OSTCOUNT $DIR/$tfile || error "setstripe failed"
- for i in `seq 1 $NSEQ`
- do
- FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
- echo directIO rdwr round $i of $NSEQ
- $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
- done
+ for i in $(seq 1 $NSEQ); do
+ FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
+ echo directIO rdwr round $i of $NSEQ
+ $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
+ done
rm -f $DIR/$tfile
}
$READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
discard=0
- for s in `$LCTL get_param -n llite.*.read_ahead_stats | \
- get_named_value 'read but discarded' | cut -d" " -f1`; do
+ for s in $($LCTL get_param -n llite.*.read_ahead_stats |
+ get_named_value 'read but discarded' | cut -d" " -f1); do
discard=$(($discard + $s))
done
cleanup_101a
- if [ $(($discard * 10)) -gt $nreads ] ;then
+ if [[ $(($discard * 10)) -gt $nreads ]]; then
$LCTL get_param osc.*-osc*.rpc_stats
$LCTL get_param llite.*.read_ahead_stats
error "too many ($discard) discarded pages"
setup_test101bc() {
test_mkdir -p $DIR/$tdir
- STRIPE_SIZE=1048576
- STRIPE_COUNT=$OSTCOUNT
+ local STRIPE_SIZE=$1
+ local FILE_LENGTH=$2
STRIPE_OFFSET=0
+ local FILE_SIZE_MB=$((FILE_LENGTH / STRIPE_SIZE))
+
local list=$(comma_list $(osts_nodes))
set_osd_param $list '' read_cache_enable 0
set_osd_param $list '' writethrough_cache_enable 0
# prepare the read-ahead file
$SETSTRIPE -S $STRIPE_SIZE -i $STRIPE_OFFSET -c $OSTCOUNT $DIR/$tfile
- dd if=/dev/zero of=$DIR/$tfile bs=1024k count=100 2> /dev/null
+ dd if=/dev/zero of=$DIR/$tfile bs=$STRIPE_SIZE \
+ count=$FILE_SIZE_MB 2> /dev/null
+
}
cleanup_test101bc() {
ra_check_101() {
local READ_SIZE=$1
- local STRIPE_SIZE=1048576
+ local STRIPE_SIZE=$2
+ local FILE_LENGTH=$3
local RA_INC=1048576
local STRIDE_LENGTH=$((STRIPE_SIZE/READ_SIZE))
- local FILE_LENGTH=$((64*100))
local discard_limit=$((((STRIDE_LENGTH - 1)*3/(STRIDE_LENGTH*OSTCOUNT))* \
(STRIDE_LENGTH*OSTCOUNT - STRIDE_LENGTH)))
- DISCARD=`$LCTL get_param -n llite.*.read_ahead_stats | \
- get_named_value 'read but discarded' | \
- cut -d" " -f1 | calc_total`
- if [ $DISCARD -gt $discard_limit ]; then
+ DISCARD=$($LCTL get_param -n llite.*.read_ahead_stats |
+ get_named_value 'read but discarded' |
+ cut -d" " -f1 | calc_total)
+ if [[ $DISCARD -gt $discard_limit ]]; then
$LCTL get_param llite.*.read_ahead_stats
error "Too many ($DISCARD) discarded pages with size (${READ_SIZE})"
else
test_101b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping stride IO stride-ahead test" && return
+ [[ $OSTCOUNT -lt 2 ]] &&
+ skip_env "skipping stride IO stride-ahead test" && return
local STRIPE_SIZE=1048576
local STRIDE_SIZE=$((STRIPE_SIZE*OSTCOUNT))
- local FILE_LENGTH=$((STRIPE_SIZE*100))
- local ITERATION=$((FILE_LENGTH/STRIDE_SIZE))
+ if [ $SLOW == "yes" ]; then
+ local FILE_LENGTH=$((STRIDE_SIZE * 64))
+ else
+ local FILE_LENGTH=$((STRIDE_SIZE * 8))
+ fi
+
+ local ITERATION=$((FILE_LENGTH / STRIDE_SIZE))
+
# prepare the read-ahead file
- setup_test101bc
+ setup_test101bc $STRIPE_SIZE $FILE_LENGTH
cancel_lru_locks osc
for BIDX in 2 4 8 16 32 64 128 256
do
$READS -f $DIR/$tfile -l $STRIDE_LENGTH -o $OFFSET \
-s $FILE_LENGTH -b $STRIPE_SIZE -a $READ_COUNT -n $ITERATION
cancel_lru_locks osc
- ra_check_101 $BSIZE
+ ra_check_101 $BSIZE $STRIPE_SIZE $FILE_LENGTH
done
cleanup_test101bc
true
local nreads=10000
local osc_rpc_stats
- setup_test101bc
+ setup_test101bc $STRIPE_SIZE $FILE_LENGTH
cancel_lru_locks osc
$LCTL set_param osc.*.rpc_stats 0
local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
local need_KB=$((count * size_KB))
- [ $free_KB -le $need_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"
done
#10000 means 20% reads are missing in readahead
- [ $miss -lt 10000 ] || error "misses too much for small reads"
+ [[ $miss -lt 10000 ]] || error "misses too much for small reads"
}
run_test 101e "check read-ahead for small read(1k) for small files(500k)"
STRIPE_SIZE=65536
STRIPE_OFFSET=1
STRIPE_COUNT=$OSTCOUNT
- [ $OSTCOUNT -gt 4 ] && STRIPE_COUNT=4
+ [[ $OSTCOUNT -gt 4 ]] && STRIPE_COUNT=4
trap cleanup_test102 EXIT
cd $DIR
}
test_102a() {
- local testfile=$DIR/xattr_testfile
+ local testfile=$DIR/$tfile
touch $testfile
run_test 102a "user xattr test =================================="
test_102b() {
+ [ -z "$(which setfattr 2>/dev/null)" ] &&
+ skip_env "could not find setfattr" && return
+
# b10930: get/set/list trusted.lov xattr
echo "get/set/list trusted.lov xattr ..."
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
local testfile=$DIR/$tfile
$SETSTRIPE -S 65536 -i 1 -c $OSTCOUNT $testfile ||
error "setstripe failed"
local STRIPECOUNT=$($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"
+ getfattr -d -m "^trusted" $testfile 2>/dev/null | grep "trusted.lov" ||
+ error "can't get trusted.lov from $testfile"
local testfile2=${testfile}2
- local value=`getfattr -n trusted.lov $testfile 2> /dev/null | \
- grep "trusted.lov" |sed -e 's/[^=]\+=//'`
+ 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
local stripe_size=$($GETSTRIPE -S $testfile2)
local stripe_count=$($GETSTRIPE -c $testfile2)
- [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
- [ $stripe_count -eq $STRIPECOUNT ] ||
+ [[ $stripe_size -eq 65536 ]] ||
+ error "stripe size $stripe_size != 65536"
+ [[ $stripe_count -eq $STRIPECOUNT ]] ||
error "stripe count $stripe_count != $STRIPECOUNT"
rm -f $DIR/$tfile
}
run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
test_102c() {
+ [ -z "$(which setfattr 2>/dev/null)" ] &&
+ skip_env "could not find setfattr" && return
+
# b10930: get/set/list lustre.lov xattr
echo "get/set/list lustre.lov xattr ..."
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping 2-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping 2-stripe test" && return
test_mkdir -p $DIR/$tdir
chown $RUNAS_ID $DIR/$tdir
local testfile=$DIR/$tdir/$tfile
local size=$((STRIPE_SIZE * num))
local file=file"$num-$offset-$count"
stripe_size=$(lfs getstripe -S $PWD/$file)
- [ $stripe_size -ne $size ] &&
+ [[ $stripe_size -ne $size ]] &&
error "$file: size $stripe_size != $size"
stripe_count=$(lfs getstripe -c $PWD/$file)
# allow fewer stripes to be created, ORI-601
- [ $stripe_count -lt $(((3 * count + 3) / 4)) ]&&
+ [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] &&
error "$file: count $stripe_count != $count"
stripe_index=$(lfs getstripe -i $PWD/$file)
- [ $stripe_index -ne 0 ] &&
+ [[ $stripe_index -ne 0 ]] &&
stripe_index_all_zero=false
done
done
# b10930: tar test for trusted.lov xattr
TAR=$(find_lustre_tar)
[ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping N-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return
setup_test102
test_mkdir -p $DIR/d102d
$TAR xf $TMP/f102.tar -C $DIR/d102d --xattrs
# b10930: tar test for trusted.lov xattr
TAR=$(find_lustre_tar)
[ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping N-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return
setup_test102
test_mkdir -p $DIR/d102f
cd $DIR
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
- getfattr -n trusted.lov $DIR/$tfile || error "lgetxattr on $DIR/$tfile failed"
- getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 | grep -i "no such attr" || error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
- rm -f $DIR/$tfile $DIR/${tfile}link
+ [ -z "$(which getfattr 2>/dev/null)" ] &&
+ skip "could not find getfattr" && return
+ touch $DIR/$tfile
+ ln -s $DIR/$tfile $DIR/${tfile}link
+ getfattr -n trusted.lov $DIR/$tfile ||
+ error "lgetxattr on $DIR/$tfile failed"
+ getfattr -h -n trusted.lov $DIR/${tfile}link 2>&1 |
+ grep -i "no such attr" ||
+ error "error for lgetxattr on $DIR/${tfile}link is not ENODATA"
+ rm -f $DIR/$tfile $DIR/${tfile}link
}
run_test 102i "lgetxattr test on symbolic link ============"
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
TAR=$(find_lustre_tar)
[ -z "$TAR" ] && skip_env "lustre-aware tar is not installed" && return
- [ "$OSTCOUNT" -lt "2" ] && skip_env "skipping N-stripe test" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "skipping N-stripe test" && return
setup_test102 "$RUNAS"
test_mkdir -p $DIR/d102j
chown $RUNAS_ID $DIR/d102j
run_test 102j "non-root tar restore stripe info from tarfile, not keep osts ==="
test_102k() {
+ [ -z "$(which setfattr 2>/dev/null)" ] &&
+ skip "could not find setfattr" && return
touch $DIR/$tfile
# b22187 just check that does not crash for regular file.
setfattr -n trusted.lov $DIR/$tfile
run_test 102k "setfattr without parameter of value shouldn't cause a crash"
test_102l() {
+ [ -z "$(which getfattr 2>/dev/null)" ] &&
+ skip "could not find getfattr" && return
+
# LU-532 trusted. xattr is invisible to non-root
local testfile=$DIR/$tfile
local name
local value
+ [ -z "$(which setfattr 2>/dev/null)" ] &&
+ skip "could not find setfattr" && return
+
if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ]
then
skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs"
}
run_test 102n "silently ignore setxattr on internal trusted xattrs"
+test_102p() { # LU-4703 setxattr did not check ownership
+ local testfile=$DIR/$tfile
+
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.56) ] &&
+ skip "MDS needs to be at least 2.5.56" && return
+
+ touch $testfile
+
+ echo "setfacl as user..."
+ $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile
+ [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile"
+
+ echo "setfattr as user..."
+ setfacl -m "u:$RUNAS_ID:---" $testfile
+ $RUNAS setfattr -x system.posix_acl_access $testfile
+ [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile"
+}
+run_test 102p "check setxattr(2) correctly fails without permission"
+
run_acl_subtest()
{
$LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test
fi
echo "LU-2561 newly created file is same size as directory..."
- run_acl_subtest 2561 || error "LU-2561 test failed"
+ if [ $(facet_fstype $SINGLEMDS) != "zfs" ]; then
+ run_acl_subtest 2561 || error "LU-2561 test failed"
+ else
+ run_acl_subtest 2561_zfs || error "LU-2561 zfs test failed"
+ fi
+
+ run_acl_subtest 4924 || error "LU-4924 test failed"
cd $SAVE_PWD
umask $SAVE_UMASK
test_105a() {
# doesn't work on 2.4 kernels
touch $DIR/$tfile
- if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then
+ if $(flock_is_enabled); then
flocks_test 1 on -f $DIR/$tfile || error "fail flock on"
else
flocks_test 1 off -f $DIR/$tfile || error "fail flock off"
test_105b() {
touch $DIR/$tfile
- if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then
+ if $(flock_is_enabled); then
flocks_test 1 on -c $DIR/$tfile || error "fail flock on"
else
flocks_test 1 off -c $DIR/$tfile || error "fail flock off"
test_105c() {
touch $DIR/$tfile
- if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then
+ if $(flock_is_enabled); then
flocks_test 1 on -l $DIR/$tfile || error "fail flock on"
else
flocks_test 1 off -l $DIR/$tfile || error "fail flock off"
test_105d() { # bug 15924
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir
- [ -z "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ] &&
- skip "mount w/o flock enabled" && return
+ flock_is_enabled || { skip "mount w/o flock enabled" && return; }
#define OBD_FAIL_LDLM_CP_CB_WAIT 0x315
$LCTL set_param fail_loc=0x80000315
flocks_test 2 $DIR/$tdir
run_test 105d "flock race (should not freeze) ========"
test_105e() { # bug 22660 && 22040
- [ -z "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ] &&
- skip "mount w/o flock enabled" && return
+ flock_is_enabled || { skip "mount w/o flock enabled" && return; }
touch $DIR/$tfile
flocks_test 3 $DIR/$tfile
}
test_115() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- OSTIO_pre=$(ps -e|grep ll_ost_io|awk '{print $4}'|sort -n|tail -1|\
- cut -c11-20)
- [ -z "$OSTIO_pre" ] && skip "no OSS threads" && \
- return
- echo "Starting with $OSTIO_pre threads"
+ OSTIO_pre=$(ps -e | grep ll_ost_io | awk '{ print $4 }'| sort -n |
+ tail -1 | cut -c11-20)
+ [ -z "$OSTIO_pre" ] && skip "no OSS threads" && return
+ echo "Starting with $OSTIO_pre threads"
NUMTEST=20000
- NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
- [ $NUMFREE -lt $NUMTEST ] && NUMTEST=$(($NUMFREE - 1000))
+ NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
+ [[ $NUMFREE -lt $NUMTEST ]] && NUMTEST=$(($NUMFREE - 1000))
echo "$NUMTEST creates/unlinks"
test_mkdir -p $DIR/$tdir
createmany -o $DIR/$tdir/$tfile $NUMTEST
unlinkmany $DIR/$tdir/$tfile $NUMTEST
- OSTIO_post=$(ps -e|grep ll_ost_io|awk '{print $4}'|sort -n|tail -1|\
- cut -c11-20)
+ OSTIO_post=$(ps -e | grep ll_ost_io | awk '{ print $4 }' | sort -n |
+ tail -1 | cut -c11-20)
# don't return an error
- [ $OSTIO_post == $OSTIO_pre ] && echo \
+ [ $OSTIO_post == $OSTIO_pre ] && echo \
"WARNING: No new ll_ost_io threads were created ($OSTIO_pre)" &&
echo "This may be fine, depending on what ran before this test" &&
echo "and how fast this system is." && return
- echo "Started with $OSTIO_pre threads, ended with $OSTIO_post"
+ echo "Started with $OSTIO_pre threads, ended with $OSTIO_post"
}
run_test 115 "verify dynamic thread creation===================="
MAXI=0; MAXV=${AVAIL[0]}
MINI=0; MINV=${AVAIL[0]}
for ((i = 0; i < ${#AVAIL[@]}; i++)); do
- #echo OST $i: ${AVAIL[i]}kb
- if [ ${AVAIL[i]} -gt $MAXV ]; then
- MAXV=${AVAIL[i]}; MAXI=$i
- fi
- if [ ${AVAIL[i]} -lt $MINV ]; then
- MINV=${AVAIL[i]}; MINI=$i
- fi
+ #echo OST $i: ${AVAIL[i]}kb
+ if [[ ${AVAIL[i]} -gt $MAXV ]]; then
+ MAXV=${AVAIL[i]}; MAXI=$i
+ fi
+ if [[ ${AVAIL[i]} -lt $MINV ]]; then
+ MINV=${AVAIL[i]}; MINI=$i
+ fi
done
echo Min free space: OST $MINI: $MINV
echo Max free space: OST $MAXI: $MAXV
test_116a() { # was previously test_116()
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
+ [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs" && return
echo -n "Free space priority "
do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
- head -1
+ head -n1
declare -a AVAIL
free_min_max
[ $MINV -eq 0 ] && skip "no free space in OST$MINI, skip" && return
+ [ $MINV -gt 10000000 ] && skip "too much free space in OST$MINI, skip" \
+ && return
trap simple_cleanup_common EXIT
+
# Check if we need to generate uneven OSTs
test_mkdir -p $DIR/$tdir/OST${MINI}
local FILL=$(($MINV / 4))
local DIFF2=$(($DIFF * 100 / $MINV))
local threshold=$(do_facet $SINGLEMDS \
- lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1)
+ lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -n1)
threshold=${threshold%%%}
echo -n "Check for uneven OSTs: "
echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
- if [ $DIFF2 -gt $threshold ]; then
+ if [[ $DIFF2 -gt $threshold ]]; then
echo "ok"
echo "Don't need to fill OST$MINI"
else
DIFF=$(($MAXV - $MINV))
DIFF2=$(($DIFF * 100 / $MINV))
echo -n "diff=${DIFF}=${DIFF2}% must be > ${threshold}% for QOS mode..."
- if [ $DIFF2 -gt $threshold ]; then
+ if [[ $DIFF2 -gt $threshold ]]; then
echo "ok"
else
echo "failed - QOS mode won't be used"
echo "writing $FILL files to QOS-assigned OSTs"
i=0
while [ $i -lt $FILL ]; do
- i=$(($i + 1))
+ i=$((i + 1))
dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
count=1 2>/dev/null
echo -n .
MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MAXC files created on larger OST $MAXI1"
FILL=$(($MAXC * 100 / $MINC - 100))
- [ $MINC -gt 0 ] &&
+ [[ $MINC -gt 0 ]] &&
echo "Wrote ${FILL}% more files to larger OST $MAXI1"
- [ $MAXC -gt $MINC ] ||
+ [[ $MAXC -gt $MINC ]] ||
error_ignore LU-9 "stripe QOS didn't balance free space"
simple_cleanup_common
}
test_116b() { # LU-2093
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ -z "$($LCTL get_param -n lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr |
+ head -1 2>/dev/null)" ] && skip "no QOS" && return
#define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147
local old_rr
- old_rr=$(do_facet $SINGLEMDS lctl get_param -n lov.*mdtlov*.qos_threshold_rr)
- do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr 0
+ old_rr=$(do_facet $SINGLEMDS lctl get_param -n \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1)
+ do_facet $SINGLEMDS lctl set_param \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0
mkdir -p $DIR/$tdir
do_facet $SINGLEMDS lctl set_param fail_loc=0x147
createmany -o $DIR/$tdir/f- 20 || error "can't create"
do_facet $SINGLEMDS lctl set_param fail_loc=0
rm -rf $DIR/$tdir
- do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr $old_rr
+ do_facet $SINGLEMDS lctl set_param \
+ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr
}
run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass"
export OLD_RESENDCOUNT=""
set_resend_count () {
local PROC_RESENDCOUNT="osc.${FSNAME}-OST*-osc-*.resend_count"
- OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -1)
+ OLD_RESENDCOUNT=$(lctl get_param -n $PROC_RESENDCOUNT | head -n1)
lctl set_param -n $PROC_RESENDCOUNT $1
echo resend_count is set to $(lctl get_param -n $PROC_RESENDCOUNT)
}
cancel_lru_locks osc
stat $DIR/$tdir > /dev/null
- can1=$(lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}')
- blk1=$(lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}')
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
test_mkdir -c1 $DIR/$tdir/d1
- can2=$(lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}')
- blk2=$(lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}')
- [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
- [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
- lru_resize_enable mdc
- lru_resize_enable osc
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120a "Early Lock Cancel: mkdir test"
lru_resize_disable osc
cancel_lru_locks mdc
stat $DIR/$tdir > /dev/null
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- touch $DIR/$tdir/f1
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
- [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
- lru_resize_enable mdc
- lru_resize_enable osc
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ touch $DIR/$tdir/f1
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120b "Early Lock Cancel: create test"
lru_resize_disable osc
test_mkdir -p -c1 $DIR/$tdir/d1
test_mkdir -p -c1 $DIR/$tdir/d2
- touch $DIR/$tdir/d1/f1
- cancel_lru_locks mdc
- stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
- [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
- lru_resize_enable mdc
- lru_resize_enable osc
+ touch $DIR/$tdir/d1/f1
+ cancel_lru_locks mdc
+ stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120c "Early Lock Cancel: link test"
test_mkdir -p -c1 $DIR/$tdir
[ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \
skip "no early lock cancel on server" && return 0
- lru_resize_disable mdc
- lru_resize_disable osc
- touch $DIR/$tdir
- cancel_lru_locks mdc
- stat $DIR/$tdir > /dev/null
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- chmod a+x $DIR/$tdir
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'`
- [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
- [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
- lru_resize_enable mdc
- lru_resize_enable osc
+ lru_resize_disable mdc
+ lru_resize_disable osc
+ touch $DIR/$tdir
+ cancel_lru_locks mdc
+ stat $DIR/$tdir > /dev/null
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ chmod a+x $DIR/$tdir
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120d "Early Lock Cancel: setattr test"
cancel_lru_locks osc
dd if=$DIR/$tdir/f1 of=/dev/null
stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- unlink $DIR/$tdir/f1
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
- [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
- lru_resize_enable mdc
- lru_resize_enable osc
+ # XXX client can not do early lock cancel of OST lock
+ # during unlink (LU-4206), so cancel osc lock now.
+ cancel_lru_locks osc
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ unlink $DIR/$tdir/f1
+ sleep 5
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120e "Early Lock Cancel: unlink test"
lru_resize_disable osc
test_mkdir -p -c1 $DIR/$tdir/d1
test_mkdir -p -c1 $DIR/$tdir/d2
- dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
- dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
- cancel_lru_locks mdc
- cancel_lru_locks osc
- dd if=$DIR/$tdir/d1/f1 of=/dev/null
- dd if=$DIR/$tdir/d2/f2 of=/dev/null
- stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- mv $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
- [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
- lru_resize_enable mdc
- lru_resize_enable osc
+ dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
+ dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ dd if=$DIR/$tdir/d1/f1 of=/dev/null
+ dd if=$DIR/$tdir/d2/f2 of=/dev/null
+ stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
+ # XXX client can not do early lock cancel of OST lock
+ # during rename (LU-4206), so cancel osc lock now.
+ cancel_lru_locks osc
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
+ sleep 5
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120f "Early Lock Cancel: rename test"
cancel_lru_locks osc
t0=`date +%s`
- can0=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk0=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- createmany -o $DIR/$tdir/f $count
- sync
- can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- t1=`date +%s`
- echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
- echo rm $count files
- rm -r $DIR/$tdir
- sync
- can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
- awk '/ldlm_cancel/ {print $2}'`
- blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
- awk '/ldlm_bl_callback/ {print $2}'`
- t2=`date +%s`
- echo total: $count removes in $((t2-t1))
- echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
- sleep 2
- # wait for commitment of removal
- lru_resize_enable mdc
- lru_resize_enable osc
+ can0=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk0=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ createmany -o $DIR/$tdir/f $count
+ sync
+ can1=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ t1=$(date +%s)
+ echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
+ echo rm $count files
+ rm -r $DIR/$tdir
+ sync
+ can2=$(do_facet $SINGLEMDS \
+ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" |
+ awk '/ldlm_cancel/ {print $2}')
+ blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}')
+ t2=$(date +%s)
+ echo total: $count removes in $((t2-t1))
+ echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
+ sleep 2
+ # wait for commitment of removal
+ lru_resize_enable mdc
+ lru_resize_enable osc
}
run_test 120g "Early Lock Cancel: performance test"
cancel_lru_locks osc > /dev/null
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
+ [[ $reads -eq $writes ]] ||
+ error "read $reads blocks, must be $writes blocks"
}
run_test 121 "read cancel race ========="
rm -rf $DIR/$tdir
test_mkdir -p $DIR/$tdir
- NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
- [ $NUMFREE -gt 100000 ] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
+ NUMFREE=$(df -i -P $DIR | tail -n 1 | awk '{ print $4 }')
+ [[ $NUMFREE -gt 100000 ]] && NUMFREE=100000 || NUMFREE=$((NUMFREE-1000))
MULT=10
for ((i=100, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do
createmany -o $DIR/$tdir/$tfile $j $((i - j))
lctl get_param -n llite.*.statahead_stats
ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'`
- [ $swrong -lt $ewrong ] && log "statahead was stopped, maybe too many locks held!"
- [ $delta -eq 0 -o $delta_sa -eq 0 ] && continue
+ [[ $swrong -lt $ewrong ]] &&
+ log "statahead was stopped, maybe too many locks held!"
+ [[ $delta -eq 0 || $delta_sa -eq 0 ]] && continue
if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then
max=`lctl get_param -n llite.*.statahead_max | head -n 1`
test_124a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep lru_resize`" ] && \
- skip "no lru resize on server" && return 0
+ [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] &&
+ skip "no lru resize on server" && return 0
local NR=2000
test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir"
local NSDIR=""
local LRU_SIZE=0
- for VALUE in `lctl get_param ldlm.namespaces.*mdc-*.lru_size`; do
- local PARAM=`echo ${VALUE[0]} | cut -d "=" -f1`
- LRU_SIZE=$(lctl get_param -n $PARAM)
- if [ $LRU_SIZE -gt $(default_lru_size) ]; then
- NSDIR=$(echo $PARAM | cut -d "." -f1-3)
- log "NSDIR=$NSDIR"
+ for VALUE in $($LCTL get_param ldlm.namespaces.*mdc-*.lru_size); do
+ local PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1)
+ LRU_SIZE=$($LCTL get_param -n $PARAM)
+ if [[ $LRU_SIZE -gt $(default_lru_size) ]]; then
+ NSDIR=$(echo $PARAM | cut -d "." -f1-3)
+ log "NSDIR=$NSDIR"
log "NS=$(basename $NSDIR)"
break
fi
done
- if [ -z "$NSDIR" -o $LRU_SIZE -lt $(default_lru_size) ]; then
+ if [[ -z "$NSDIR" || $LRU_SIZE -lt $(default_lru_size) ]]; then
skip "Not enough cached locks created!"
return 0
fi
# We know that lru resize allows one client to hold $LIMIT locks
# 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"
+ 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
# created in the case of CMD, LRU_SIZE_B != $NR in most of cases
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
+ 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
# cached locks every 10 sec.
echo -n "..."
sleep 5
SEC=$((SEC+5))
- LRU_SIZE=`lctl get_param -n $NSDIR/lru_size`
+ LRU_SIZE=$($LCTL get_param -n $NSDIR/lru_size)
echo -n "$LRU_SIZE"
done
echo ""
- lctl set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
- local LRU_SIZE_A=`lctl get_param -n $NSDIR.lru_size`
+ $LCTL set_param -n $NSDIR.pool.lock_volume_factor $OLD_LVF
+ local LRU_SIZE_A=$($LCTL get_param -n $NSDIR.lru_size)
- [ $LRU_SIZE_B -gt $LRU_SIZE_A ] || {
+ [[ $LRU_SIZE_B -gt $LRU_SIZE_A ]] || {
error "No locks dropped in ${SLEEP}s. LRU size: $LRU_SIZE_A"
unlinkmany $DIR/$tdir/f $NR
return
get_max_pool_limit()
{
- local limit=`lctl get_param -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit`
- local max=0
- for l in $limit; do
- if test $l -gt $max; then
- max=$l
- fi
- done
- echo $max
+ local limit=$($LCTL get_param \
+ -n ldlm.namespaces.*-MDT0000-mdc-*.pool.limit)
+ local max=0
+ for l in $limit; do
+ if [[ $l -gt $max ]]; then
+ max=$l
+ fi
+ done
+ echo $max
}
test_124b() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ -z "`lctl get_param -n mdc.*.connect_flags | grep lru_resize`" ] && \
- skip "no lru resize on server" && return 0
+ [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] &&
+ skip "no lru resize on server" && return 0
- LIMIT=`get_max_pool_limit`
+ LIMIT=$(get_max_pool_limit)
- NR=$(($(default_lru_size)*20))
- if [ $NR -gt $LIMIT ]; then
+ NR=$(($(default_lru_size)*20))
+ if [[ $NR -gt $LIMIT ]]; then
log "Limit lock number by $LIMIT locks"
NR=$LIMIT
fi
test_125() { # 13358
[ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return
[ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return
+ [ -z "$(which setfacl)" ] && skip "must have setfacl tool" && return
test_mkdir -p $DIR/d125 || error "mkdir failed"
$SETSTRIPE -S 65536 -c -1 $DIR/d125 || error "setstripe failed"
setfacl -R -m u:bin:rwx $DIR/d125 || error "setfacl $DIR/d125 failed"
local I=$(stat -c%s "$DIR/$tdir")
local J=0
local STRIPE_COUNT=1
- [ $MDSCOUNT -ge 2 ] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir)
+ [[ $MDSCOUNT -ge 2 ]] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir)
MAX=$((MAX*STRIPE_COUNT))
- while [ ! $I -gt $MAX ]; do
+ while [[ $I -le $MAX ]]; do
$MULTIOP $DIR/$tdir/$J Oc
rc=$?
#check two errors ENOSPC for new version of ext4 max_dir_size patch
if [ $(lustre_version_code $SINGLEMDS) -lt \
$(version_code 2.4.51) ]
then
- [ $I -eq $MAX ] && return 0
+ [[ $I -eq $MAX ]] && return 0
else
- [ $I -gt $MAX ] && return 0
+ [[ $I -gt $MAX ]] && return 0
fi
error_exit "current dir size $I, previous limit $MAX"
elif [ $rc -ne 0 ]; then
*) 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"
+ if [[ $3 -gt 0 ]]; then
+ count=$(echo $res | awk '{ print $2 }')
+ [[ $count -ne $3 ]] &&
+ error "The $2 counter on $1 is wrong - expected $3"
fi
}
run_test 133c "Verifying OST stats ========================================"
order_2() {
- local value=$1
- local orig=$value
- local order=1
+ local value=$1
+ local orig=$value
+ local order=1
- while [ $value -ge 2 ]; do
- order=$((order*2))
- value=$((value/2))
- done
+ while [ $value -ge 2 ]; do
+ order=$((order*2))
+ value=$((value/2))
+ done
- if [ $orig -gt $order ]; then
- order=$((order*2))
- fi
- echo $order
+ if [ $orig -gt $order ]; then
+ order=$((order*2))
+ fi
+ echo $order
}
size_in_KMGT() {
local samedir=$($cmd | 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 error $same_sample"
+ [[ $same_sample -eq 1 ]] ||
+ error "samedir_rename_size error $same_sample"
echo "Check same dir rename stats success"
do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
local src_sample=$(get_rename_size $testdir1_size crossdir_src)
local tgt_sample=$(get_rename_size $testdir2_size crossdir_tgt)
[ -z "$crossdir" ] && error "crossdir_rename_size count error"
- [ "$src_sample" -eq 1 ] || error "crossdir_rename_size error $src_sample"
- [ "$tgt_sample" -eq 1 ] || error "crossdir_rename_size error $tgt_sample"
+ [[ $src_sample -eq 1 ]] ||
+ error "crossdir_rename_size error $src_sample"
+ [[ $tgt_sample -eq 1 ]] ||
+ error "crossdir_rename_size error $tgt_sample"
echo "Check cross dir rename stats success"
rm -rf $DIR/${tdir}
}
cancel_lru_locks osc
sum=$(do_facet ost1 $LCTL get_param \
- "obdfilter.*.exports.*.stats" | \
- awk -v ctr=$ctr '\
- BEGIN { sum = 0 }
+ "obdfilter.*.exports.*.stats" |
+ awk -v ctr=$ctr 'BEGIN { sum = 0 }
$1 == ctr { sum += $7 }
- END { print sum }')
+ END { printf("%0.0f", sum) }')
if ((sum != bs * count)); then
error "Bad $ctr sum, expected $((bs * count)), got $sum"
local facet
# First without trusting modes.
- find $proc_dirs \
- -exec cat '{}' \; &> /dev/null
+ find $proc_dirs -exec cat '{}' \; &> /dev/null
# Second verifying readability.
find $proc_dirs \
-type f \
- -readable \
- -exec cat '{}' \; > /dev/null ||
+ -exec cat '{}' \; &> /dev/null ||
error "proc file read failed"
for facet in $SINGLEMDS ost1; do
do_facet $facet find $proc_dirs \
- -not -name req_history \
+ ! -name req_history \
-exec cat '{}' \\\; &> /dev/null
- do_facet $facet find $proc_dirs \
- -not -name req_history \
+ do_facet $facet find $proc_dirs \
+ ! -name req_history \
-type f \
- -readable \
- -exec cat '{}' \\\; > /dev/null ||
+ -exec cat '{}' \\\; &> /dev/null ||
error "proc file read failed"
done
}
run_test 133f "Check for LBUGs/Oopses/unreadable files in /proc"
+test_133g() {
+ local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/"
+ local facet
+
+ # Second verifying readability.
+ find $proc_dirs \
+ -type f \
+ -not -name force_lbug \
+ -not -name changelog_mask \
+ -exec badarea_io '{}' \; &> /dev/null ||
+ error "find $proc_dirs failed"
+
+ [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] &&
+ skip "Too old lustre on MDS"
+
+ [ $(lustre_version_code ost1) -le $(version_code 2.5.54) ] &&
+ skip "Too old lustre on ost1"
+
+ for facet in $SINGLEMDS ost1; do
+ do_facet $facet find $proc_dirs \
+ -type f \
+ -not -name force_lbug \
+ -not -name changelog_mask \
+ -exec badarea_io '{}' \\\; &> /dev/null ||
+ error "$facet find $proc_dirs failed"
+
+ done
+
+ # remount the FS in case writes/reads /proc break the FS
+ cleanup || error "failed to unmount"
+ setup || error "failed to setup"
+ true
+}
+run_test 133g "Check for Oopses on bad io area writes/reads in /proc"
+
test_140() { #bug-17379
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null
idx=$(printf %04x $i)
BEFORE=$(get_osd_param $list *OST*$idx stats |
- awk '$1 == "cache_access" {sum += $2} END { print sum }')
- if [ -z "$BEFORE" ]; then
- BEFORE=0
- fi
+ awk '$1 == "cache_access" {sum += $2}
+ END { printf("%0.0f", sum) }')
cancel_lru_locks osc
cat $file >/dev/null
AFTER=$(get_osd_param $list *OST*$idx stats |
- awk '$1 == "cache_access" {sum += $2} END { print sum }')
+ awk '$1 == "cache_access" {sum += $2}
+ END { printf("%0.0f", sum) }')
echo BEFORE:$BEFORE AFTER:$AFTER
if ! let "AFTER - BEFORE == 4"; then
function roc_hit() {
local list=$(comma_list $(osts_nodes))
echo $(get_osd_param $list '' stats |
- awk '$1 == "cache_hit" {sum += $2} END { print sum }')
+ awk '$1 == "cache_hit" {sum += $2}
+ END { printf("%0.0f", sum) }')
}
function set_cache() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.51) ]] ||
{ skip "Need MDS version at least 2.2.51"; return 0; }
+ [ -z "$(which setfacl)" ] && skip "must have setfacl tool" && return
cp /etc/hosts $DIR/$tfile
#Changelogs
err17935 () {
- if [ $MDSCOUNT -gt 1 ]; then
+ if [[ $MDSCOUNT -gt 1 ]]; then
error_ignore bz17935 $*
else
error $*
MIN_REC=$($GET_CL_USERS |
awk 'min == "" || $2 < min {min = $2}; END {print min}')
- FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
+ FIRST_REC=$($LFS changelog $MDT0 | head -n1 | awk '{print $1}')
echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
[ $FIRST_REC == $(($MIN_REC + 1)) ] ||
err17935 "first index should be $(($MIN_REC + 1)) is $FIRST_REC"
# LU-3446 changelog index reset on MDT restart
local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
- CUR_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+ CUR_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
$LFS changelog_clear $MDT0 $USER 0
stop $SINGLEMDS || error "Fail to stop MDT."
start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
- CUR_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+ CUR_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
echo "verifying index survives MDT restart: $CUR_REC1 == $CUR_REC2"
[ $CUR_REC1 == $CUR_REC2 ] ||
err17935 "current index should be $CUR_REC1 is $CUR_REC2"
USERS=$(( $($GET_CL_USERS | wc -l) - 2 ))
if [ $USERS -eq 0 ]; then
- LAST_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+ LAST_REC1=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
touch $DIR/$tdir/chloe
- LAST_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+ LAST_REC2=$($GET_CL_USERS | head -n1 | cut -f3 -d' ')
echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2"
[ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
else
}
run_test 160b "Verify that very long rename doesn't crash in changelog"
+test_160c() {
+ local rc=0
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+
+ # Registration step
+ local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+
+ rm -rf $DIR/$tdir
+ mkdir -p $DIR/$tdir
+ $MCREATE $DIR/$tdir/foo_160c
+ changelog_chmask "TRUNC"
+ $TRUNCATE $DIR/$tdir/foo_160c 200
+ changelog_chmask "TRUNC"
+ $TRUNCATE $DIR/$tdir/foo_160c 199
+ $LFS changelog $MDT0
+ TRUNCS=$($LFS changelog $MDT0 | tail -5 | grep -c "TRUNC")
+ [ $TRUNCS -eq 1 ] || err17935 "TRUNC changelog mask count $TRUNCS != 1"
+ $LFS changelog_clear $MDT0 $USER 0
+
+ # Deregistration step
+ echo "deregistering $USER"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+}
+run_test 160c "verify that changelog log catch the truncate event"
+
test_161a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
test_mkdir -p -c1 $DIR/$tdir
fi
rm $DIR/$tdir/foo2/maggie
- # overflow the EA
- 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 $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 || \
- error "failed to unlink many hardlinks"
+ # overflow the EA
+ 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 $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 ||
+ error "failed to unlink many hardlinks"
}
run_test 161a "link ea sanity"
error "failed to hardlink many files"
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"
+ [[ ${links} -gt 60 ]] ||
+ err17935 "expected at least 60 links in link EA"
unlinkmany $remote_dir/foo2/$longname 1000 ||
error "failed to unlink many hardlinks"
}
test_162() {
# Make changes to filesystem
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- test_mkdir -p $DIR/$tdir/d2
+ test_mkdir -p -c1 $DIR/$tdir/d2
touch $DIR/$tdir/d2/$tfile
touch $DIR/$tdir/d2/x1
touch $DIR/$tdir/d2/x2
- test_mkdir -p $DIR/$tdir/d2/a/b/c
- test_mkdir -p $DIR/$tdir/d2/p/q/r
+ test_mkdir -p -c1 $DIR/$tdir/d2/a/b/c
+ test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r
# regular file
FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]')
check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0
}
run_test 162 "path lookup sanity"
+test_162b() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ error "create striped dir failed"
+
+ local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir |
+ tail -n 1 | awk '{print $2}')
+ stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed"
+
+ touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed"
+ mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed"
+
+ # regular file
+ for ((i=0;i<5;i++)); do
+ FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') ||
+ error "get fid for f$i failed"
+ check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0
+
+ FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') ||
+ error "get fid for d$i failed"
+ check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0
+ done
+
+ return 0
+}
+run_test 162b "striped directory path lookup sanity"
+
test_169() {
# do directio so as not to populate the page cache
log "creating a 10 Mb file"
do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
rmmod_remote=true || error "failed to load module obdecho"
- target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4}'|head -1)
- if [[ -n $target ]]; then
- obdecho_test "$target" ost1 "$pages" ||
- rc=${PIPESTATUS[0]}
+ target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ { print $4 }' |
+ head -n1)
+ if [ -n "$target" ]; then
+ obdecho_test "$target" ost1 "$pages" || rc=${PIPESTATUS[0]}
else
echo "there is no obdfilter target on ost1"
rc=2
# create a file large enough for the concurent test
dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20))
dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20))
- echo "ref file size: ref1(`stat -c %s $ref1`), ref2(`stat -c %s $ref2`)"
+ echo "ref file size: ref1($(stat -c %s $ref1))," \
+ "ref2($(stat -c %s $ref2))"
cp $ref2 $file2
dd if=$ref1 of=$file1 bs=16k &
[[ $rc == 0 ]] || error "swap of $file1 and $file2 failed"
# how many bytes copied before swapping layout
- local copied=`stat -c %s $file2`
- local remaining=`stat -c %s $ref1`
+ local copied=$(stat -c %s $file2)
+ local remaining=$(stat -c %s $ref1)
remaining=$((remaining - copied))
echo "Copied $copied bytes before swapping layout..."
test_184d() {
check_swap_layouts_support && return 0
+ [ -z "$(which getfattr 2>/dev/null)" ] &&
+ skip "no getfattr command" && return 0
local file1=$DIR/$tdir/$tfile-1
local file2=$DIR/$tdir/$tfile-2
[ "$lovea1" == "$lovea2" ] || error "lovea $lovea1 != $lovea2"
lovea1=$(getfattr -n trusted.lov $file1 | grep ^trusted)
- [ -z $lovea1 ] || error "$file1 shouldn't have lovea"
+ [[ -z "$lovea1" ]] || error "$file1 shouldn't have lovea"
}
run_test 184d "allow stripeless layouts swap"
local pool=$1
local pname="lov.$FSNAME-*.pools.$pool"
- local t=$($LCTL get_param -n $pname | head -1)
+ local t=$($LCTL get_param -n $pname | head -n1)
do_facet mgs $LCTL pool_remove $FSNAME.$pool $t
wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || {
error_noexit "$t not removed from $FSNAME.$pool"
error_noexit "Pool $FSNAME.$pool cannot be drained"
return 1
}
- # striping on an empty/nonexistant pool should fall back
+ # striping on an empty/nonexistant pool should fall back
# to "pool of everything"
touch $file || {
error_noexit "failed to use fallback striping for empty pool"
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] &&
skip "Server doesn't support jobstats" && return 0
+ [[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return
local cmd
- OLD_JOBENV=`$LCTL get_param -n jobid_var`
+ OLD_JOBENV=$($LCTL get_param -n jobid_var)
if [ $OLD_JOBENV != $JOBENV ]; then
jobstats_set $JOBENV
trap jobstats_set EXIT
# LU-1480, LU-1773 and LU-1657
test_206() {
mkdir -p $DIR/$tdir
- lfs setstripe -c -1 $DIR/$tdir
+ $SETSTRIPE -c -1 $DIR/$tdir
#define OBD_FAIL_LOV_INIT 0x1403
$LCTL set_param fail_loc=0xa0001403
$LCTL set_param fail_val=1
# 3rd arg as regexp for body, 4th arg as regexp for 1st line, 5th arg is
# optional and can be regexp for 2nd line (lnet.routes case)
check_lnet_proc_entry() {
- local blp=2 # blp stands for 'position of 1st line of body'
- [ "$5" = "" ] || blp=3 # lnet.routes case
+ local blp=2 # blp stands for 'position of 1st line of body'
+ [ -z "$5" ] || blp=3 # lnet.routes case
local l=$(cat "$TMP/lnet_$1" |wc -l)
# subtracting one from $blp because the body can be empty
(cat "$TMP/lnet_$1" && error "2nd line of $2 misformatted")
# bail out if any unexpected line happened
- sed -n "$blp~1 p" "$TMP/lnet_$1" |grep -Ev "$3"
+ sed -n "$blp p" "$TMP/lnet_$1" | grep -Ev "$3"
[ "$?" != 0 ] || error "$2 misformatted"
}
# cause an out-of-memory condition.
test_227() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- dd if=`which date` of=$MOUNT/date bs=1k count=1
+ [ -z "$(which ldd)" ] && skip "should have ldd tool" && return
+ dd if=$(which date) of=$MOUNT/date bs=1k count=1
chmod +x $MOUNT/date
$MOUNT/date > /dev/null
}
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 mdt_index
+ local i
+ local file
+ local pid
+ local stripe_count
+ local migrate_dir=$DIR/$tdir/migrate_dir
+ local other_dir=$DIR/$tdir/other_dir
+
+ mkdir -p $migrate_dir
+ mkdir -p $other_dir
+ for ((i=0; i<10; i++)); do
+ mkdir -p $migrate_dir/dir_${i}
+ createmany -o $migrate_dir/dir_${i}/f 10 ||
+ error "create files under remote dir failed $i"
+ done
+
+ cp /etc/passwd $migrate_dir/$tfile
+ cp /etc/passwd $other_dir/$tfile
+ chattr +SAD $migrate_dir
+ chattr +SAD $migrate_dir/$tfile
+
+ local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
+ local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
+ local old_dir_mode=$(stat -c%f $migrate_dir)
+ local old_file_mode=$(stat -c%f $migrate_dir/$tfile)
+
+ mkdir -p $migrate_dir/dir_default_stripe2
+ $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2
+ $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2
+
+ mkdir -p $other_dir
+ ln $migrate_dir/$tfile $other_dir/luna
+ ln $migrate_dir/$tfile $migrate_dir/sofia
+ ln $other_dir/$tfile $migrate_dir/david
+ ln -s $migrate_dir/$tfile $other_dir/zachary
+ ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
+ ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
+
+ $LFS mv -v -M $MDTIDX $migrate_dir ||
+ error "migrate remote dir error"
+
+ echo "migratate to MDT1, then checking.."
+ for ((i=0; i<10; i++)); do
+ for file in $(find $migrate_dir/dir_${i}); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
+ done
+
+ # the multiple link file should still in MDT0
+ mdt_index=$($LFS getstripe -M $migrate_dir/$tfile)
+ [ $mdt_index == 0 ] ||
+ error "$file is not on MDT${MDTIDX}"
+
+ local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
+ [ "$old_dir_flag" = "$new_dir_flag" ] ||
+ error " expect $old_dir_flag get $new_dir_flag"
+
+ local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
+ [ "$old_file_flag" = "$new_file_flag" ] ||
+ error " expect $old_file_flag get $new_file_flag"
+
+ local new_dir_mode=$(stat -c%f $migrate_dir)
+ [ "$old_dir_mode" = "$new_dir_mode" ] ||
+ error "expect mode $old_dir_mode get $new_dir_mode"
+
+ local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
+ [ "$old_file_mode" = "$new_file_mode" ] ||
+ error "expect mode $old_file_mode get $new_file_mode"
+
+ diff /etc/passwd $migrate_dir/$tfile ||
+ error "$tfile different after migration"
+
+ diff /etc/passwd $other_dir/luna ||
+ error "luna different after migration"
+
+ diff /etc/passwd $migrate_dir/sofia ||
+ error "sofia different after migration"
+
+ diff /etc/passwd $migrate_dir/david ||
+ error "david different after migration"
+
+ diff /etc/passwd $other_dir/zachary ||
+ error "zachary different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln ||
+ error "${tfile}_ln different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
+ error "${tfile}_ln_other different after migration"
+
+ stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "dir strpe_count $d != 2 after migration."
+
+ stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "file strpe_count $d != 2 after migration."
+
+ #migrate back to MDT0
+ MDTIDX=0
+ $LFS mv -v -M $MDTIDX $migrate_dir ||
+ error "migrate remote dir error"
+
+ echo "migrate back to MDT0, checking.."
+ for file in $(find $migrate_dir); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
+
+ local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}')
+ [ "$old_dir_flag" = "$new_dir_flag" ] ||
+ error " expect $old_dir_flag get $new_dir_flag"
+
+ local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}')
+ [ "$old_file_flag" = "$new_file_flag" ] ||
+ error " expect $old_file_flag get $new_file_flag"
+
+ local new_dir_mode=$(stat -c%f $migrate_dir)
+ [ "$old_dir_mode" = "$new_dir_mode" ] ||
+ error "expect mode $old_dir_mode get $new_dir_mode"
+
+ local new_file_mode=$(stat -c%f $migrate_dir/$tfile)
+ [ "$old_file_mode" = "$new_file_mode" ] ||
+ error "expect mode $old_file_mode get $new_file_mode"
+
+ diff /etc/passwd ${migrate_dir}/$tfile ||
+ error "$tfile different after migration"
+
+ diff /etc/passwd ${other_dir}/luna ||
+ error "luna different after migration"
+
+ diff /etc/passwd ${migrate_dir}/sofia ||
+ error "sofia different after migration"
+
+ diff /etc/passwd ${other_dir}/zachary ||
+ error "zachary different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln ||
+ error "${tfile}_ln different after migration"
+
+ diff /etc/passwd $migrate_dir/${tfile}_ln_other ||
+ error "${tfile}_ln_other different after migration"
+
+ stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "dir strpe_count $d != 2 after migration."
+
+ stripe_count=$($LFS getstripe -c ${migrate_dir}/${tfile}_stripe2)
+ [ $stripe_count = 2 ] ||
+ error "file strpe_count $d != 2 after migration."
+
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230b "migrate directory"
+
+test_230c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local MDTIDX=1
+ local mdt_index
+ local file
+
+ #If migrating directory fails in the middle, all entries of
+ #the directory is still accessiable.
+ mkdir -p $DIR/$tdir
+ stat $DIR/$tdir
+ createmany -o $DIR/$tdir/f 10 ||
+ error "create files under ${tdir} failed"
+
+ #failed after migrating 5 entries
+ #OBD_FAIL_MIGRATE_ENTRIES 0x1801
+ do_facet mds1 lctl set_param fail_loc=0x20001801
+ do_facet mds1 lctl set_param fail_val=5
+ local t=`ls $DIR/$tdir | wc -l`
+ $LFS mv -M $MDTIDX $DIR/$tdir &&
+ error "migrate should failed after 5 entries"
+ local u=`ls $DIR/$tdir | wc -l`
+ [ "$u" == "$t" ] || error "$u != $t during migration"
+
+ for file in $(find $DIR/$tdir); do
+ stat $file || error "stat $file failed"
+ done
+
+ do_facet mds1 lctl set_param fail_loc=0
+ do_facet mds1 lctl set_param fail_val=0
+
+ $LFS mv -M $MDTIDX $DIR/$tdir ||
+ error "migrate open files should failed with open files"
+
+ echo "Finish migration, then checking.."
+ for file in $(find $DIR/$tdir); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
+
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230c "check directory accessiblity if migration is failed"
+
+test_230d() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local MDTIDX=1
+ local mdt_index
+ local i
+ local j
+
+ mkdir -p $DIR/$tdir
+
+ for ((i=0; i<100; i++)); do
+ mkdir -p $DIR/$tdir/dir_${i}
+ createmany -o $DIR/$tdir/dir_${i}/f 100 ||
+ error "create files under remote dir failed $i"
+ done
+
+ $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error"
+
+ echo "Finish migration, then checking.."
+ for file in $(find $DIR/$tdir); do
+ mdt_index=$($LFS getstripe -M $file)
+ [ $mdt_index == $MDTIDX ] ||
+ error "$file is not on MDT${MDTIDX}"
+ done
+
+ rm -rf $DIR/$tdir || error "rm dir failed after migration"
+}
+run_test 230d "check migrate big directory"
+
test_231a()
{
# For simplicity this test assumes that max_pages_per_rpc
# is the same across all OSCs
- local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -1)
+ local max_pages=$($LCTL get_param -n osc.*.max_pages_per_rpc | head -n1)
local bulk_size=$((max_pages * 4096))
mkdir -p $DIR/$tdir
run_test 234 "xattr cache should not crash on ENOMEM"
test_235() {
- [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] &&
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] &&
skip "Need MDS version at least 2.4.52" && return
flock_deadlock $DIR/$tfile
local RC=$?
}
run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls"
+# LU-4659 linkea consistency
+test_238() {
+ touch $DIR/$tfile
+ ln $DIR/$tfile $DIR/$tfile.lnk
+ touch $DIR/$tfile.new
+ mv $DIR/$tfile.new $DIR/$tfile
+ local fid1=$(lfs path2fid $DIR/$tfile)
+ local fid2=$(lfs path2fid $DIR/$tfile.lnk)
+ local path1=$(lfs fid2path $FSNAME $fid1)
+ [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1"
+ local path2=$(lfs fid2path $FSNAME $fid2)
+ [ $tfile.lnk == $path2 ] ||
+ error "linkea inconsistent: $tfile.lnk $fid2 $path2!"
+ rm -f $DIR/$tfile*
+}
+run_test 238 "Verify linkea consistency"
+
+cleanup_test_300() {
+ trap 0
+ umask $SAVE_UMASK
+}
test_striped_dir() {
local mdt_index=$1
local stripe_count
local stripe_index
mkdir -p $DIR/$tdir
- $LFS setdirstripe -i $mdt_index -c 2 -t all_char $DIR/$tdir/striped_dir ||
+
+ SAVE_UMASK=$(umask)
+ trap cleanup_test_300 RETURN EXIT
+
+ $LFS setdirstripe -i $mdt_index -c 2 -t all_char -m 755 \
+ $DIR/$tdir/striped_dir ||
error "set striped dir error"
+ local mode=$(stat -c%a $DIR/$tdir/striped_dir)
+ [ "$mode" = "755" ] || error "expect 755 got $mode"
+
stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir)
if [ "$stripe_count" != "2" ]; then
error "stripe_count is $stripe_count, expect 2"
rmdir $DIR/$tdir/striped_dir ||
error "rmdir striped dir error"
+
+ cleanup_test_300
+
true
}
}
run_test 300f "check rename cross striped directory"
+test_300g() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
+ local stripe_count
+ local dir
+
+ mkdir $DIR/$tdir
+ $LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \
+ $DIR/$tdir/striped_dir ||
+ error "set striped dir error"
+
+ $LFS setdirstripe -D -c $MDSCOUNT -t all_char $DIR/$tdir/striped_dir ||
+ error "set default stripe on striped dir error"
+
+ stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/striped_dir)
+ [ $stripe_count -eq $MDSCOUNT ] ||
+ error "default stripe wrong expect $MDSCOUNT get $stripe_count"
+
+ mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
+
+ for dir in $(find $DIR/$tdir/striped_dir/*); do
+ stripe_count=$($LFS getdirstripe -c $dir)
+ [ $stripe_count -eq $MDSCOUNT ] ||
+ error "expect $MDSCOUNT get $stripe_count for $dir"
+ done
+
+ rmdir $DIR/$tdir/striped_dir/* || error "rmdir1 failed"
+ #change default stripe count to 2
+ $LFS setdirstripe -D -c 2 -t all_char $DIR/$tdir/striped_dir ||
+ error "set default stripe on striped dir error"
+
+ mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
+
+ rmdir $DIR/$tdir/striped_dir/* || error "rmdir2 failed"
+
+ #change default stripe count to 1
+ $LFS setdirstripe -D -c 1 -t all_char $DIR/$tdir/striped_dir ||
+ error "set default stripe on striped dir error"
+
+ mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4}
+ for dir in $(find $DIR/$tdir/striped_dir/*); do
+ stripe_count=$($LFS getdirstripe -c $dir)
+ [ $stripe_count -eq 1 ] ||
+ error "expect 1 get $stripe_count for $dir"
+ done
+ rmdir $DIR/$tdir/striped_dir/* || error "rmdir3 failed"
+}
+run_test 300g "check default striped directory for striped directory"
+
+test_400a() { # LU-1606, was conf-sanity test_74
+ local extra_flags=''
+ local out=$TMP/$tfile
+ local prefix=/usr/include/lustre
+ local prog
+
+ if ! which $CC > /dev/null 2>&1; then
+ skip_env "$CC is not installed"
+ return 0
+ fi
+
+ if ! [[ -d $prefix ]]; then
+ # Assume we're running in tree and fixup the include path.
+ extra_flags+=" -I$LUSTRE/../libcfs/include"
+ extra_flags+=" -I$LUSTRE/include"
+ extra_flags+=" -L$LUSTRE/utils"
+ fi
+
+ for prog in $LUSTRE_TESTS_API_DIR/*.c; do
+ $CC -Wall -Werror $extra_flags -llustreapi -o $out $prog ||
+ error "client api broken"
+ done
+}
+run_test 400a "Lustre client api program can compile and link"
+
+test_400b() { # LU-1606, LU-5011
+ local header
+ local out=$TMP/$tfile
+ local prefix=/usr/include/lustre
+
+ # We use a hard coded prefix so that this test will not fail
+ # when run in tree. There are headers in lustre/include/lustre/
+ # that are not packaged (like lustre_idl.h) and have more
+ # complicated include dependencies (like config.h and lnet/types.h).
+ # Since this test about correct packaging we just skip them when
+ # they don't exist (see below) rather than try to fixup cppflags.
+
+ if ! which $CC > /dev/null 2>&1; then
+ skip_env "$CC is not installed"
+ return 0
+ fi
+
+ for header in $prefix/*.h; do
+ if ! [[ -f "$header" ]]; then
+ continue
+ fi
+
+ if [[ "$(basename $header)" == liblustreapi.h ]]; then
+ continue # liblustreapi.h is deprecated.
+ fi
+
+ $CC -Wall -Werror -include $header -c -x c /dev/null -o $out ||
+ error "cannot compile '$header'"
+ done
+}
+run_test 400b "packaged headers can be compiled"
+
#
# tests that do cleanup/setup should be run at the end
#