set -e
ONLY=${ONLY:-"$*"}
-# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 12653 12653 5188 16260 19742
-ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 65a 65e 68b $SANITY_EXCEPT"
-# bug number for skipped test: 2108 9789 3637 9789 3561 5188/5749 1443
-#ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27m 42a 42b 42c 42d 45 68 76"}
+# bug number for skipped test: 13297 2108 9789 3637 9789 3561 12622 5188
+ALWAYS_EXCEPT=" 27u 42a 42b 42c 42d 45 51d 68b $SANITY_EXCEPT"
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
# Tests that fail on uml
run_test 27u "skip object creation on OSC w/o objects =========="
test_27v() { # bug 4900
- [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
- remote_mds_nodsh && skip "remote MDS with nodsh" && return
- remote_ost_nodsh && skip "remote OST with nodsh" && return
+ [ "$OSTCOUNT" -lt "2" ] && skip_env "too few OSTs" && return
+ remote_mds_nodsh && skip "remote MDS with nodsh" && return
+ remote_ost_nodsh && skip "remote OST with nodsh" && return
exhaust_all_precreations 0x215
reset_enospc
local FINISH=`date +%s`
local TIMEOUT=`lctl get_param -n timeout`
- [ $((FINISH - START)) -ge $((TIMEOUT / 2)) ] && \
+ local PROCESS=$((FINISH - START))
+ [ $PROCESS -ge $((TIMEOUT / 2)) ] && \
error "$FINISH - $START >= $TIMEOUT / 2"
-
+ sleep $((TIMEOUT / 2 - PROCESS))
reset_enospc
}
run_test 27v "skip object creation on slow OST ================="
for ostnum in $(seq $OSTCOUNT); do
# test-framework's OST numbering is one-based, while Lustre's
# is zero-based
- ostname=$(printf "lustre-OST%.4d" $((ostnum - 1)))
+ ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1)))
# Parsing llobdstat's output sucks; we could grep the /proc
# path, but that's likely to not be as portable as using the
# llobdstat utility. So we parse lctl output instead.
# Total up write_bytes after writing. We'd better find non-zeros.
for ostnum in $(seq $OSTCOUNT); do
- ostname=$(printf "lustre-OST%.4d" $((ostnum - 1)))
+ ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1)))
write_bytes=$(do_facet ost$ostnum lctl get_param -n \
obdfilter/$ostname/stats |
awk '/^write_bytes/ {print $7}' )
if $all_zeros
then
for ostnum in $(seq $OSTCOUNT); do
- ostname=$(printf "lustre-OST%.4d" $((ostnum - 1)))
+ ostname=$(printf "$FSNAME-OST%.4d" $((ostnum - 1)))
echo "Check that write_bytes is present in obdfilter/*/stats:"
do_facet ost$ostnum lctl get_param -n \
obdfilter/$ostname/stats
# test case for lloop driver, basic function
test_68a() {
[ "$UID" != 0 ] && skip_env "must run as root" && return
+ llite_lloop_enabled || \
+ { skip_env "llite_lloop module disabled" && return; }
trap cleanup_68 EXIT
return 0
}
-export ORIG_CSUM_TYPE=""
+export ORIG_CSUM_TYPE="`lctl get_param -n osc/*osc-[^mM]*/checksum_type |
+ sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`"
CKSUM_TYPES=${CKSUM_TYPES:-"crc32 adler"}
+[ "$ORIG_CSUM_TYPE" = "crc32c" ] && CKSUM_TYPES="$CKSUM_TYPES crc32c"
set_checksum_type()
{
- [ "$ORIG_CSUM_TYPE" ] || \
- ORIG_CSUM_TYPE=`lctl get_param -n osc/*osc-[^mM]*/checksum_type |
- sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`
lctl set_param -n osc.*osc-[^mM]*.checksum_type $1
log "set checksum type to $1"
return 0
error "elapsed for 1M@1T = $DIFF"
fi
true
- rm -f $DIR/$tfile
+ rm -f $DIR/$tfile
}
run_test 80 "Page eviction is equally fast at high offsets too ===="
+test_81a() { # LU-456
+ # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
+ # MUST OR with the OBD_FAIL_ONCE (0x80000000)
+ do_facet ost0 lctl set_param fail_loc=0x80000228
+
+ # write should trigger a retry and success
+ $SETSTRIPE -i 0 -c 1 $DIR/$tfile
+ multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
+ RC=$?
+ if [ $RC -ne 0 ] ; then
+ error "write should success, but failed for $RC"
+ fi
+}
+run_test 81a "OST should retry write when get -ENOSPC ==============="
+
+test_81b() { # LU-456
+ # define OBD_FAIL_OST_MAPBLK_ENOSPC 0x228
+ # Don't OR with the OBD_FAIL_ONCE (0x80000000)
+ do_facet ost0 lctl set_param fail_loc=0x228
+
+ # write should retry several times and return -ENOSPC finally
+ $SETSTRIPE -i 0 -c 1 $DIR/$tfile
+ multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c
+ RC=$?
+ ENOSPC=28
+ if [ $RC -ne $ENOSPC ] ; then
+ error "dd should fail for -ENOSPC, but succeed."
+ fi
+}
+run_test 81b "OST should return -ENOSPC when retry still fails ======="
+
+
test_99a() {
[ -z "$(which cvs 2>/dev/null)" ] && skip_env "could not find cvs" && \
return
OSC=`lctl get_param -n devices | awk '/-osc-/ {print $4}' | head -n 1`
lctl --device %$OSC deactivate
lfs df || error "lfs df with deactivated OSC failed"
- lctl --device %$OSC recover
+ lctl --device %$OSC activate
lfs df || error "lfs df with reactivated OSC failed"
rm -f $DIR/$tfile
}
}
run_test 126 "check that the fsgid provided by the client is taken into account"
-test_127() { # bug 15521
+test_127a() { # bug 15521
$SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
$LCTL set_param osc.*.stats=0
FSIZE=$((2048 * 1024))
[ "$read_bytes" != 0 ] || error "no read done"
[ "$write_bytes" != 0 ] || error "no write done"
}
-run_test 127 "verify the client stats are sane"
+run_test 127a "verify the client stats are sane"
+
+test_127b() { # bug LU-333
+ $LCTL set_param llite.*.stats=0
+ FSIZE=65536 # sized fixed to match PAGE_SIZE for most clients
+ # perform 2 reads and writes so MAX is different from SUM.
+ dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
+ dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
+ cancel_lru_locks osc
+ dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1
+ dd if=$DIR/$tfile of=/dev/null bs=$FSIZE count=1
+
+ $LCTL get_param llite.*.stats | grep samples > $TMP/${tfile}.tmp
+ while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
+ echo "got $COUNT $NAME"
+ eval $NAME=$COUNT || error "Wrong proc format"
+
+ case $NAME in
+ read_bytes)
+ [ $COUNT -ne 2 ] && error "count is not 2: $COUNT"
+ [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN"
+ [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX"
+ [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM"
+ ;;
+ write_bytes)
+ [ $COUNT -ne 2 ] && error "count is not 2: $COUNT"
+ [ $MIN -ne $FSIZE ] && error "min is not $FSIZE: $MIN"
+ [ $MAX -ne $FSIZE ] && error "max is incorrect: $MAX"
+ [ $SUM -ne $((FSIZE * 2)) ] && error "sum is wrong: $SUM"
+ ;;
+ *) ;;
+ esac
+ done < $TMP/${tfile}.tmp
+
+ #check that we actually got some stats
+ [ "$read_bytes" ] || error "Missing read_bytes stats"
+ [ "$write_bytes" ] || error "Missing write_bytes stats"
+ [ "$read_bytes" != 0 ] || error "no read done"
+ [ "$write_bytes" != 0 ] || error "no write done"
+}
+run_test 127b "verify the llite client stats are sane"
test_128() { # bug 15212
touch $DIR/$tfile
}
run_test 132 "som avoids glimpse rpc"
+check_stats() {
+ local res
+ local count
+ case $1 in
+ $SINGLEMDS) res=`do_facet $SINGLEMDS $LCTL get_param mdt.$FSNAME-MDT0000.md_stats | grep "$2"`
+ ;;
+ ost) res=`do_facet ost $LCTL get_param obdfilter.$FSNAME-OST0000.stats | grep "$2"`
+ ;;
+ *) error "Wrong argument $1" ;;
+ esac
+ echo $res
+ count=`echo $res | awk '{print $2}'`
+ [ -z "$res" ] && error "The counter for $2 on $1 was not incremented"
+ # if the argument $3 is zero, it means any stat increment is ok.
+ if [ $3 -gt 0 ] ; then
+ [ $count -ne $3 ] && error "The $2 counter on $1 is wrong - expected $3"
+ fi
+}
+
+test_133a() {
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p $DIR/${tdir}
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost $LCTL set_param obdfilter.*.stats=clear
+
+ # verify mdt stats first.
+ mkdir ${testdir} || error "mkdir failed"
+ check_stats $SINGLEMDS "mkdir" 1
+ touch ${testdir}/${tfile} || "touch failed"
+ check_stats $SINGLEMDS "open" 1
+ check_stats $SINGLEMDS "close" 1
+ mknod ${testdir}/${tfile}-pipe p || "mknod failed"
+ check_stats $SINGLEMDS "mknod" 1
+ rm -f ${testdir}/${tfile}-pipe || "pipe remove failed"
+ check_stats $SINGLEMDS "unlink" 1
+ rm -f ${testdir}/${tfile} || error "file remove failed"
+ check_stats $SINGLEMDS "unlink" 2
+
+ # remove working dir and check mdt stats again.
+ rmdir ${testdir} || error "rmdir failed"
+ check_stats $SINGLEMDS "rmdir" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133a "Verifying MDT stats ========================================"
+
+test_133b() {
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p ${testdir} || error "mkdir failed"
+ touch ${testdir}/${tfile} || "touch failed"
+ cancel_lru_locks mdc
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost $LCTL set_param obdfilter.*.stats=clear
+
+ # extra mdt stats verification.
+ chmod 444 ${testdir}/${tfile} || error "chmod failed"
+ check_stats $SINGLEMDS "setattr" 1
+ $LFS df || error "lfs failed"
+ check_stats $SINGLEMDS "statfs" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133b "Verifying extra MDT stats =================================="
+
+test_133c() {
+ local testdir=$DIR/${tdir}/stats_testdir
+ mkdir -p ${testdir} || error "mkdir failed"
+
+ # verify obdfilter stats.
+ $LFS setstripe -c 1 -o 0 ${testdir}/${tfile}
+ sync
+ cancel_lru_locks osc
+
+ # clear stats.
+ do_facet $SINGLEMDS $LCTL set_param mdt.*.md_stats=clear
+ do_facet ost $LCTL set_param obdfilter.*.stats=clear
+
+ dd if=/dev/zero of=${testdir}/${tfile} conv=notrunc bs=1024k count=1 || error "dd failed"
+ sync
+ cancel_lru_locks osc
+ check_stats ost "write" 1
+
+ dd if=${testdir}/${tfile} of=/dev/null bs=1k count=1 || error "dd failed"
+ check_stats ost "read" 1
+
+ > ${testdir}/${tfile} || error "truncate failed"
+ check_stats ost "punch" 1
+
+ rm -f ${testdir}/${tfile} || error "file remove failed"
+ check_stats ost "destroy" 1
+
+ rm -rf $DIR/${tdir}
+}
+run_test 133c "Verifying OST stats ========================================"
+
test_140() { #bug-17379
mkdir -p $DIR/$tdir || error "Creating dir $DIR/$tdir"
cd $DIR/$tdir || error "Changing to $DIR/$tdir"
fi
local osc=$($LCTL dl | grep -v mdt | awk '$3 == "osc" {print $4; exit}')
- local host=$(awk '/current_connection:/ {print $2}' /proc/fs/lustre/osc/$osc/import)
- local target=$(awk '/target:/ {print $2}' /proc/fs/lustre/osc/$osc/import)
+ local host=$(lctl get_param -n osc.$osc.import |
+ awk '/current_connection:/ {print $2}' )
+ local target=$(lctl get_param -n osc.$osc.import |
+ awk '/target:/ {print $2}' )
target=${target%_UUID}
[[ -n $target ]] && { setup_obdecho_osc $host $target || rc=1; } || rc=1
}
run_test 218 "parallel read and truncate should not deadlock ======================="
+test_219() {
+ # write one partial page
+ dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1
+ # set no grant so vvp_io_commit_write will do sync write
+ $LCTL set_param fail_loc=0x411
+ # write a full page at the end of file
+ dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=1 conv=notrunc
+
+ $LCTL set_param fail_loc=0
+ dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3
+ $LCTL set_param fail_loc=0x411
+ dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc
+}
+run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND"
+
+test_220() { #LU-325
+ local OSTIDX=0
+
+ mkdir -p $DIR/$tdir
+ local OST=$(lfs osts | grep ${OSTIDX}": " | \
+ awk '{print $2}' | sed -e 's/_UUID$//')
+
+ # on the mdt's osc
+ local mdtosc_proc1=$(get_mdtosc_proc_path $SINGLEMDS $OST)
+ local last_id=$(do_facet $SINGLEMDS lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_last_id)
+ local next_id=$(do_facet $SINGLEMDS lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_next_id)
+
+ $LFS df -i
+
+ do_facet mgs $LCTL pool_new $FSNAME.$TESTNAME || return 1
+ do_facet mgs $LCTL pool_add $FSNAME.$TESTNAME $OST || return 2
+
+ $SETSTRIPE $DIR/$tdir -i $OSTIDX -c 1 -p $FSNAME.$TESTNAME
+
+ echo "preallocated objects in MDS is $((last_id - next_id))" \
+ "($last_id - $next_id)"
+
+ count=$($LFS df -i $MOUNT | grep ^$OST | awk '{print $4}')
+ echo "OST still has $count objects"
+
+ free=$((count + last_id - next_id))
+ echo "create $((free - next_id)) files @next_id..."
+ createmany -o $DIR/$tdir/f $next_id $free || return 3
+
+ local last_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_last_id)
+ local next_id2=$(do_facet mds${MDSIDX} lctl get_param -n \
+ osc.$mdtosc_proc1.prealloc_next_id)
+
+ echo "after creation, last_id=$last_id2, next_id=$next_id2"
+ $LFS df -i
+
+ echo "cleanup..."
+
+ do_facet mgs $LCTL pool_remove $FSNAME.$TESTNAME $OST || return 4
+ do_facet mgs $LCTL pool_destroy $FSNAME.$TESTNAME || return 5
+ echo "unlink $((free - next_id)) files @ $next_id..."
+ unlinkmany $DIR/$tdir/f $next_id $free || return 3
+}
+run_test 220 "the preallocated objects in MDS still can be used if ENOSPC is returned by OST with enough disk space"
+
#
# tests that do cleanup/setup should be run at the end
#