export I_MOUNTED=${I_MOUNTED:-"no"}
if [ ! -f /lib/modules/$(uname -r)/kernel/fs/lustre/mdt.ko -a \
! -f /lib/modules/$(uname -r)/updates/kernel/fs/lustre/mdt.ko -a \
+ ! -f /lib/modules/$(uname -r)/extra/kernel/fs/lustre/mdt.ko -a \
! -f $LUSTRE/mdt/mdt.ko ]; then
export CLIENTMODSONLY=yes
fi
load_module ../ldiskfs/ldiskfs
load_module osd-ldiskfs/osd_ldiskfs
fi
+ load_module nodemap/nodemap
load_module mgs/mgs
load_module mdd/mdd
load_module mdt/mdt
}
#
+# Create ZFS storage pool.
+#
+create_zpool() {
+ local facet=$1
+ local poolname=$2
+ local vdev=$3
+ shift 3
+ local opts=${@:-"-o cachefile=none"}
+
+ do_facet $facet "$ZPOOL list -H $poolname >/dev/null 2>&1 ||
+ $ZPOOL create -f $opts $poolname $vdev"
+}
+
+#
+# Create ZFS file system.
+#
+create_zfs() {
+ local facet=$1
+ local dataset=$2
+ shift 2
+ local opts=${@:-"-o mountpoint=legacy"}
+
+ do_facet $facet "$ZFS list -H $dataset >/dev/null 2>&1 ||
+ $ZFS create $opts $dataset"
+}
+
+#
# Export ZFS storage pool.
# Before exporting the pool, all datasets within the pool should be unmounted.
#
}
#
+# Destroy ZFS storage pool.
+# Destroy the given pool and free up any devices for other use. This command
+# tries to unmount any active datasets before destroying the pool.
+# -f Force any active datasets contained within the pool to be unmounted.
+#
+destroy_zpool() {
+ local facet=$1
+ local poolname=${2:-$(zpool_name $facet)}
+
+ if [[ -n "$poolname" ]]; then
+ do_facet $facet "! $ZPOOL list -H $poolname >/dev/null 2>&1 ||
+ $ZPOOL destroy -f $poolname"
+ fi
+}
+
+#
# Import ZFS storage pool.
# Force importing, even if the pool appears to be potentially active.
#
local sleep=1
local print=10
+ PREV_RESULT=$(do_node $node "$TEST")
while [ true ]; do
RESULT=$(do_node $node "$TEST")
if [[ "$RESULT" == "$FINAL" ]]; then
varname=${facet}_HOST
if [ -z "${!varname}" ]; then
if [ "${facet:0:3}" == "ost" ]; then
- eval export ${facet}_HOST=${ost_HOST}
+ local fh=${facet%failover}_HOST
+ eval export ${facet}_HOST=${!fh}
+ if [ -z "${!varname}" ]; then
+ eval export ${facet}_HOST=${ost_HOST}
+ fi
elif [ "${facet:0:3}" == "mdt" -o \
"${facet:0:3}" == "mds" -o \
"${facet:0:3}" == "mgs" ]; then
fi
}
+# Device formatted as ost
ostdevname() {
- num=$1
- DEVNAME=OSTDEV$num
+ local num=$1
+ local DEVNAME=OSTDEV$num
local fstype=$(facet_fstype ost$num)
#if $OSTDEVn isn't defined, default is $OSTDEVBASE + num
eval DEVPTR=${!DEVNAME:=${OSTDEVBASE}${num}};;
zfs )
- #dataset name is independent of vdev device names
- eval DEVPTR=${FSNAME}-ost${num}/ost${num};;
+ #try $OSTZFSDEVn - independent of vdev
+ DEVNAME=OSTZFSDEV$num
+ eval DEVPTR=${!DEVNAME:=${FSNAME}-ost${num}/ost${num}};;
* )
error "unknown fstype!";;
esac
echo -n $DEVPTR
}
+# Physical device location of data
ostvdevname() {
- num=$1
- DEVNAME=OSTDEV$num
+ local num=$1
+ local DEVNAME
+ local VDEVPTR
local fstype=$(facet_fstype ost$num)
# vdevs are not supported by ldiskfs
eval VDEVPTR="";;
zfs )
- #if $OSTDEVn isn't defined, default is $OSTDEVBASE + num
+ #if $OSTDEVn isn't defined, default is $OSTDEVBASE{n}
+ # Device formated by zfs
+ DEVNAME=OSTDEV$num
eval VDEVPTR=${!DEVNAME:=${OSTDEVBASE}${num}};;
* )
error "unknown fstype!";;
echo -n $VDEVPTR
}
+# Logical device formated for lustre
mdsdevname() {
- num=$1
- DEVNAME=MDSDEV$num
+ local num=$1
+ local DEVNAME=MDSDEV$num
local fstype=$(facet_fstype mds$num)
case $fstype in
ldiskfs )
- #if $MDSDEVn isn't defined, default is $MDSDEVBASE + num
+ #if $MDSDEVn isn't defined, default is $MDSDEVBASE{n}
eval DEVPTR=${!DEVNAME:=${MDSDEVBASE}${num}};;
zfs )
- #dataset name is independent of vdev device names
- eval DEVPTR=${FSNAME}-mdt${num}/mdt${num};;
+ # try $MDSZFSDEVn - independent of vdev
+ DEVNAME=MDSZFSDEV$num
+ eval DEVPTR=${!DEVNAME:=${FSNAME}-mdt${num}/mdt${num}};;
* )
error "unknown fstype!";;
esac
echo -n $DEVPTR
}
+# Physical location of data
mdsvdevname() {
- num=$1
- DEVNAME=MDSDEV$num
-
+ local VDEVPTR=""
+ local num=$1
local fstype=$(facet_fstype mds$num)
case $fstype in
# vdevs are not supported by ldiskfs
eval VDEVPTR="";;
zfs )
- #if $MDSDEVn isn't defined, default is $MDSDEVBASE + num
+ # if $MDSDEVn isn't defined, default is $MDSDEVBASE{n}
+ # Device formated by ZFS
+ local DEVNAME=MDSDEV$num
eval VDEVPTR=${!DEVNAME:=${MDSDEVBASE}${num}};;
* )
error "unknown fstype!";;
fi;;
zfs )
if [ $(facet_host mgs) = $(facet_host mds1) ] &&
- ( [ -z "$MGSDEV" ] || [ $MGSDEV = $(mdsvdevname 1) ] ); then
+ ( [ -z "$MGSZFSDEV" ] &&
+ [ -z "$MGSDEV" -o "$MGSDEV" = $(mdsvdevname 1) ] ); then
DEVPTR=$(mdsdevname 1)
else
- DEVPTR=${FSNAME}-mgs/mgs
+ DEVPTR=${MGSZFSDEV:-${FSNAME}-mgs/mgs}
fi;;
* )
error "unknown fstype!";;
}
mgsvdevname() {
- local VDEVPTR
- DEVNAME=MGSDEV
+ local VDEVPTR=""
local fstype=$(facet_fstype mgs)
;;
zfs )
if [ $(facet_host mgs) = $(facet_host mds1) ] &&
- ( [ -z "$MGSDEV" ] || [ $MGSDEV = $(mdsvdevname 1) ] ); then
+ ( [ -z "$MGSDEV" ] &&
+ [ -z "$MGSZFSDEV" -o "$MGSZFSDEV" = $(mdsdevname 1) ]); then
VDEVPTR=$(mdsvdevname 1)
- else
+ elif [ -n "$MGSDEV" ]; then
VDEVPTR=$MGSDEV
fi;;
* )
echo -n $mntpt
}
+mount_ldiskfs() {
+ local facet=$1
+ local dev=$(facet_device $facet)
+ local mnt=$(facet_mntpt $facet)
+ local opts
+
+ if ! do_facet $facet test -b $dev; then
+ opts="-o loop"
+ fi
+ do_facet $facet mount -t ldiskfs $opts $dev $mnt
+}
+
+unmount_ldiskfs() {
+ local facet=$1
+ local dev=$(facet_device $facet)
+ local mnt=$(facet_mntpt $facet)
+
+ do_facet $facet umount -d $mnt
+}
+
+var_name() {
+ echo -n "$1" | tr -c '[:alnum:]\n' '_'
+}
+
+mount_zfs() {
+ local facet=$1
+ local ds=$(facet_device $facet)
+ local mnt=$(facet_mntpt $facet)
+ local canmnt
+ local mntpt
+
+ import_zpool $facet
+ canmnt=$(do_facet $facet $ZFS get -H -o value canmount $ds)
+ mntpt=$(do_facet $facet $ZFS get -H -o value mountpoint $ds)
+ do_facet $facet $ZFS set canmount=noauto $ds
+ #
+ # The "legacy" mount method is used here because "zfs unmount $mnt"
+ # calls stat(2) on $mnt/../*, which may include $MOUNT. If certain
+ # targets are not available at the time, the stat(2) on $MOUNT will
+ # hang.
+ #
+ do_facet $facet $ZFS set mountpoint=legacy $ds
+ do_facet $facet mount -t zfs $ds $mnt
+ eval export mz_$(var_name ${facet}_$ds)_canmount=$canmnt
+ eval export mz_$(var_name ${facet}_$ds)_mountpoint=$mntpt
+}
+
+unmount_zfs() {
+ local facet=$1
+ local ds=$(facet_device $facet)
+ local mnt=$(facet_mntpt $facet)
+ local var_mntpt=mz_$(var_name ${facet}_$ds)_mountpoint
+ local var_canmnt=mz_$(var_name ${facet}_$ds)_canmount
+ local mntpt=${!var_mntpt}
+ local canmnt=${!var_canmnt}
+
+ unset $var_mntpt
+ unset $var_canmnt
+ do_facet $facet umount $mnt
+ do_facet $facet $ZFS set mountpoint=$mntpt $ds
+ do_facet $facet $ZFS set canmount=$canmnt $ds
+ export_zpool $facet
+}
+
+mount_fstype() {
+ local facet=$1
+ local fstype=$(facet_fstype $facet)
+
+ mount_$fstype $facet
+}
+
+unmount_fstype() {
+ local facet=$1
+ local fstype=$(facet_fstype $facet)
+
+ unmount_$fstype $facet
+}
+
########
## MountConf setup
pause_bulk() {
#define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
- RC=0
- do_facet ost1 lctl set_param fail_loc=0x214
- do_facet client "$1" || RC=$?
- do_facet client "sync"
- do_facet ost1 lctl set_param fail_loc=0
- return $RC
+ RC=0
+
+ local timeout=${2:-0}
+ # default is (obd_timeout / 4) if unspecified
+ echo "timeout is $timeout/$2"
+ do_facet ost1 lctl set_param fail_val=$timeout fail_loc=0x80000214
+ do_facet client "$1" || RC=$?
+ do_facet client "sync"
+ do_facet ost1 lctl set_param fail_loc=0
+ return $RC
}
drop_ldlm_cancel() {
}
set_nodes_failloc () {
- do_nodes $(comma_list $1) lctl set_param fail_loc=$2
+ do_nodes $(comma_list $1) lctl set_param fail_val=0 fail_loc=$2
}
cancel_lru_locks() {
}
#
-# Run a single test function and cleanup after it.
+# Run a single test function and cleanup after it.
#
# This function should be run in a subshell so the test func can
# exit() without stopping the whole script.
#
run_one() {
- local testnum=$1
- local message=$2
- tfile=f.${TESTSUITE}.${testnum}
- export tdir=d0.${TESTSUITE}/d${base}
- export TESTNAME=test_$testnum
- local SAVE_UMASK=`umask`
- umask 0022
-
- banner "test $testnum: $message"
- test_${testnum} || error "test_$testnum failed with $?"
- cd $SAVE_PWD
- reset_fail_loc
- check_grant ${testnum} || error "check_grant $testnum failed with $?"
- check_catastrophe || error "LBUG/LASSERT detected"
+ local testnum=$1
+ local message=$2
+ export tfile=f${testnum}.${TESTSUITE}
+ export tdir=d${testnum}.${TESTSUITE}
+ export TESTNAME=test_$testnum
+ local SAVE_UMASK=`umask`
+ umask 0022
+
+ banner "test $testnum: $message"
+ test_${testnum} || error "test_$testnum failed with $?"
+ cd $SAVE_PWD
+ reset_fail_loc
+ check_grant ${testnum} || error "check_grant $testnum failed with $?"
+ check_catastrophe || error "LBUG/LASSERT detected"
if [ "$PARALLEL" != "yes" ]; then
ps auxww | grep -v grep | grep -q multiop &&
error "multiop still running"
fi
- unset TESTNAME
- unset tdir
- umask $SAVE_UMASK
- return 0
+ unset TESTNAME
+ unset tdir
+ unset tfile
+ umask $SAVE_UMASK
+ return 0
}
#
fi
log_sub_test_end $TEST_STATUS $duration "$RC" "$TEST_ERROR"
+ if [[ "$TEST_STATUS" != "SKIP" ]] && [[ -f $TF_SKIP ]]; then
+ rm -f $TF_SKIP
+ fi
+
if [ -f $LOGDIR/err ]; then
$FAIL_ON_ERROR && exit $RC
fi
mdsrate_cleanup () {
if [ -d $4 ]; then
- mpi_run -np $1 ${MACHINEFILE_OPTION} $2 ${MDSRATE} --unlink \
+ mpi_run ${MACHINEFILE_OPTION} $2 -np $1 ${MDSRATE} --unlink \
--nfiles $3 --dir $4 --filefmt $5 $6
rmdir $4
fi
########################
-convert_facet2label() {
+convert_facet2label() {
local facet=$1
if [ x$facet = xost ]; then
if [ -n ${!varsvc} ]; then
echo ${!varsvc}
- else
+ else
error "No lablel for $facet!"
fi
}
local file
for node in ${list//,/ }; do
- file=$dir/check_file.$(short_hostname $node)
+ file=$dir/check_file.$(short_nodename $node)
if [[ ! -f "$file" ]]; then
# Logdir not accessible/writable from this node.
return 1
}
#
+# Get the available size (KB) of a given obd target.
+#
+get_obd_size() {
+ local facet=$1
+ local obd=$2
+ local size
+
+ [[ $facet != client ]] || return 0
+
+ size=$(do_facet $facet $LCTL get_param -n *.$obd.kbytesavail | head -n1)
+ echo -n $size
+}
+
+#
+# Get the page size (bytes) on a given facet node.
+#
+get_page_size() {
+ local facet=$1
+ local size
+
+ size=$(do_facet $facet getconf PAGE_SIZE)
+ [[ ${PIPESTATUS[0]} = 0 && -n "$size" ]] || size=4096
+ echo -n $size
+}
+
+#
# Get the block count of the filesystem.
#
get_block_count() {
fi
return $rc
}
+
+# find the smallest and not in use file descriptor
+free_fd()
+{
+ local max_fd=$(ulimit -n)
+ local fd=3
+ while [[ $fd -le $max_fd && -e /proc/self/fd/$fd ]]; do
+ ((++fd))
+ done
+ [ $fd -lt $max_fd ] || error "finding free file descriptor failed"
+ echo $fd
+}