OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
lctl set_param debug=-1 2> /dev/null || true
-test_0() {
+test_0a() {
touch $DIR/$tfile
$CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
rm $DIR/$tfile
$CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
}
-run_test 0 "touch .../$tfile ; rm .../$tfile ====================="
+run_test 0a "touch; rm ====================="
test_0b() {
chmod 0755 $DIR || error "chmod 0755 $DIR failed"
}
run_test 3 "mkdir; touch; rmdir; check dir ====================="
-test_4() {
- test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
- $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
- test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
- $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
-}
-run_test 4 "mkdir =============================================="
-
test_5() {
test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
$CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
error "$tfile does not have perm 0666 or UID $UID"
-}
-run_test 6a "touch .../f6a; chmod .../f6a ======================"
-
-test_6b() {
- [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- if [ ! -f $DIR/$tfile ]; then
- touch $DIR/$tfile
- chmod 0666 $DIR/$tfile
- fi
$RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
$CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
error "$tfile should be 0666 and owned by UID $UID"
}
-run_test 6b "$RUNAS chmod .../f6a (should return error) =="
+run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
test_6c() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
$CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $RUNAS_ID"
-}
-run_test 6c "touch .../f6c; chown .../f6c ======================"
-
-test_6d() {
- [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- if [ ! -f $DIR/$tfile ]; then
- touch $DIR/$tfile
- chown $RUNAS_ID $DIR/$tfile
- fi
$RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
$CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $RUNAS_ID"
}
-run_test 6d "$RUNAS chown .../f6c (should return error) =="
+run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
test_6e() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
$CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by GID $UID"
-}
-run_test 6e "touch .../f6e; chgrp .../f6e ======================"
-
-test_6f() {
- [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
- if [ ! -f $DIR/$tfile ]; then
- touch $DIR/$tfile
- chgrp $RUNAS_ID $DIR/$tfile
- fi
$RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
$CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
}
-run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
+run_test 6e "touch f6e; chgrp f6e; $RUNAS chgrp f6e (should return error) =="
test_6g() {
[ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
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) ]] &&
+ skip "Need MDS version at least 2.3.64" && return
+
local WDIR=$DIR/${tdir}o
local mdt_index
local mdtdevname
test_24d() {
test_mkdir $DIR/$tdir
test_mkdir $DIR/$tdir/d$testnum.1
- test_mkdir $DIR/$tdir/d$ttestnum.2
+ test_mkdir $DIR/$tdir/d$testnum.2
mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2
$CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists"
$CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir"
test_24v() {
local NRFILES=100000
- local FREE_INODES=$(lfs_df -i | grep "summary" | awk '{print $4}')
+ local FREE_INODES=$(mdt_free_inodes 0)
[ $FREE_INODES -lt $NRFILES ] && \
skip "not enough free inodes $FREE_INODES required $NRFILES" &&
return
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
trap simple_cleanup_common EXIT
+ # Performance issue on ZFS see LU-4072 (c.f. LU-2887)
+ [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000
+
mkdir -p $DIR/$tdir
createmany -m $DIR/$tdir/$tfile $NRFILES
mkdir -p $remote_dir/tgt_dir
touch $remote_dir/tgt_file
+ mrename $remote_dir $DIR/ &&
+ error "rename dir cross MDT works!"
+
mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir &&
error "rename dir cross MDT works!"
}
run_test 24z "rename one remote dir to another remote dir should fail"
+test_24A() { # LU-3182
+ local NFILES=5000
+
+ rm -rf $DIR/$tdir
+ mkdir -p $DIR/$tdir
+ createmany -m $DIR/$tdir/$tfile $NFILES
+ local t=`ls $DIR/$tdir | wc -l`
+ 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)"
+ fi
+
+ rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24A "readdir() returns correct number of entries."
+
test_25a() {
echo '== symlink sanity ============================================='
test_mkdir -p $DIR/$tdir
test_mkdir $DIR/$tdir/$tfile || error "mkdir $DIR/$tdir/$tfile failed"
cd $DIR/$tdir/$tfile || error "cd $DIR/$tdir/$tfile failed"
- test_mkdir -p lndir bar1 || error "mkdir lndir/bar1 failed"
+ test_mkdir -p lndir/bar1 || error "mkdir lndir/bar1 failed"
test_mkdir $DIR/$tdir/$tfile/$tfile || error "mkdir $tfile failed"
cd $tfile || error "cd $tfile failed"
ln -s .. dotdot || error "ln dotdot failed"
$GETSTRIPE -c $DIR/d27/f01
[ $($GETSTRIPE -c $DIR/d27/f01) -eq 2 ] ||
error "two-stripe file doesn't have two stripes"
-}
-run_test 27b "create two stripe file"
-
-test_27c() {
- [ -f $DIR/d27/f01 ] || skip "test_27b not run" && return
dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
}
-run_test 27c "write to two stripe file"
+run_test 27b "create and write to two stripe file"
test_27d() {
test_mkdir -p $DIR/d27
[ ! -d $DIR/d27 ] && test_mkdir -p $DIR d27
$SETSTRIPE -S 67108864 $FILE || error "setstripe failed"
BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+ [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "1:$BLKSIZE > $LL_MAX_BLKSIZE"
dd if=/dev/zero of=$FILE bs=4k count=1
BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
- [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
+ [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "2:$BLKSIZE > $LL_MAX_BLKSIZE"
}
run_test 27k "limit i_blksize for broken user apps ============="
# on the mdt's osc
local mdtosc_proc1=$(get_mdtosc_proc_path mds${MDSIDX} $OST)
local last_id=$(do_facet mds${MDSIDX} lctl get_param -n \
- osc.$mdtosc_proc1.prealloc_last_id)
+ osc.$mdtosc_proc1.prealloc_last_id)
local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \
- osc.$mdtosc_proc1.prealloc_next_id)
+ osc.$mdtosc_proc1.prealloc_next_id)
local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX})
do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc*
}
run_test 31n "check link count of unlinked file"
+link_one() {
+ local TEMPNAME=$(mktemp $1_XXXXXX)
+ mlink $TEMPNAME $1 2> /dev/null &&
+ echo "$BASHPID: link $TEMPNAME to $1 succeeded"
+ munlink $TEMPNAME
+}
+
+test_31o() { # LU-2901
+ mkdir -p $DIR/$tdir
+ for LOOP in $(seq 100); do
+ rm -f $DIR/$tdir/$tfile*
+ for THREAD in $(seq 8); do
+ link_one $DIR/$tdir/$tfile.$LOOP &
+ done
+ wait
+ local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
+ [ $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"
+
cleanup_test32_mount() {
trap 0
$UMOUNT $DIR/$tdir/ext2-mountpoint
}
run_test 39m "test atime and mtime before 1970"
+test_39n() { # LU-3832
+ local atime_diff=$(do_facet $SINGLEMDS \
+ lctl get_param -n mdd.*MDT0000*.atime_diff)
+ local atime0
+ local atime1
+ local atime2
+
+ do_facet $SINGLEMDS lctl set_param -n mdd.*MDT0000*.atime_diff=1
+
+ rm -rf $DIR/$tfile
+ dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 status=noxfer
+ atime0=$(stat -c %X $DIR/$tfile)
+
+ sleep 5
+ $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
+ atime1=$(stat -c %X $DIR/$tfile)
+
+ sleep 5
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ $MULTIOP $DIR/$tfile oO_RDONLY:O_NOATIME:r4096c
+ atime2=$(stat -c %X $DIR/$tfile)
+
+ do_facet $SINGLEMDS \
+ lctl set_param -n mdd.*MDT0000*.atime_diff=$atime_diff
+
+ [ "$atime0" -eq "$atime1" ] || error "atime0 $atime0 != atime1 $atime1"
+ [ "$atime1" -eq "$atime2" ] || error "atime0 $atime0 != atime1 $atime1"
+}
+run_test 39n "check that O_NOATIME is honored"
+
+test_39o() {
+ TESTDIR=$DIR/$tdir/$tfile
+ [ -e $TESTDIR ] && rm -rf $TESTDIR
+ mkdir -p $TESTDIR
+ cd $TESTDIR
+ links1=2
+ ls
+ mkdir a b
+ ls
+ links2=$(stat -c %h .)
+ [ $(($links1 + 2)) != $links2 ] &&
+ error "wrong links count $(($links1 + 2)) != $links2"
+ rmdir b
+ links3=$(stat -c %h .)
+ [ $(($links1 + 1)) != $links3 ] &&
+ error "wrong links count $links1 != $links3"
+ return 0
+}
+run_test 39o "directory cached attributes updated after create ========"
+
test_40() {
dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1
$RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile &&
test_mkdir -p $DIR/$tdir
cp -p `which $MULTIOP` $DIR/$tdir/multiop ||
cp -p multiop $DIR/$tdir/multiop
- MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/test43.junk O_c ||
+ MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
return 1
MULTIOP_PID=$!
$MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success"
kill -USR1 $MULTIOP_PID || return 2
wait $MULTIOP_PID || return 3
- rm $TMP/test43.junk
+ rm $TMP/$tfile.junk $DIR/$tdir/multiop
}
run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
test_mkdir -p $DIR/$tdir
cp -p `which $MULTIOP` $DIR/$tdir/multiop ||
cp -p multiop $DIR/$tdir/multiop
- MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/test43.junk O_c ||
+ MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
return 1
MULTIOP_PID=$!
$TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success"
kill -USR1 $MULTIOP_PID || return 2
wait $MULTIOP_PID || return 3
- rm $TMP/test43.junk
+ rm $TMP/$tfile.junk $DIR/$tdir/multiop
}
run_test 43b "truncate of file being executed should return -ETXTBSY"
run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
test_54a() {
- [ ! -f "$SOCKETSERVER" ] &&
- skip_env "no socketserver, skipping" && return
- [ ! -f "$SOCKETCLIENT" ] &&
- skip_env "no socketclient, skipping" && return
- $SOCKETSERVER $DIR/socket
- $SOCKETCLIENT $DIR/socket || error "$SOCKETCLIENT $DIR/socket failed"
- $MUNLINK $DIR/socket
+ $SOCKETSERVER $DIR/socket ||
+ error "$SOCKETSERVER $DIR/socket failed: $?"
+ $SOCKETCLIENT $DIR/socket ||
+ error "$SOCKETCLIENT $DIR/socket failed: $?"
+ $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
}
run_test 54a "unix domain socket test =========================="
test_56a() { # was test_56
rm -rf $DIR/$tdir
$SETSTRIPE -d $DIR
- test_mkdir $DIR/$tdir
- test_mkdir $DIR/$tdir/dir
+ test_mkdir -p $DIR/$tdir/dir
NUMFILES=3
NUMFILESx2=$(($NUMFILES * 2))
for i in `seq 1 $NUMFILES` ; do
}
run_test 56x "lfs migration support"
+test_56y() {
+ local res=""
+
+ local dir0=$DIR/$tdir/$testnum
+ mkdir -p $dir0 || error "creating dir $dir0"
+ local f1=$dir0/file1
+ local f2=$dir0/file2
+
+ touch $f1 || error "creating std file $f1"
+ $MULTIOP $f2 H2c || error "creating released file $f2"
+
+ # a directory can be raid0, so ask only for files
+ res=$($LFIND $dir0 -L raid0 -type f | wc -l)
+ [[ $res == 2 ]] || error "search raid0: found $res files != 2"
+
+ res=$($LFIND $dir0 \! -L raid0 -type f | wc -l)
+ [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
+
+ # only files can be released, so no need to force file search
+ res=$($LFIND $dir0 -L released)
+ [[ $res == $f2 ]] || error "search released: found $res != $f2"
+
+ res=$($LFIND $dir0 \! -L released)
+ [[ $res == $f1 ]] || error "search !released: found $res != $f1"
+
+}
+run_test 56y "lfs find -L raid0|released"
+
test_57a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
# note test will not do anything if MDS is not local
test_60a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
remote_mgs_nodsh && skip "remote MGS with nodsh" && return
- [ ! -f run-llog.sh ] && skip_env "missing subtest run-llog.sh" && return
+ do_facet mgs "! which run-llog.sh &> /dev/null" &&
+ skip_env "missing subtest run-llog.sh" && return
log "$TEST60_HEAD - from kernel mode"
do_facet mgs sh run-llog.sh
}
test_64b () {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- [ ! -f oos.sh ] && skip_env "missing subtest oos.sh" && return
- sh oos.sh $MOUNT
+ sh oos.sh $MOUNT || error "oos.sh failed: $?"
}
run_test 64b "check out-of-space detection on client ==========="
set_checksums 0
rm -f $DIR/$tfile
}
-run_test 77a "normal checksum read/write operation ============="
+run_test 77a "normal checksum read/write operation"
test_77b() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
$GSS && skip "could not run with gss" && return
[ ! -f $F77_TMP ] && setup_f77
#define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
- lctl set_param fail_loc=0x80000409
+ $LCTL set_param fail_loc=0x80000409
set_checksums 1
- dd if=$F77_TMP of=$DIR/f77b bs=1M count=$F77SZ conv=sync || \
+
+ dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
error "dd error: $?"
- lctl set_param fail_loc=0
- set_checksums 0
-}
-run_test 77b "checksum error on client write ===================="
+ $LCTL set_param fail_loc=0
-test_77c() { # bug 10889
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- [ ! -f $DIR/f77b ] && skip "requires 77b - skipping" && return
- set_checksums 1
for algo in $CKSUM_TYPES; do
cancel_lru_locks osc
set_checksum_type $algo
#define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
- lctl set_param fail_loc=0x80000408
- cmp $F77_TMP $DIR/f77b || error "file compare failed"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0x80000408
+ cmp $F77_TMP $DIR/$tfile || error "file compare failed"
+ $LCTL set_param fail_loc=0
done
set_checksums 0
set_checksum_type $ORIG_CSUM_TYPE
- rm -f $DIR/f77b
+ rm -f $DIR/$tfile
}
-run_test 77c "checksum error on client read ==================="
+run_test 77b "checksum error on client write, read"
test_77d() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
$GSS && skip "could not run with gss" && return
#define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
- lctl set_param fail_loc=0x80000409
+ $LCTL set_param fail_loc=0x80000409
set_checksums 1
- directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
+ $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
error "direct write: rc=$?"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0
set_checksums 0
-}
-run_test 77d "checksum error on OST direct write ==============="
-test_77e() { # bug 10889
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- [ ! -f $DIR/f77 ] && skip "requires 77d - skipping" && return
#define OBD_FAIL_OSC_CHECKSUM_RECEIVE 0x408
- lctl set_param fail_loc=0x80000408
+ $LCTL set_param fail_loc=0x80000408
set_checksums 1
cancel_lru_locks osc
- directio read $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
+ $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
error "direct read: rc=$?"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0
set_checksums 0
}
-run_test 77e "checksum error on OST direct read ================"
+run_test 77d "checksum error on OST direct write, read"
test_77f() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
cancel_lru_locks osc
set_checksum_type $algo
#define OBD_FAIL_OSC_CHECKSUM_SEND 0x409
- lctl set_param fail_loc=0x409
- directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) && \
+ $LCTL set_param fail_loc=0x409
+ $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
error "direct write succeeded"
- lctl set_param fail_loc=0
+ $LCTL set_param fail_loc=0
done
set_checksum_type $ORIG_CSUM_TYPE
set_checksums 0
}
-run_test 77f "repeat checksum error on write (expect error) ===="
+run_test 77f "repeat checksum error on write (expect error)"
test_77g() { # bug 10889
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ ! -f $F77_TMP ] && setup_f77
- $SETSTRIPE -c 1 -i 0 $DIR/f77g
+ $SETSTRIPE -c 1 -i 0 $DIR/$tfile
#define OBD_FAIL_OST_CHECKSUM_RECEIVE 0x21a
do_facet ost1 lctl set_param fail_loc=0x8000021a
set_checksums 1
- dd if=$F77_TMP of=$DIR/f77g bs=1M count=$F77SZ || \
+ dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ ||
error "write error: rc=$?"
do_facet ost1 lctl set_param fail_loc=0
set_checksums 0
-}
-run_test 77g "checksum error on OST write ======================"
-test_77h() { # bug 10889
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- $GSS && skip "could not run with gss" && return
- remote_ost_nodsh && skip "remote OST with nodsh" && return
-
- [ ! -f $DIR/f77g ] && skip "requires 77g - skipping" && return
cancel_lru_locks osc
#define OBD_FAIL_OST_CHECKSUM_SEND 0x21b
do_facet ost1 lctl set_param fail_loc=0x8000021b
set_checksums 1
- cmp $F77_TMP $DIR/f77g || error "file compare failed"
+ cmp $F77_TMP $DIR/$tfile || error "file compare failed"
do_facet ost1 lctl set_param fail_loc=0
set_checksums 0
}
-run_test 77h "checksum error on OST read ======================="
+run_test 77g "checksum error on OST write, read"
test_77i() { # bug 13805
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
done
remount_client $MOUNT
}
-run_test 77i "client not supporting OSD_CONNECT_CKSUM =========="
+run_test 77i "client not supporting OSD_CONNECT_CKSUM"
test_77j() { # bug 13805
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
done
remount_client $MOUNT
}
-run_test 77j "client only supporting ADLER32 ===================="
+run_test 77j "client only supporting ADLER32"
[ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
rm -f $F77_TMP
local STRIPE_SIZE=1048576
local FILE_LENGTH=$((STRIPE_SIZE*100))
local nreads=10000
- local osc
-
- setup_test101bc
+ local osc_rpc_stats
- cancel_lru_locks osc
- $LCTL set_param osc.*.rpc_stats 0
- $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
- for osc in $($LCTL get_param -N osc.*); do
- if [ "$osc" == "osc.num_refs" ]; then
- continue
- fi
-
- local lines=$($LCTL get_param -n ${osc}.rpc_stats | wc | awk '{print $1}')
- if [ $lines -le 20 ]; then
- continue
- fi
+ setup_test101bc
- local rpc4k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "1:" { print $2; exit; }')
- local rpc8k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "2:" { print $2; exit; }')
- local rpc16k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "4:" { print $2; exit; }')
- local rpc32k=$($LCTL get_param -n ${osc}.rpc_stats |
- awk '$1 == "8:" { print $2; exit; }')
-
- [ $rpc4k != 0 ] && error "Small 4k read IO ${rpc4k}!"
- [ $rpc8k != 0 ] && error "Small 8k read IO ${rpc8k}!"
- [ $rpc16k != 0 ] && error "Small 16k read IO ${rpc16k}!"
- [ $rpc32k != 0 ] && error "Small 32k read IO ${rpc32k}!"
- echo "${osc} rpc check passed!"
- done
- cleanup_test101bc
- true
+ cancel_lru_locks osc
+ $LCTL set_param osc.*.rpc_stats 0
+ $READS -f $DIR/$tfile -s$FILE_LENGTH -b65536 -n$nreads -t 180
+ for osc_rpc_stats in $($LCTL get_param -N osc.*.rpc_stats); do
+ local stats=$($LCTL get_param -n $osc_rpc_stats)
+ local lines=$(echo "$stats" | awk 'END {print NR;}')
+ local size
+
+ if [ $lines -le 20 ]; then
+ continue
+ fi
+ for size in 1 2 4 8; do
+ local rpc=$(echo "$stats" |
+ awk '($1 == "'$size':") {print $2; exit; }')
+ [ $rpc != 0 ] &&
+ error "Small $((size*4))k read IO $rpc !"
+ done
+ echo "$osc_rpc_stats check passed!"
+ done
+ cleanup_test101bc
+ true
}
run_test 101c "check stripe_size aligned read-ahead ================="
local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }')
[ $space -gt $((size * 1024)) ] ||
- { skip "Need free space ${size}M, have $space" && return; }
+ { skip "Need free space ${size}M, have ${space}K" && return; }
- echo Creating ${size}M test file $file
- dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
- echo Cancel LRU locks on lustre client to flush the client cache
- cancel_lru_locks osc
+ echo "Creating test file $file of size ${size}M with ${space}K free space"
+ $SETSTRIPE -c -1 $file || error "setstripe failed"
+ dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed"
+ echo Cancel LRU locks on lustre client to flush the client cache
+ cancel_lru_locks osc
echo Disable read-ahead
local old_READAHEAD=$(set_read_ahead 0)
return 0;
}
-run_test 102l "listxattr filter test =================================="
+run_test 102l "listxattr size test =================================="
+
+test_102m() { # LU-3403 llite: error of listxattr when buffer is small
+ local path=$DIR/$tfile
+ touch $path
+
+ listxattr_size_check $path || error "listattr_size_check $path failed"
+}
+run_test 102m "Ensure listxattr fails on small bufffer ========"
cleanup_test102
[ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2 OSTs" && return
echo -n "Free space priority "
- lctl get_param -n lov.*-clilov-*.qos_prio_free
+ do_facet $SINGLEMDS lctl get_param -n lo*.*-mdtlov.qos_prio_free |
+ head -1
declare -a AVAIL
free_min_max
- [ $MINV -gt 960000 ] && skip "too much free space in OST$MINI, skip" &&\
- return
- # generate uneven OSTs
+ [ $MINV -eq 0 ] && skip "no 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}
- declare -i FILL
- FILL=$(($MINV / 4))
- echo "Filling 25% remaining space in OST${MINI} with ${FILL}Kb"
- $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI}||error "setstripe failed"
- i=0
- while [ $FILL -gt 0 ]; do
- i=$(($i + 1))
- dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i bs=2M count=1 2>/dev/null
- FILL=$(($FILL - 2048))
- echo -n .
- done
- FILL=$(($MINV / 4))
- sync
- sleep_maxage
+ local FILL=$(($MINV / 4))
+ local DIFF=$(($MAXV - $MINV))
+ local DIFF2=$(($DIFF * 100 / $MINV))
+
+ local threshold=$(do_facet $SINGLEMDS \
+ lctl get_param -n *.*MDT0000-mdtlov.qos_threshold_rr | head -1)
+ threshold=${threshold%%%}
+ echo -n "Check for uneven OSTs: "
+ echo -n "diff=${DIFF}KB (${DIFF2}%) must be > ${threshold}% ..."
+
+ if [ $DIFF2 -gt $threshold ]; then
+ echo "ok"
+ echo "Don't need to fill OST$MINI"
+ else
+ # generate uneven OSTs. Write 2% over the QOS threshold value
+ echo "no"
+ DIFF=$(($threshold - $DIFF2 + 2))
+ DIFF2=$(( ($MINV * $DIFF)/100 ))
+ echo "Fill ${DIFF}% remaining space in OST${MINI} with ${DIFF2}KB"
+ $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI} ||
+ error "setstripe failed"
+ DIFF=$(($DIFF2 / 2048))
+ i=0
+ while [ $i -lt $DIFF ]; do
+ i=$(($i + 1))
+ dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i \
+ bs=2M count=1 2>/dev/null
+ echo -n .
+ done
+ echo .
+ sync
+ sleep_maxage
+ free_min_max
+ fi
- free_min_max
DIFF=$(($MAXV - $MINV))
DIFF2=$(($DIFF * 100 / $MINV))
- echo -n "diff=${DIFF}=${DIFF2}% must be > 20% for QOS mode..."
- if [ $DIFF2 -gt 20 ]; then
- echo "ok"
+ echo -n "diff=${DIFF}=${DIFF2}% must be > ${threshold}% for QOS mode..."
+ if [ $DIFF2 -gt $threshold ]; then
+ echo "ok"
else
- echo "failed - QOS mode won't be used"
- error_ignore "QOS imbalance criteria not met"
- return
+ echo "failed - QOS mode won't be used"
+ skip "QOS imbalance criteria not met"
+ simple_cleanup_common
+ return
fi
MINI1=$MINI; MINV1=$MINV
MAXI1=$MAXI; MAXV1=$MAXV
# now fill using QOS
- echo writing a bunch of files to QOS-assigned OSTs
$SETSTRIPE -c 1 $DIR/$tdir
+ FILL=$(($FILL / 200))
+ if [ $FILL -gt 600 ]; then
+ FILL=600
+ fi
+ echo "writing $FILL files to QOS-assigned OSTs"
i=0
- while [ $FILL -gt 0 ]; do
- i=$(($i + 1))
- dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1024 count=200 2>/dev/null
- FILL=$(($FILL - 200))
- echo -n .
+ while [ $i -lt $FILL ]; do
+ i=$(($i + 1))
+ dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=200k \
+ count=1 2>/dev/null
+ echo -n .
done
echo "wrote $i 200k files"
sync
echo "free space delta: orig $DIFF final $DIFF2"
[ $DIFF2 -gt $DIFF ] && echo "delta got worse!"
DIFF=$(($MINV1 - ${AVAIL[$MINI1]}))
- echo "Wrote $DIFF to smaller OST $MINI1"
+ echo "Wrote ${DIFF}KB to smaller OST $MINI1"
DIFF2=$(($MAXV1 - ${AVAIL[$MAXI1]}))
- echo "Wrote $DIFF2 to larger OST $MAXI1"
- [ $DIFF -gt 0 ] && echo "Wrote $(($DIFF2 * 100 / $DIFF - 100))% more data to larger OST $MAXI1"
+ echo "Wrote ${DIFF2}KB to larger OST $MAXI1"
+ FILL=$(($DIFF2 * 100 / $DIFF - 100))
+ [ $DIFF -gt 0 ] &&
+ echo "Wrote ${FILL}% more data to larger OST $MAXI1"
# Figure out which files were written where
UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
- awk '/'$MINI1': / {print $2; exit}')
+ awk '/'$MINI1': / {print $2; exit}')
echo $UUID
- MINC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+ MINC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MINC files created on smaller OST $MINI1"
UUID=$(lctl get_param -n lov.${FSNAME}-clilov-*.target_obd |
- awk '/'$MAXI1': / {print $2; exit}')
+ awk '/'$MAXI1': / {print $2; exit}')
echo $UUID
- MAXC=$($GETSTRIPE --obd $UUID $DIR/$tdir | wc -l)
+ MAXC=$($GETSTRIPE --ost $UUID $DIR/$tdir | grep $DIR | wc -l)
echo "$MAXC files created on larger OST $MAXI1"
- [ $MINC -gt 0 ] && echo "Wrote $(($MAXC * 100 / $MINC - 100))% more files to larger OST $MAXI1"
- [ $MAXC -gt $MINC ] || error_ignore "stripe QOS didn't balance free space"
-
- rm -rf $DIR/$tdir
+ FILL=$(($MAXC * 100 / $MINC - 100))
+ [ $MINC -gt 0 ] &&
+ echo "Wrote ${FILL}% more files to larger OST $MAXI1"
+ [ $MAXC -gt $MINC ] ||
+ error_ignore LU-9 "stripe QOS didn't balance free space"
+ simple_cleanup_common
}
run_test 116a "stripe QOS: free space balance ==================="
echo "Truncate succeeded."
rm -f $DIR/$tfile
}
-run_test 117 "verify fsfilt_extend =========="
+run_test 117 "verify osd extend =========="
NO_SLOW_RESENDCOUNT=4
export OLD_RESENDCOUNT=""
skip "no early lock cancel on server" && return 0
lru_resize_disable mdc
lru_resize_disable osc
- test_mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2
+ test_mkdir -p $DIR/$tdir/d1
+ test_mkdir -p $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
test_mkdir -p $DIR/$tdir
lru_resize_disable mdc
lru_resize_disable osc
- test_mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2
+ test_mkdir -p $DIR/$tdir/d1
+ test_mkdir -p $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
fi
remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ ENOSPC=28
EFBIG=27
- MAX=16384
- set_dir_limits $MAX
test_mkdir -p $DIR/$tdir
+ MAX=$(stat -c%s "$DIR/$tdir")
+ set_dir_limits $MAX
local I=0
local J=0
- while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
+ while [ ! $I -gt $MAX ]; do
$MULTIOP $DIR/$tdir/$J Oc
rc=$?
- if [ $rc -eq $EFBIG ]; then
+ #check two errors ENOSPC for new version of ext4 max_dir_size patch
+ #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
+ #and EFBIG for previous versions
+ if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
set_dir_limits 0
echo "return code $rc received as expected"
- return 0
+ multiop $DIR/$tdir/$J Oc
+ rc=$?
+ I=$(stat -c%s "$DIR/$tdir")
+ if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
+ return 0
+ else
+ error_exit "return code $rc current dir size $I " \
+ "previous limit $MAX"
+ fi
elif [ $rc -ne 0 ]; then
set_dir_limits 0
- error_exit "return code $rc received instead of expected $EFBIG"
+ error_exit "return code $rc received instead of expected " \
+ "$EFBIG or $ENOSPC, files in dir $I"
fi
J=$((J+1))
I=$(stat -c%s "$DIR/$tdir")
done
set_dir_limits 0
- error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
+ error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes"
}
run_test 129 "test directory size limit ========================"
$SETSTRIPE -S 65536 -c $OSTCOUNT $fm_file||error "setstripe on $fm_file"
[ "$(facet_fstype ost$(($($GETSTRIPE -i $fm_file) + 1)))" = "zfs" ] &&
skip "ORI-366/LU-1941: FIEMAP unimplemented on ZFS" && return
- dd if=/dev/zero of=$fm_file bs=1M count=$OSTCOUNT || error "dd failed on $fm_file"
+
+ local actual_stripecnt=$($GETSTRIPE -c $fm_file)
+ dd if=/dev/zero of=$fm_file bs=1M count=$actual_stripecnt ||
+ error "dd failed on $fm_file"
filefrag -ves $fm_file || error "filefrag $fm_file failed"
- filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" | grep -v "ext:" | grep -v "found"`
+ filefrag_op=`filefrag -ve $fm_file | grep -A 100 "ext:" |
+ grep -v "ext:" | grep -v "found"`
last_lun=`echo $filefrag_op | cut -d: -f5`
(( tot_len += ext_len ))
last_lun=$frag_lun
done
- if (( num_luns != OSTCOUNT || tot_len != 1024 )); then
+ if (( num_luns != actual_stripecnt || tot_len != 1024 )); then
cleanup_130
error "FIEMAP on $fm_file failed; returned wrong number of luns or wrong len for OST $last_lun"
return
}
run_test 150 "truncate/append tests"
+#LU-2902 roc_hit was not able to read all values from lproc
+function roc_hit_init() {
+ local list=$(comma_list $(osts_nodes))
+ local dir=$DIR/$tdir-check
+ local file=$dir/file
+ local BEFORE
+ local AFTER
+ local idx
+
+ test_mkdir -p $dir
+ #use setstripe to do a write to every ost
+ for i in $(seq 0 $((OSTCOUNT-1))); do
+ $SETSTRIPE -c 1 -i $i $dir || error "$SETSTRIPE $file failed"
+ 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
+
+ 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 }')
+
+ echo BEFORE:$BEFORE AFTER:$AFTER
+ if ! let "AFTER - BEFORE == 4"; then
+ rm -rf $dir
+ error "roc_hit is not safe to use"
+ fi
+ rm $file
+ done
+
+ rm -rf $dir
+}
+
function roc_hit() {
local list=$(comma_list $(osts_nodes))
- #debug temp debug for LU-2902: lets see what values we get back
- echo $(get_osd_param $list '' stats) 1>&2
echo $(get_osd_param $list '' stats |
- awk '/'cache_hit'/ {sum+=$2} END {print sum}')
+ awk '$1 == "cache_hit" {sum += $2} END { print sum }')
}
function set_cache() {
return 0
fi
+ roc_hit_init
+
#define OBD_FAIL_OBD_NO_LRU 0x609
do_nodes $list $LCTL set_param fail_loc=0x609
mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
error "rename to $MOUNT/.lustre/fid should fail."
- local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
- local new_obf_mode=777
+ if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.51) ]
+ then # LU-3547
+ local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
+ local new_obf_mode=777
- echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
- chmod $new_obf_mode $DIR/.lustre/fid ||
- error "chmod $new_obf_mode $DIR/.lustre/fid failed"
+ echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
+ chmod $new_obf_mode $DIR/.lustre/fid ||
+ error "chmod $new_obf_mode $DIR/.lustre/fid failed"
- local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
- [ $obf_mode -eq $new_obf_mode ] ||
- error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
+ local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
+ [ $obf_mode -eq $new_obf_mode ] ||
+ error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
- echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
- chmod $old_obf_mode $DIR/.lustre/fid ||
- error "chmod $old_obf_mode $DIR/.lustre/fid failed"
+ echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
+ chmod $old_obf_mode $DIR/.lustre/fid ||
+ error "chmod $old_obf_mode $DIR/.lustre/fid failed"
+ fi
$OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
fid=$($LFS path2fid $test_dir/$tfile-2)
rm -rf $test_dir/$tfile-2
}
+test_154A() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
+ skip "Need MDS version at least 2.4.1" && return
+
+ touch $DIR/$tfile
+ local FID=$($LFS path2fid $DIR/$tfile)
+ [ -z "$FID" ] && error "path2fid unable to get $DIR/$tfile FID"
+
+ # check that we get the same pathname back
+ local FOUND=$($LFS fid2path $MOUNT $FID)
+ [ -z "$FOUND" ] && error "fid2path unable to get $FID path"
+ [ "$FOUND" != "$DIR/$tfile" ] &&
+ error "fid2path(path2fid($DIR/$tfile)) = $FOUND != $DIR/$tfile"
+
+ rm -rf $DIR/$tfile
+}
+run_test 154A "lfs path2fid and fid2path basic checks"
+
test_154a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.51) ]] ||
}
run_test 154b "Open-by-FID for remote directory"
+test_154c() {
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
+ skip "Need MDS version at least 2.4.1" && return
+
+ touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
+ local FID1=$($LFS path2fid $DIR/$tfile.1)
+ local FID2=$($LFS path2fid $DIR/$tfile.2)
+ local FID3=$($LFS path2fid $DIR/$tfile.3)
+
+ local N=1
+ $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
+ [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
+ error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
+ local want=FID$N
+ [ "$FID" = "${!want}" ] ||
+ error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
+ N=$((N + 1))
+ done
+
+ $LFS fid2path $MOUNT $FID1 $FID2 $FID3 | while read PATHNAME; do
+ [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
+ error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
+ N=$((N + 1))
+ done
+}
+run_test 154c "lfs path2fid and fid2path multiple arguments"
+
test_155_small_load() {
local temp=$TMP/$tfile
local file=$DIR/$tfile
skip "LU-1956/LU-2261: stats unimplemented on OSD ZFS" &&
return
+ roc_hit_init
+
log "Turn on read and write cache"
set_cache read on
set_cache writethrough on
BEFORE=`roc_hit`
cat $file >/dev/null
AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
-
+ if ! let "AFTER - BEFORE == 0"; then
+ error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
log "Turn on the read cache and turn off the write cache"
set_cache read on
cancel_lru_locks osc
cat $file >/dev/null
AFTER=`roc_hit`
- if ! let "AFTER - BEFORE == 0"; then
- error_ignore 20762 "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
- fi
+ if ! let "AFTER - BEFORE == 0"; then
+ error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
log "Read again; it should be satisfied from the cache."
BEFORE=`roc_hit`
#Changelogs
err17935 () {
- if [ $MDSCOUNT -gt 1 ]; then
- error_ignore 17935 $*
- else
- error $*
- fi
+ if [ $MDSCOUNT -gt 1 ]; then
+ error_ignore bz17935 $*
+ else
+ error $*
+ fi
}
changelog_chmask()
{
- MASK=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_mask |\
- grep -c $1)
+ local CL_MASK_PARAM="mdd.$MDT0.changelog_mask"
- if [ $MASK -eq 1 ]; then
- do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="-$1"
- else
- do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="+$1"
- fi
+ MASK=$(do_facet $SINGLEMDS $LCTL get_param $CL_MASK_PARAM| grep -c "$1")
+
+ if [ $MASK -eq 1 ]; then
+ do_facet $SINGLEMDS $LCTL set_param $CL_MASK_PARAM="-$1"
+ else
+ do_facet $SINGLEMDS $LCTL set_param $CL_MASK_PARAM="+$1"
+ fi
}
-test_160() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
- { skip "Need MDS version at least 2.2.0"; return; }
- USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
- echo "Registered as changelog user $USER"
- do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \
- grep -q $USER || error "User $USER not found in changelog_users"
-
- # change something
- test_mkdir -p $DIR/$tdir/pics/2008/zachy
- touch $DIR/$tdir/pics/2008/zachy/timestamp
- cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
- mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
- ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
- ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
- rm $DIR/$tdir/pics/desktop.jpg
-
- $LFS changelog $MDT0 | tail -5
-
- echo "verifying changelog mask"
- changelog_chmask "MKDIR"
- changelog_chmask "CLOSE"
-
- test_mkdir -p $DIR/$tdir/pics/zach/sofia
- echo "zzzzzz" > $DIR/$tdir/pics/zach/file
-
- changelog_chmask "MKDIR"
- changelog_chmask "CLOSE"
-
- test_mkdir -p $DIR/$tdir/pics/2008/sofia
- echo "zzzzzz" > $DIR/$tdir/pics/zach/file
-
- $LFS changelog $MDT0
- MKDIRS=$($LFS changelog $MDT0 | tail -5 | grep -c "MKDIR")
- CLOSES=$($LFS changelog $MDT0 | tail -5 | grep -c "CLOSE")
- [ $MKDIRS -eq 1 ] || err17935 "MKDIR changelog mask count $DIRS != 1"
- [ $CLOSES -eq 1 ] || err17935 "CLOSE changelog mask count $DIRS != 1"
-
- # verify contents
- echo "verifying target fid"
- fidc=$($LFS changelog $MDT0 | grep timestamp | grep "CREAT" | \
- tail -1 | awk '{print $6}')
- fidf=$($LFS path2fid $DIR/$tdir/pics/zach/timestamp)
- [ "$fidc" == "t=$fidf" ] || \
- err17935 "fid in changelog $fidc != file fid $fidf"
- echo "verifying parent fid"
- fidc=$($LFS changelog $MDT0 | grep timestamp | grep "CREAT" | \
- tail -1 | awk '{print $7}')
- fidf=$($LFS path2fid $DIR/$tdir/pics/zach)
- [ "$fidc" == "p=$fidf" ] || \
- err17935 "pfid in changelog $fidc != dir fid $fidf"
-
- USER_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \
- mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}')
- $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
- USER_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \
- mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}')
- echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
- [ $USER_REC2 == $(($USER_REC1 + 5)) ] || \
- err17935 "user index should be $(($USER_REC1 + 5)); is $USER_REC2"
-
- MIN_REC=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_users | \
- awk 'min == "" || $2 < min {min = $2}; END {print min}')
- FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
- echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
- [ $FIRST_REC == $(($MIN_REC + 1)) ] || \
- err17935 "first index should be $(($MIN_REC + 1)); is $FIRST_REC"
-
- echo "verifying user deregister"
- do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
- do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \
- grep -q $USER && error "User $USER still found in changelog_users"
-
- USERS=$(( $(do_facet $SINGLEMDS $LCTL get_param -n \
- mdd.$MDT0.changelog_users | wc -l) - 2 ))
- if [ $USERS -eq 0 ]; then
- LAST_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \
- mdd.$MDT0.changelog_users | head -1 | awk '{print $3}')
- touch $DIR/$tdir/chloe
- LAST_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \
- mdd.$MDT0.changelog_users | head -1 | awk '{print $3}')
- echo "verify changelogs are off if we were the only user: $LAST_REC1 == $LAST_REC2"
- [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
- else
- echo "$USERS other changelog users; can't verify off"
- fi
+changelog_extract_field() {
+ local mdt=$1
+ local cltype=$2
+ local file=$3
+ local identifier=$4
+
+ $LFS changelog $mdt | gawk "/$cltype.*$file$/ {
+ print gensub(/^.* "$identifier'(\[[^\]]*\]).*$/,"\\1",1)}' |
+ tail -1
+}
+
+test_160a() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
+ { skip "Need MDS version at least 2.2.0"; return; }
+
+ local CL_USERS="mdd.$MDT0.changelog_users"
+ local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+ USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
+ echo "Registered as changelog user $USER"
+ $GET_CL_USERS | grep -q $USER ||
+ error "User $USER not found in changelog_users"
+
+ # change something
+ test_mkdir -p $DIR/$tdir/pics/2008/zachy
+ touch $DIR/$tdir/pics/2008/zachy/timestamp
+ cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
+ mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
+ ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
+ ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
+ rm $DIR/$tdir/pics/desktop.jpg
+
+ $LFS changelog $MDT0 | tail -5
+
+ echo "verifying changelog mask"
+ changelog_chmask "MKDIR"
+ changelog_chmask "CLOSE"
+
+ test_mkdir -p $DIR/$tdir/pics/zach/sofia
+ echo "zzzzzz" > $DIR/$tdir/pics/zach/file
+
+ changelog_chmask "MKDIR"
+ changelog_chmask "CLOSE"
+
+ test_mkdir -p $DIR/$tdir/pics/2008/sofia
+ echo "zzzzzz" > $DIR/$tdir/pics/zach/file
+
+ $LFS changelog $MDT0
+ MKDIRS=$($LFS changelog $MDT0 | tail -5 | grep -c "MKDIR")
+ CLOSES=$($LFS changelog $MDT0 | tail -5 | grep -c "CLOSE")
+ [ $MKDIRS -eq 1 ] || err17935 "MKDIR changelog mask count $DIRS != 1"
+ [ $CLOSES -eq 1 ] || err17935 "CLOSE changelog mask count $DIRS != 1"
+
+ # verify contents
+ echo "verifying target fid"
+ fidc=$(changelog_extract_field $MDT0 "CREAT" "timestamp" "t=")
+ fidf=$($LFS path2fid $DIR/$tdir/pics/zach/timestamp)
+ [ "$fidc" == "$fidf" ] ||
+ err17935 "fid in changelog $fidc != file fid $fidf"
+ echo "verifying parent fid"
+ fidc=$(changelog_extract_field $MDT0 "CREAT" "timestamp" "p=")
+ fidf=$($LFS path2fid $DIR/$tdir/pics/zach)
+ [ "$fidc" == "$fidf" ] ||
+ err17935 "pfid in changelog $fidc != dir fid $fidf"
+
+ USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
+ $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
+ USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
+ echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
+ [ $USER_REC2 == $(($USER_REC1 + 5)) ] ||
+ err17935 "user index expected $(($USER_REC1 + 5)) is $USER_REC2"
+
+ MIN_REC=$($GET_CL_USERS |
+ awk 'min == "" || $2 < min {min = $2}; END {print min}')
+ FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
+ echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
+ [ $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' ')
+ $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' ')
+ echo "verifying index survives MDT restart: $CUR_REC1 == $CUR_REC2"
+ [ $CUR_REC1 == $CUR_REC2 ] ||
+ err17935 "current index should be $CUR_REC1 is $CUR_REC2"
+
+ echo "verifying user deregister"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+ $GET_CL_USERS | grep -q $USER &&
+ error "User $USER still in changelog_users"
+
+ USERS=$(( $($GET_CL_USERS | wc -l) - 2 ))
+ if [ $USERS -eq 0 ]; then
+ LAST_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+ touch $DIR/$tdir/chloe
+ LAST_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+ echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2"
+ [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
+ else
+ echo "$USERS other changelog users; can't verify off"
+ fi
+}
+run_test 160a "changelog sanity"
+
+test_160b() { # LU-3587
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
+ { skip "Need MDS version at least 2.2.0"; return; }
+
+ local CL_USERS="mdd.$MDT0.changelog_users"
+ local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+ USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
+ echo "Registered as changelog user $USER"
+ $GET_CL_USERS | grep -q $USER ||
+ error "User $USER not found in changelog_users"
+
+ local LONGNAME1=$(str_repeat a 255)
+ local LONGNAME2=$(str_repeat b 255)
+
+ cd $DIR
+ echo "creating very long named file"
+ touch $LONGNAME1 || error "create of $LONGNAME1 failed"
+ echo "moving very long named file"
+ mv $LONGNAME1 $LONGNAME2
+
+ $LFS changelog $MDT0 | grep RENME
+
+ echo "deregistering $USER"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+
+ rm -f $LONGNAME2
}
-run_test 160 "changelog sanity"
+run_test 160b "Verify that very long rename doesn't crash in changelog"
test_161a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
}
run_test 161b "link ea sanity under remote directory"
+test_161c() {
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.5) ]] &&
+ skip "Need MDS version at least 2.1.5" && return
+
+ # define CLF_RENAME_LAST 0x0001
+ # rename overwrite a target having nlink = 1 (changelog flag 0x1)
+ local USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+ changelog_register -n)
+ rm -rf $DIR/$tdir
+ mkdir -p $DIR/$tdir
+ touch $DIR/$tdir/foo_161c
+ touch $DIR/$tdir/bar_161c
+ mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
+ $LFS changelog $MDT0 | grep RENME
+ local flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | \
+ cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x1" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x1"
+ fi
+ echo "rename overwrite a target having nlink = 1," \
+ "changelog record has flags of $flags"
+
+ # rename overwrite a target having nlink > 1 (changelog flag 0x0)
+ touch $DIR/$tdir/foo_161c
+ touch $DIR/$tdir/bar_161c
+ ln $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
+ mv -f $DIR/$tdir/foo_161c $DIR/$tdir/bar_161c
+ $LFS changelog $MDT0 | grep RENME
+ flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x0" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x0"
+ fi
+ echo "rename overwrite a target having nlink > 1," \
+ "changelog record has flags of $flags"
+
+ # rename doesn't overwrite a target (changelog flag 0x0)
+ touch $DIR/$tdir/foo_161c
+ mv -f $DIR/$tdir/foo_161c $DIR/$tdir/foo2_161c
+ $LFS changelog $MDT0 | grep RENME
+ flags=$($LFS changelog $MDT0 | grep RENME | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x0" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x0"
+ fi
+ echo "rename doesn't overwrite a target," \
+ "changelog record has flags of $flags"
+
+ # define CLF_UNLINK_LAST 0x0001
+ # unlink a file having nlink = 1 (changelog flag 0x1)
+ rm -f $DIR/$tdir/foo2_161c
+ $LFS changelog $MDT0 | grep UNLNK
+ flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x1" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x1"
+ fi
+ echo "unlink a file having nlink = 1," \
+ "changelog record has flags of $flags"
+
+ # unlink a file having nlink > 1 (changelog flag 0x0)
+ ln -f $DIR/$tdir/bar_161c $DIR/$tdir/foobar_161c
+ rm -f $DIR/$tdir/foobar_161c
+ $LFS changelog $MDT0 | grep UNLNK
+ flags=$($LFS changelog $MDT0 | grep UNLNK | tail -1 | cut -f5 -d' ')
+ $LFS changelog_clear $MDT0 $USER 0
+ if [ x$flags != "x0x0" ]; then
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister \
+ $USER
+ error "flag $flags is not 0x0"
+ fi
+ echo "unlink a file having nlink > 1," \
+ "changelog record has flags of $flags"
+ do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+}
+run_test 161c "check CL_RENME[UNLINK] changelog record flags"
+
check_path() {
local expected=$1
shift
}
run_test 162 "path lookup sanity"
-test_163() {
- [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- copytool --test $FSNAME || { skip "copytool not runnable: $?" && return; }
- copytool $FSNAME &
- sleep 1
- local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid)
- # this proc file is temporary and linux-only
- do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
- error "kernel->userspace send failed"
- kill -INT $!
-}
-run_test 163 "kernel <-> userspace comms"
-
test_169() {
# do directio so as not to populate the page cache
log "creating a 10 Mb file"
obdecho_test() {
local OBD=$1
local node=$2
+ local pages=${3:-64}
local rc=0
local id
do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
echo "New object id is $id"
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
rc=4; }
- [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 10 w v 64 $id" ||
- rc=4; }
+ [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \
+ "test_brw 10 w v $pages $id" || rc=4; }
[ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
rc=4; }
[ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \
}
run_test 180b "test obdecho directly on obdfilter"
+test_180c() { # LU-2598
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] &&
+ skip "Need MDS version at least 2.4.0" && return
+
+ local rc=0
+ local rmmod_remote=false
+ local pages=16384 # 64MB bulk I/O RPC size
+ local target
+
+ 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]}
+ else
+ echo "there is no obdfilter target on ost1"
+ rc=2
+ fi
+ $rmmod_remote && do_facet ost1 "rmmod obdecho" || true
+ return $rc
+}
+run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
+
test_181() { # bug 22177
test_mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
# create enough files to index the directory
run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
test_183() { # LU-2275
+ [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] &&
+ skip "Need MDS version at least 2.3.56" && return
+
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
echo aaa > $DIR/$tdir/$tfile
test_185() { # LU-2441
+ # LU-3553 - no volatile file support in old servers
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] ||
+ { skip "Need MDS version at least 2.3.60"; return 0; }
+
mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
touch $DIR/$tdir/spoo
local mtime1=$(stat -c "%Y" $DIR/$tdir)
}
run_test 185 "Volatile file support"
+test_187a() {
+ local dir0=$DIR/$tdir/$testnum
+ mkdir -p $dir0 || error "creating dir $dir0"
+
+ local file=$dir0/file1
+ dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
+ local dv1=$($LFS data_version $file)
+ dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
+ local dv2=$($LFS data_version $file)
+ [[ $dv1 != $dv2 ]] ||
+ error "data version did not change on write $dv1 == $dv2"
+
+ # clean up
+ rm -f $file1
+}
+run_test 187a "Test data version change"
+
+test_187b() {
+ local dir0=$DIR/$tdir/$testnum
+ mkdir -p $dir0 || error "creating dir $dir0"
+
+ declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
+ [[ ${DV[0]} != ${DV[1]} ]] ||
+ error "data version did not change on write"\
+ " ${DV[0]} == ${DV[1]}"
+
+ # clean up
+ rm -f $file1
+}
+run_test 187b "Test data version change on volatile file"
+
# OST pools tests
check_file_in_pool()
{
}
run_test 207b "can refresh layout at open"
+test_208() {
+ # FIXME: in this test suite, only RD lease is used. This is okay
+ # for now as only exclusive open is supported. After generic lease
+ # is done, this test suite should be revised. - Jinshan
+
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] ||
+ { skip "Need MDS version at least 2.4.52"; return 0; }
+
+ echo "==== test 1: verify get lease work"
+ $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
+
+ echo "==== test 2: verify lease can be broken by upcoming open"
+ $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
+ local PID=$!
+ sleep 1
+
+ $MULTIOP $DIR/$tfile oO_RDONLY:c
+ kill -USR1 $PID && wait $PID || error "break lease error"
+
+ echo "==== test 3: verify lease can't be granted if an open already exists"
+ $MULTIOP $DIR/$tfile oO_RDONLY:_c &
+ local PID=$!
+ sleep 1
+
+ $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
+ kill -USR1 $PID && wait $PID || error "open file error"
+
+ echo "==== test 4: lease can sustain over recovery"
+ $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
+ PID=$!
+ sleep 1
+
+ fail mds1
+
+ kill -USR1 $PID && wait $PID || error "lease broken over recovery"
+
+ echo "==== test 5: lease broken can't be regained by replay"
+ $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
+ PID=$!
+ sleep 1
+
+ # open file to break lease and then recovery
+ $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
+ fail mds1
+
+ kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
+
+ rm -f $DIR/$tfile
+}
+run_test 208 "Exclusive open"
+
test_212() {
size=`date +%s`
size=$((size % 8192 + 1))
run_test 213 "OSC lock completion and cancel race don't crash - bug 18829"
test_214() { # for bug 20133
- test_mkdir -p $DIR/d214p/d214c
+ mkdir -p $DIR/$tdir/d214c || error "mkdir $DIR/$tdir/d214c failed"
for (( i=0; i < 340; i++ )) ; do
- touch $DIR/d214p/d214c/a$i
+ touch $DIR/$tdir/d214c/a$i
done
- ls -l $DIR/d214p || error "ls -l $DIR/d214p failed"
- mv $DIR/d214p/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
+ ls -l $DIR/$tdir || error "ls -l $DIR/d214p failed"
+ mv $DIR/$tdir/d214c $DIR/ || error "mv $DIR/d214p/d214c $DIR/ failed"
ls $DIR/d214c || error "ls $DIR/d214c failed"
+ rm -rf $DIR/$tdir || error "rm -rf $DIR/d214* failed"
rm -rf $DIR/d214* || error "rm -rf $DIR/d214* failed"
}
run_test 214 "hash-indexed directory test - bug 20133"
# /proc/sys/lnet/routes should look like this:
# Routing disabled/enabled
- # net hops state router
- # where net is a string like tcp0, hops >= 0, state is up/down,
+ # net hops priority state router
+ # where net is a string like tcp0, hops > 0, priority >= 0,
+ # state is up/down,
# router is a string like 192.168.1.1@tcp2
L1="^Routing (disabled|enabled)$"
- L2="^net +hops +state +router$"
- BR="^$NET +$N +(up|down) +$NID$"
+ L2="^net +hops +priority +state +router$"
+ BR="^$NET +$N +(0|1) +(up|down) +$NID$"
create_lnet_proc_files "routes"
check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2"
check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
}
run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
+test_229() { # LU-2482, LU-3448
+ [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ rm -f $DIR/$tfile
+
+ # Create a file with a released layout and stripe count 2.
+ $MULTIOP $DIR/$tfile H2c ||
+ error "failed to create file with released layout"
+
+ $GETSTRIPE -v $DIR/$tfile
+
+ local pattern=$($GETSTRIPE -L $DIR/$tfile)
+ [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
+
+ local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
+ [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
+ stat $DIR/$tfile || error "failed to stat released file"
+
+ chown $RUNAS_ID $DIR/$tfile ||
+ error "chown $RUNAS_ID $DIR/$tfile failed"
+
+ chgrp $RUNAS_ID $DIR/$tfile ||
+ error "chgrp $RUNAS_ID $DIR/$tfile failed"
+
+ touch $DIR/$tfile || error "touch $DIR/$tfile failed"
+ rm $DIR/$tfile || error "failed to remove released file"
+}
+run_test 229 "getstripe/stat/rm/attr changes work on released files"
+
test_230a() {
[ $PARALLEL == "yes" ] && skip "skip parallel run" && return
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
run_test 232 "failed lock should not block umount"
test_233() {
+ [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] ||
+ { skip "Need MDS version at least 2.3.64"; return; }
+
local fid=$($LFS path2fid $MOUNT)
stat $MOUNT/.lustre/fid/$fid > /dev/null ||
error "cannot access $MOUNT using its FID '$fid'"
}
run_test 233 "checking that OBF of the FS root succeeds"
+test_234() {
+ local p="$TMP/sanityN-$TESTNAME.parameters"
+ save_lustre_params client "llite.*.xattr_cache" > $p
+ lctl set_param llite.*.xattr_cache 1 ||
+ { skip "xattr cache is not supported"; return 0; }
+
+ mkdir -p $DIR/$tdir || error "mkdir failed"
+ touch $DIR/$tdir/$tfile || error "touch failed"
+ # OBD_FAIL_LLITE_XATTR_ENOMEM
+ $LCTL set_param fail_loc=0x1405
+ if [ ! -f /etc/SuSE-release ]; then
+ # attr pre-2.4.44-7 had a bug with rc
+ # LU-3703 - SLES clients have older attr
+ getfattr -n user.attr $DIR/$tdir/$tfile &&
+ error "getfattr should have failed with ENOMEM"
+ fi
+ $LCTL set_param fail_loc=0x0
+ rm -rf $DIR/$tdir
+
+ restore_lustre_params < $p
+ rm -f $p
+}
+run_test 234 "xattr cache should not crash on ENOMEM"
+
+test_235() {
+ [ $(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=$?
+ case $RC in
+ 0)
+ ;;
+ 124) error "process hangs on a deadlock"
+ ;;
+ *) error "error executing flock_deadlock $DIR/$tfile"
+ ;;
+ esac
+}
+run_test 235 "LU-1715: flock deadlock detection does not work properly"
+
+#LU-2935
+test_236() {
+ check_swap_layouts_support && return 0
+ test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
+
+ local ref1=/etc/passwd
+ local ref2=/etc/group
+ local file1=$DIR/$tdir/f1
+ local file2=$DIR/$tdir/f2
+
+ $SETSTRIPE -c 1 $file1 || error "cannot setstripe on '$file1': rc = $?"
+ cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?"
+ $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?"
+ cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?"
+ exec {FD}<>$file2
+ rm $file2
+ $LFS swap_layouts $file1 /proc/self/fd/${FD} ||
+ error "cannot swap layouts of '$file1' and /proc/self/fd/${FD}"
+ exec {FD}>&-
+ cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)"
+
+ #cleanup
+ rm -rf $DIR/$tdir
+}
+run_test 236 "Layout swap on open unlinked file"
+
#
# tests that do cleanup/setup should be run at the end
#