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
opts+=${L_GETIDENTITY:+" --param=mdt.identity_upcall=$L_GETIDENTITY"}
if [ $fstype == ldiskfs ]; then
+ # Check for wide striping
+ if [ $OSTCOUNT -gt 160 ]; then
+ MDSJOURNALSIZE=${MDSJOURNALSIZE:-4096}
+ fs_mkfs_opts+="-O large_xattr"
+ fi
+
fs_mkfs_opts+=${MDSJOURNALSIZE:+" -J size=$MDSJOURNALSIZE"}
if [ ! -z $EJOURNAL ]; then
fs_mkfs_opts+=${MDSJOURNALSIZE:+" device=$EJOURNAL"}
}
cleanup_mount () {
- local clients=${CLIENTS:-$HOSTNAME}
- local mntpt=$1
+ local clients=${CLIENTS:-$HOSTNAME}
+ local mntpt=$1
- zconf_umount_clients $clients $mntpt
+ zconf_umount_clients $clients $mntpt
}
cleanup_and_setup_lustre() {
if [ "$type" == ost ]; then
devs=$(get_osd_param $node "" mntdev)
else
- devs=$(do_node $node \
- "lctl get_param -n osd-*.$FSNAME-M*.mntdev")
+ devs=$(do_node $node $LCTL get_param -n osd-*.$FSNAME-M*.mntdev)
fi
for dev in $devs; do
case $dev in
# Get all of the server target devices.
get_svr_devs() {
- local i
+ local node
+ local i
- # MDT device
- MDTDEV=$(get_mnt_devs $(mdts_nodes) mdt)
+ # Master MDS parameters used by lfsck
+ MDTNODE=$(facet_active_host $SINGLEMDS)
+ MDTDEV=$(echo $(get_mnt_devs $MDTNODE mdt) | awk '{print $1}')
- # OST devices
- i=0
- for node in $(osts_nodes); do
- OSTDEVS[i]=$(get_mnt_devs $node ost)
- i=$((i + 1))
- done
+ # MDT devices
+ i=0
+ for node in $(mdts_nodes); do
+ MDTDEVS[i]=$(get_mnt_devs $node mdt)
+ i=$((i + 1))
+ done
+
+ # OST devices
+ i=0
+ for node in $(osts_nodes); do
+ OSTDEVS[i]=$(get_mnt_devs $node ost)
+ i=$((i + 1))
+ done
}
# Run e2fsck on MDT or OST device.
run_e2fsck() {
- local node=$1
- local target_dev=$2
- local extra_opts=$3
+ local node=$1
+ local target_dev=$2
+ local extra_opts=$3
+ local cmd="$E2FSCK -d -v -t -t -f $extra_opts $target_dev"
+ local log=$TMP/e2fsck.log
+ local rc=0
- df > /dev/null # update statfs data on disk
- local cmd="$E2FSCK -d -v -t -t -f $extra_opts $target_dev"
- echo $cmd
- local rc=0
- do_node $node $cmd || rc=$?
- [ $rc -le $FSCK_MAX_ERR ] || \
- error "$cmd returned $rc, should be <= $FSCK_MAX_ERR"
- return 0
+ echo $cmd
+ do_node $node $cmd 2>&1 | tee $log
+ rc=${PIPESTATUS[0]}
+ if [ -n "$(grep "DNE mode isn't supported" $log)" ]; then
+ rm -f $log
+ if [ $MDSCOUNT -gt 1 ]; then
+ skip "DNE mode isn't supported!"
+ cleanupall
+ exit_status
+ else
+ error "It's not DNE mode."
+ fi
+ fi
+ rm -f $log
+
+ [ $rc -le $FSCK_MAX_ERR ] ||
+ error "$cmd returned $rc, should be <= $FSCK_MAX_ERR"
+
+ return 0
}
#
# Run e2fsck on MDT and OST(s) to generate databases used for lfsck.
generate_db() {
- local i
- local ostidx
- local dev
+ local i
+ local ostidx
+ local dev
+ local node
[[ $(lustre_version_code $SINGLEMDS) -ne $(version_code 2.2.0) ]] ||
{ skip "Lustre 2.2.0 lacks the patch for LU-1255"; exit 0; }
- check_shared_dir $SHARED_DIRECTORY ||
- error "$SHARED_DIRECTORY isn't a shared directory"
-
- export MDSDB=$SHARED_DIRECTORY/mdsdb
- export OSTDB=$SHARED_DIRECTORY/ostdb
+ check_shared_dir $SHARED_DIRECTORY ||
+ error "$SHARED_DIRECTORY isn't a shared directory"
- [ $MDSCOUNT -eq 1 ] || error "CMD is not supported"
+ export MDSDB=$SHARED_DIRECTORY/mdsdb
+ export OSTDB=$SHARED_DIRECTORY/ostdb
- run_e2fsck $(mdts_nodes) $MDTDEV "-n --mdsdb $MDSDB"
+ # DNE is not supported, so when running e2fsck on a DNE filesystem,
+ # we only pass master MDS parameters.
+ run_e2fsck $MDTNODE $MDTDEV "-n --mdsdb $MDSDB"
i=0
ostidx=0
fi
#Run lfsck
echo $cmd
- do_node $node $cmd || rc=$?
+ do_node $client $cmd || rc=$?
#Umount if necessary
if ! $mounted; then
zconf_umount $client $MOUNT ||
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() {
build_test_filter() {
EXCEPT="$EXCEPT $(testslist_filter)"
- [ "$ONLY" ] && log "only running test `echo $ONLY`"
- for O in $ONLY; do
- eval ONLY_${O}=true
- done
+ for O in $ONLY; do
+ if [[ $O = [0-9]*-[0-9]* ]]; then
+ for num in $(seq $(echo $O | tr '-' ' ')); do
+ eval ONLY_$num=true
+ done
+ else
+ eval ONLY_${O}=true
+ fi
+ done
+
[ "$EXCEPT$ALWAYS_EXCEPT" ] && \
log "excepting tests: `echo $EXCEPT $ALWAYS_EXCEPT`"
[ "$EXCEPT_SLOW" ] && \
}
#
-# 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
}
_wait_osc_import_state() {
- local facet=$1
- local ost_facet=$2
- local expected=$3
- local ost=$(get_osc_import_name $facet $ost_facet)
-
+ local facet=$1
+ local ost_facet=$2
+ local expected=$3
+ local ost=$(get_osc_import_name $facet $ost_facet)
local param="osc.${ost}.ost_server_uuid"
+ local params=$param
local i=0
- # 1. wait the deadline of client 1st request (it could be skipped)
- # 2. wait the deadline of client 2nd request
- local maxtime=$(( 2 * $(request_timeout $facet)))
-
- #During setup time, the osc might not be setup, it need wait
- #until list_param can return valid value. And also if there
- #are mulitple osc entries we should list all of them before
- #go to wait.
- local params=$($LCTL list_param $param 2>/dev/null || true)
- while [ -z "$params" ]; do
- if [ $i -ge $maxtime ]; then
- echo "can't get $param by list_param in $maxtime secs"
- if [[ $facet != client* ]]; then
- echo "Go with $param directly"
- params=$param
- break
- else
+ # 1. wait the deadline of client 1st request (it could be skipped)
+ # 2. wait the deadline of client 2nd request
+ local maxtime=$(( 2 * $(request_timeout $facet)))
+
+ if [[ $facet == client* ]]; then
+ # During setup time, the osc might not be setup, it need wait
+ # until list_param can return valid value. And also if there
+ # are mulitple osc entries we should list all of them before
+ # go to wait.
+ params=$($LCTL list_param $param 2>/dev/null || true)
+ while [ -z "$params" ]; do
+ if [ $i -ge $maxtime ]; then
+ echo "can't get $param in $maxtime secs"
return 1
fi
- fi
- sleep 1
- i=$((i + 1))
- params=$($LCTL list_param $param 2>/dev/null || true)
- done
-
+ sleep 1
+ i=$((i + 1))
+ params=$($LCTL list_param $param 2>/dev/null || true)
+ done
+ fi
if ! do_rpc_nodes "$(facet_active_host $facet)" \
wait_import_state $expected "$params" $maxtime; then
error "import is not in ${expected} state"
}
#
+# 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() {