Skip to content
Snippets Groups Projects
conf-sanity.sh 41.4 KiB
Newer Older
#!/bin/bash
# requirement:
#	add uml1 uml2 uml3 in your /etc/hosts

Robert Read's avatar
Robert Read committed
# FIXME - there is no reason to use all of these different
#   return codes, espcially when most of them are mapped to something
#   else anyway.  The combination of test number and return code
#   figure out what failed.

Nathan Rutman's avatar
Nathan Rutman committed
ONLY=${ONLY:-"$*"}

# bug number for skipped test: 13739 
HEAD_EXCEPT="                  32a 32b "
Nathan Rutman's avatar
Nathan Rutman committed

chenzheng's avatar
chenzheng committed
# bug number for skipped test:                                 
Yury Umanets's avatar
Yury Umanets committed
ALWAYS_EXCEPT=" $CONF_SANITY_EXCEPT $HEAD_EXCEPT"
Nathan Rutman's avatar
Nathan Rutman committed
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!

SRCDIR=`dirname $0`
PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH

PTLDEBUG=${PTLDEBUG:--1}
Elena Gryaznova's avatar
Elena Gryaznova committed
SAVE_PWD=$PWD
LUSTRE=${LUSTRE:-`dirname $0`/..}
RLUSTRE=${RLUSTRE:-$LUSTRE}

. $LUSTRE/tests/test-framework.sh
init_test_env $@
Elena Gryaznova's avatar
Elena Gryaznova committed
# STORED_MDSSIZE is used in test_18
if [ -n "$MDSSIZE" ]; then
    STORED_MDSSIZE=$MDSSIZE
fi
Elena Gryaznova's avatar
Elena Gryaznova committed
# use small MDS + OST size to speed formatting time
MDSSIZE=40000
OSTSIZE=40000
Yury Umanets's avatar
Yury Umanets committed
. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
Elena Gryaznova's avatar
Elena Gryaznova committed
remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
remote_ost_nodsh && skip "remote OST with nodsh" && exit 0

Elena Gryaznova's avatar
Elena Gryaznova committed
#
Yury Umanets's avatar
Yury Umanets committed
[ "$SLOW" = "no" ] && EXCEPT_SLOW="0 1 2 3 6 7 15 18 24b 25 30 31 32 33 34a 45"
Elena Gryaznova's avatar
Elena Gryaznova committed

Elena Gryaznova's avatar
Elena Gryaznova committed
assert_DIR

Nathan Rutman's avatar
Nathan Rutman committed
reformat() {
        formatall
Nathan Rutman's avatar
Nathan Rutman committed
writeconf() {
Yury Umanets's avatar
Yury Umanets committed
    local facet=$SINGLEMDS
    local dev=${facet}_dev
Nathan Rutman's avatar
Nathan Rutman committed
    shift
    stop ${facet} -f
    rm -f ${facet}active
    # who knows if/where $TUNEFS is installed?  Better reformat if it fails...
Yury Umanets's avatar
Yury Umanets committed
    do_facet ${facet} "$TUNEFS --writeconf ${!dev}" || echo "tunefs failed, reformatting instead" && reformat
Nathan Rutman's avatar
Nathan Rutman committed
}
Nathan Rutman's avatar
Nathan Rutman committed
gen_config() {
        reformat
        # The MGS must be started before the OSTs for a new fs, so start
        # and stop to generate the startup logs. 
	start_mds
	start_ost
	sleep 5
	stop_ost
	stop_mds
Yury Umanets's avatar
Yury Umanets committed
	local facet=$SINGLEMDS
Elena Gryaznova's avatar
Elena Gryaznova committed
	# we can not use MDSDEV1 here because SINGLEMDS could be set not to mds1 only
	local num=$(echo $facet | tr -d "mds")
	local dev=$(mdsdevname $num)
Yury Umanets's avatar
Yury Umanets committed
	echo "start mds service on `facet_active_host $facet`"
Elena Gryaznova's avatar
Elena Gryaznova committed
	start $facet ${dev} $MDS_MOUNT_OPTS || return 94
Yury Umanets's avatar
Yury Umanets committed
	echo "stop mds service on `facet_active_host $SINGLEMDS`"
Nathan Rutman's avatar
Nathan Rutman committed
	# These tests all use non-failover stop
Yury Umanets's avatar
Yury Umanets committed
	stop $SINGLEMDS -f  || return 97
Nathan Rutman's avatar
Nathan Rutman committed
	echo "start ost1 service on `facet_active_host ost1`"
	start ost1 `ostdevname 1` $OST_MOUNT_OPTS || return 95
Nathan Rutman's avatar
Nathan Rutman committed
	echo "stop ost1 service on `facet_active_host ost1`"
	# These tests all use non-failover stop
	stop ost1 -f  || return 98
}

start_ost2() {
	echo "start ost2 service on `facet_active_host ost2`"
	start ost2 `ostdevname 2` $OST_MOUNT_OPTS || return 92
}

stop_ost2() {
	echo "stop ost2 service on `facet_active_host ost2`"
	# These tests all use non-failover stop
	stop ost2 -f  || return 93
}

mount_client() {
	local MOUNTPATH=$1
Nathan Rutman's avatar
Nathan Rutman committed
	echo "mount $FSNAME on ${MOUNTPATH}....."
	zconf_mount `hostname` $MOUNTPATH  || return 96
}

remount_client() {
	local SAVEMOUNTOPT=$MOUNTOPT
	MOUNTOPT="remount,$1"
	local MOUNTPATH=$2
	echo "remount '$1' lustre on ${MOUNTPATH}....."
	zconf_mount `hostname`  $MOUNTPATH  || return 96
Nathan Rutman's avatar
Nathan Rutman committed
	MOUNTOPT=$SAVEMOUNTOPT
}

umount_client() {
	local MOUNTPATH=$1
	echo "umount lustre on ${MOUNTPATH}....."
Nathan Rutman's avatar
Nathan Rutman committed
	zconf_umount `hostname` $MOUNTPATH || return 97
Nathan Rutman's avatar
Nathan Rutman committed
	echo "manual umount lustre on ${MOUNT}...."
	do_facet client "umount -d $MOUNT"
	mount_client $MOUNT
Nathan Rutman's avatar
Nathan Rutman committed
cleanup_nocli() {
Yury Umanets's avatar
Yury Umanets committed
	stop_mds || return 201
Nic Henke's avatar
Nic Henke committed
	stop_ost || return 202
Nathan Rutman's avatar
Nathan Rutman committed
	unload_modules || return 203
}

cleanup() {
 	umount_client $MOUNT || return 200
	cleanup_nocli || return $?
Nathan Rutman's avatar
Nathan Rutman committed
	do_facet client "cp /etc/passwd $DIR/a" || return 71
	do_facet client "rm $DIR/a" || return 72
	# make sure lustre is actually mounted (touch will block, 
        # but grep won't, so do it after) 
        do_facet client "grep $MOUNT' ' /proc/mounts > /dev/null" || return 73
	echo "setup single mount lustre success"
}

check_mount2() {
	do_facet client "touch $DIR/a" || return 71	
	do_facet client "rm $DIR/a" || return 72	
	do_facet client "touch $DIR2/a" || return 73	
	do_facet client "rm $DIR2/a" || return 74	
	echo "setup double mount lustre success"
}

build_test_filter

Nathan Rutman's avatar
Nathan Rutman committed
if [ "$ONLY" == "setup" ]; then
	setup
	exit
fi

if [ "$ONLY" == "cleanup" ]; then
	cleanup
	exit
fi

#create single point mountpoint

gen_config
Nathan Rutman's avatar
Nathan Rutman committed

Eric Mei's avatar
Eric Mei committed
init_gss
Nathan Rutman's avatar
Nathan Rutman committed
        setup
	check_mount || return 41
Nic Henke's avatar
Nic Henke committed
	cleanup || return $?
}
run_test 0 "single mount setup"

test_1() {
	start_ost
	echo "start ost second time..."
Nathan Rutman's avatar
Nathan Rutman committed
	setup
	check_mount || return 42
Nic Henke's avatar
Nic Henke committed
	cleanup || return $?
Nathan Rutman's avatar
Nathan Rutman committed
run_test 1 "start up ost twice (should return errors)"
Andreas Dilger's avatar
Andreas Dilger committed
	start_mds
	echo "start mds second time.."
Nathan Rutman's avatar
Nathan Rutman committed
	start_mds
	mount_client $MOUNT
	check_mount || return 43
Nic Henke's avatar
Nic Henke committed
	cleanup || return $?
Nathan Rutman's avatar
Nathan Rutman committed
run_test 2 "start up mds twice (should return err)"
Nathan Rutman's avatar
Nathan Rutman committed
	#mount.lustre returns an error if already in mtab
	mount_client $MOUNT && return $?
	check_mount || return 44
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup || return $?
Nathan Rutman's avatar
Nathan Rutman committed
run_test 3 "mount client twice (should return err)"

test_4() {
	setup
	touch $DIR/$tfile || return 85
Nathan Rutman's avatar
Nathan Rutman committed
	stop_ost -f
Nic Henke's avatar
Nic Henke committed
	eno=$?
	# ok for ost to fail shutdown
	if [ 202 -ne $eno ]; then
		return $eno;
	fi
	return 0
}
run_test 4 "force cleanup ost, then cleanup"

Elena Gryaznova's avatar
Elena Gryaznova committed
test_5a() {	# was test_5
Robert Read's avatar
Robert Read committed
	touch $DIR/$tfile || return 1
Elena Gryaznova's avatar
Elena Gryaznova committed
	fuser -m -v $MOUNT && echo "$MOUNT is in use by user space process."

Nathan Rutman's avatar
Nathan Rutman committed
	stop_mds -f || return 2
Robert Read's avatar
Robert Read committed

	# cleanup may return an error from the failed
	# disconnects; for now I'll consider this successful
Robert Read's avatar
Robert Read committed
	# if all the modules have unloaded.
Nathan Rutman's avatar
Nathan Rutman committed
 	umount -d $MOUNT &
Robert Read's avatar
Robert Read committed
	UMOUNT_PID=$!
Nathan Rutman's avatar
Nathan Rutman committed
	sleep 6
Robert Read's avatar
Robert Read committed
	echo "killing umount"
	kill -TERM $UMOUNT_PID
Robert Read's avatar
Robert Read committed
	echo "waiting for umount to finish"
	wait $UMOUNT_PID
Elena Gryaznova's avatar
Elena Gryaznova committed
	if grep " $MOUNT " /proc/mounts; then
		echo "test 5: /proc/mounts after failed umount"
Nathan Rutman's avatar
Nathan Rutman committed
		umount $MOUNT &
		UMOUNT_PID=$!
		sleep 2
		echo "killing umount"
		kill -TERM $UMOUNT_PID
		echo "waiting for umount to finish"
		wait $UMOUNT_PID
Elena Gryaznova's avatar
Elena Gryaznova committed
		grep " $MOUNT " /proc/mounts && echo "test 5: /proc/mounts after second umount" && return 11
Nathan Rutman's avatar
Nathan Rutman committed
	fi
Robert Read's avatar
Robert Read committed

Nathan Rutman's avatar
Nathan Rutman committed
	manual_umount_client
Robert Read's avatar
Robert Read committed
	# stop_mds is a no-op here, and should not fail
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup_nocli || return $?
	# df may have lingering entry
	manual_umount_client
	# mtab may have lingering entry
Elena Gryaznova's avatar
Elena Gryaznova committed
	local WAIT=0
	local MAX_WAIT=20
	local sleep=1
	while [ "$WAIT" -ne "$MAX_WAIT" ]; do
		sleep $sleep
		grep -q $MOUNT" " /etc/mtab || break
        	echo "Waiting /etc/mtab updated ... "
		WAIT=$(( WAIT + sleep))
	done
	[ "$WAIT" -eq "$MAX_WAIT" ] && error "/etc/mtab is not updated in $WAIT secs"
	echo "/etc/mtab updated in $WAIT secs"
Elena Gryaznova's avatar
Elena Gryaznova committed
run_test 5a "force cleanup mds, then cleanup"
Robert Read's avatar
Robert Read committed
test_5b() {
	start_ost
	[ -d $MOUNT ] || mkdir -p $MOUNT
Nathan Rutman's avatar
Nathan Rutman committed
	grep " $MOUNT " /etc/mtab && echo "test 5b: mtab before mount" && return 10
	mount_client $MOUNT && return 1
	grep " $MOUNT " /etc/mtab && echo "test 5b: mtab after failed mount" && return 11
Andreas Dilger's avatar
Andreas Dilger committed
	umount_client $MOUNT
Robert Read's avatar
Robert Read committed
	# stop_mds is a no-op here, and should not fail
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup_nocli || return $?
Robert Read's avatar
Robert Read committed
	return 0
}
Nathan Rutman's avatar
Nathan Rutman committed
run_test 5b "mds down, cleanup after failed mount (bug 2712) (should return errs)"
Robert Read's avatar
Robert Read committed

test_5c() {
	start_ost
	start_mds
	[ -d $MOUNT ] || mkdir -p $MOUNT
Nathan Rutman's avatar
Nathan Rutman committed
	grep " $MOUNT " /etc/mtab && echo "test 5c: mtab before mount" && return 10
Elena Gryaznova's avatar
Elena Gryaznova committed
	local oldfs="${FSNAME}"
	FSNAME="wrong.${FSNAME}"
	mount_client $MOUNT || :
	FSNAME=${oldfs}
Nathan Rutman's avatar
Nathan Rutman committed
	grep " $MOUNT " /etc/mtab && echo "test 5c: mtab after failed mount" && return 11
	umount_client $MOUNT
	cleanup_nocli  || return $?
Robert Read's avatar
Robert Read committed
}
Nathan Rutman's avatar
Nathan Rutman committed
run_test 5c "cleanup after failed mount (bug 2712) (should return errs)"
Robert Read's avatar
Robert Read committed

Nathan Rutman's avatar
Nathan Rutman committed
	start_ost
	start_mds
	stop_ost -f
	grep " $MOUNT " /etc/mtab && echo "test 5d: mtab before mount" && return 10
	mount_client $MOUNT || return 1
	cleanup  || return $?
	grep " $MOUNT " /etc/mtab && echo "test 5d: mtab after unmount" && return 11
	return 0
}
run_test 5d "mount with ost down"
Nathan Rutman's avatar
Nathan Rutman committed
test_5e() {
	start_ost
	start_mds
Nathan Rutman's avatar
Nathan Rutman committed
#define OBD_FAIL_PTLRPC_DELAY_SEND       0x506
komaln's avatar
komaln committed
	do_facet client "lctl set_param fail_loc=0x80000506"
Nathan Rutman's avatar
Nathan Rutman committed
	grep " $MOUNT " /etc/mtab && echo "test 5e: mtab before mount" && return 10
	mount_client $MOUNT || echo "mount failed (not fatal)"
	cleanup  || return $?
	grep " $MOUNT " /etc/mtab && echo "test 5e: mtab after unmount" && return 11
	return 0
Nathan Rutman's avatar
Nathan Rutman committed
run_test 5e "delayed connect, don't crash (bug 10268)"
test_6() {
	setup
	manual_umount_client
	mount_client ${MOUNT} || return 87
	touch $DIR/a || return 86
Nic Henke's avatar
Nic Henke committed
	cleanup  || return $?
}
run_test 6 "manual umount, then mount again"

test_7() {
	setup
	manual_umount_client
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup_nocli || return $?
}
run_test 7 "manual umount, then cleanup"

test_8() {
Nathan Rutman's avatar
Nathan Rutman committed
	setup
	mount_client $MOUNT2
	check_mount2 || return 45
	umount_client $MOUNT2
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup  || return $?
}
run_test 8 "double mount setup"

wangchao's avatar
wangchao committed
test_9() {
        start_ost

komaln's avatar
komaln committed
	do_facet ost1 lctl set_param debug=\'inode trace\' || return 1
	do_facet ost1 lctl set_param subsystem_debug=\'mds ost\' || return 1
wangchao's avatar
wangchao committed

komaln's avatar
komaln committed
        CHECK_PTLDEBUG="`do_facet ost1 lctl get_param -n debug`"
Nathan Rutman's avatar
Nathan Rutman committed
        if [ "$CHECK_PTLDEBUG" ] && [ "$CHECK_PTLDEBUG" = "trace inode" ];then
           echo "lnet.debug success"
Nathan Rutman's avatar
Nathan Rutman committed
           echo "lnet.debug: want 'trace inode', have '$CHECK_PTLDEBUG'"
komaln's avatar
komaln committed
        CHECK_SUBSYS="`do_facet ost1 lctl get_param -n subsystem_debug`"
Nathan Rutman's avatar
Nathan Rutman committed
        if [ "$CHECK_SUBSYS" ] && [ "$CHECK_SUBSYS" = "mds ost" ]; then
           echo "lnet.subsystem_debug success"
Nathan Rutman's avatar
Nathan Rutman committed
           echo "lnet.subsystem_debug: want 'mds ost', have '$CHECK_SUBSYS'"
Nathan Rutman's avatar
Nathan Rutman committed
        stop_ost || return $?
wangchao's avatar
wangchao committed
}
Nathan Rutman's avatar
Nathan Rutman committed
run_test 9 "test ptldebug and subsystem for mkfs"
wangchao's avatar
wangchao committed

Yong Fan's avatar
Yong Fan committed
# LOGS/PENDING do not exist anymore since CMD3
Yury Umanets's avatar
Yury Umanets committed
        local TMPMTPT="${TMP}/conf16"
        local dev=${SINGLEMDS}_dev
        local MDSDEV=${!dev}
Elena Gryaznova's avatar
Elena Gryaznova committed
        if [ ! -e "$MDSDEV" ]; then
            log "no $MDSDEV existing, so mount Lustre to create one"
Nathan Rutman's avatar
Nathan Rutman committed
	    setup
            check_mount || return 41
            cleanup || return $?
Nathan Rutman's avatar
Nathan Rutman committed

Elena Gryaznova's avatar
Elena Gryaznova committed
        [ -f "$MDSDEV" ] && LOOPOPT="-o loop"

Yong Fan's avatar
Yong Fan committed
        log "change the mode of $MDSDEV/OBJECTS to 555"
Yury Umanets's avatar
Yury Umanets committed
        do_facet $SINGLEMDS "mkdir -p $TMPMTPT &&
Elena Gryaznova's avatar
Elena Gryaznova committed
                      mount $LOOPOPT -t $FSTYPE $MDSDEV $TMPMTPT &&
Yong Fan's avatar
Yong Fan committed
                      chmod 555 $TMPMTPT/OBJECTS &&
Nathan Rutman's avatar
Nathan Rutman committed
                      umount $TMPMTPT" || return $?

Yong Fan's avatar
Yong Fan committed
        log "mount Lustre to change the mode of OBJECTS, then umount Lustre"
Nathan Rutman's avatar
Nathan Rutman committed
	setup
        check_mount || return 41
        cleanup || return $?
Nathan Rutman's avatar
Nathan Rutman committed

Yong Fan's avatar
Yong Fan committed
        log "read the mode of OBJECTS and check if they has been changed properly"
Yury Umanets's avatar
Yury Umanets committed
        EXPECTEDOBJECTSMODE=`do_facet $SINGLEMDS "debugfs -R 'stat OBJECTS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
Nathan Rutman's avatar
Nathan Rutman committed

        if [ "$EXPECTEDOBJECTSMODE" = "0777" ]; then
Elena Gryaznova's avatar
Elena Gryaznova committed
                log "Success:Lustre change the mode of OBJECTS correctly"
Elena Gryaznova's avatar
Elena Gryaznova committed
                error "Lustre does not change mode of OBJECTS properly"
Yong Fan's avatar
Yong Fan committed
run_test 16 "verify that lustre will correct the mode of OBJECTS"
Robert Read's avatar
Robert Read committed
test_17() {
Yury Umanets's avatar
Yury Umanets committed
        local dev=${SINGLEMDS}_dev
        local MDSDEV=${!dev}

Elena Gryaznova's avatar
Elena Gryaznova committed
        if [ ! -e "$MDSDEV" ]; then
Robert Read's avatar
Robert Read committed
            echo "no $MDSDEV existing, so mount Lustre to create one"
Nathan Rutman's avatar
Nathan Rutman committed
	    setup
Robert Read's avatar
Robert Read committed
            check_mount || return 41
            cleanup || return $?
        fi

        echo "Remove mds config log"
Yury Umanets's avatar
Yury Umanets committed
        do_facet $SINGLEMDS "debugfs -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
Robert Read's avatar
Robert Read committed

        start_ost
Nathan Rutman's avatar
Nathan Rutman committed
	start_mds && return 42
	gen_config
Robert Read's avatar
Robert Read committed
}
Nathan Rutman's avatar
Nathan Rutman committed
run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
Robert Read's avatar
Robert Read committed

test_18() {
Elena Gryaznova's avatar
Elena Gryaznova committed
        [ "$FSTYPE" != "ldiskfs" ] && skip "not needed for FSTYPE=$FSTYPE" && return

Yury Umanets's avatar
Yury Umanets committed
        local dev=${SINGLEMDS}_dev
        local MDSDEV=${!dev}

Elena Gryaznova's avatar
Elena Gryaznova committed
        local MIN=2000000

        local OK=
        # check if current MDSSIZE is large enough
        [ $MDSSIZE -ge $MIN ] && OK=1 && myMDSSIZE=$MDSSIZE && \
                log "use MDSSIZE=$MDSSIZE"

        # check if the global config has a large enough MDSSIZE
        [ -z "$OK" -a ! -z "$STORED_MDSSIZE" ] && [ $STORED_MDSSIZE -ge $MIN ] && \
                OK=1 && myMDSSIZE=$STORED_MDSSIZE && \
                log "use STORED_MDSSIZE=$STORED_MDSSIZE"

        # check if the block device is large enough
        [ -z "$OK" -a -b $MDSDEV ] && \
                [ "$(dd if=$MDSDEV of=/dev/null bs=1k count=1 skip=$MIN 2>&1 |
                     awk '($3 == "in") { print $1 }')" = "1+0" ] && OK=1 && \
                myMDSSIZE=$MIN && log "use device $MDSDEV with MIN=$MIN"

        # check if a loopback device has enough space for fs metadata (5%)
        [ -z "$OK" ] && [ -f $MDSDEV -o ! -e $MDSDEV ] &&
                SPACE=$(df -P $(dirname $MDSDEV) |
                        awk '($1 != "Filesystem") {print $4}') &&
                [ $SPACE -gt $((MIN / 20)) ] && OK=1 && myMDSSIZE=$MIN && \
                        log "use file $MDSDEV with MIN=$MIN"

        [ -z "$OK" ] && skip "$MDSDEV too small for ${MIN}kB MDS" && return


        echo "mount mds with large journal..."
Elena Gryaznova's avatar
Elena Gryaznova committed
        local OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
Elena Gryaznova's avatar
Elena Gryaznova committed

        MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
Nathan Rutman's avatar
Nathan Rutman committed

Elena Gryaznova's avatar
Elena Gryaznova committed
        gen_config
        echo "mount lustre system..."
Nathan Rutman's avatar
Nathan Rutman committed
	setup
        check_mount || return 41
Nathan Rutman's avatar
Nathan Rutman committed

        echo "check journal size..."
Elena Gryaznova's avatar
Elena Gryaznova committed
        local FOUNDSIZE=`do_facet mds "debugfs -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}'`
Elena Gryaznova's avatar
Elena Gryaznova committed
        if [ $FOUNDSIZE -gt $((32 * 1024 * 1024)) ]; then
Elena Gryaznova's avatar
Elena Gryaznova committed
                log "Success: mkfs creates large journals. Size: $((FOUNDSIZE >> 20))M"
Elena Gryaznova's avatar
Elena Gryaznova committed
                error "expected journal size > 32M, found $((FOUNDSIZE >> 20))M"
Nathan Rutman's avatar
Nathan Rutman committed

        cleanup || return $?
Nathan Rutman's avatar
Nathan Rutman committed

Elena Gryaznova's avatar
Elena Gryaznova committed
        MDS_MKFS_OPTS=$OLD_MDS_MKFS_OPTS
        gen_config
}
Elena Gryaznova's avatar
Elena Gryaznova committed
run_test 18 "check mkfs creates large journals"
Robert Read's avatar
Robert Read committed

Nathan Rutman's avatar
Nathan Rutman committed
test_19a() {
	start_mds || return 1
	stop_mds -f || return 2
}
run_test 19a "start/stop MDS without OSTs"

test_19b() {
	start_ost || return 1
	stop_ost -f || return 2
}
run_test 19b "start/stop OSTs without MDS"

test_20() {
	# first format the ost/mdt
	start_ost
	start_mds
	mount_client $MOUNT
	check_mount || return 43
	rm -f $DIR/$tfile
	remount_client ro $MOUNT || return 44
	touch $DIR/$tfile && echo "$DIR/$tfile created incorrectly" && return 45
	[ -e $DIR/$tfile ] && echo "$DIR/$tfile exists incorrectly" && return 46
	remount_client rw $MOUNT || return 47
	touch $DIR/$tfile
	[ ! -f $DIR/$tfile ] && echo "$DIR/$tfile missing" && return 48
	MCNT=`grep -c $MOUNT /etc/mtab`
	[ "$MCNT" -ne 1 ] && echo "$MOUNT in /etc/mtab $MCNT times" && return 49
	umount_client $MOUNT
	stop_mds
	stop_ost
}
run_test 20 "remount ro,rw mounts work and doesn't break /etc/mtab"

test_21a() {
        start_mds
	start_ost
	stop_ost
	stop_mds
}
run_test 21a "start mds before ost, stop ost first"

test_21b() {
        start_ost
	start_mds
	stop_mds
	stop_ost
}
run_test 21b "start ost before mds, stop mds first"

test_21c() {
        start_ost
	start_mds
	start_ost2
	stop_ost
	stop_ost2
	stop_mds
}
run_test 21c "start mds between two osts, stop mds last"

test_22() {
Nathan Rutman's avatar
Nathan Rutman committed
	#reformat to remove all logs
	reformat
Nathan Rutman's avatar
Nathan Rutman committed
	start_mds
	echo Client mount before any osts are in the logs
	mount_client $MOUNT
	check_mount && return 41
	pass

	echo Client mount with ost in logs, but none running
	start_ost
	stop_ost
	mount_client $MOUNT
	# check_mount will block trying to contact ost
	umount_client $MOUNT
	pass

	echo Client mount with a running ost
	start_ost
Eric Mei's avatar
Eric Mei committed
	if $GSS; then
		# if gss enabled, wait full time to let connection from
		# mds to ost be established, due to the mismatch between
		# initial connect timeout and gss context negotiation timeout.
		# This perhaps could be remove after AT landed.
		echo "sleep $((TIMEOUT + TIMEOUT + TIMEOUT))s"
		sleep $((TIMEOUT + TIMEOUT + TIMEOUT))
	fi
Nathan Rutman's avatar
Nathan Rutman committed
	mount_client $MOUNT
	check_mount || return 41
	pass

	cleanup
}
run_test 22 "start a client before osts (should return errs)"

Elena Gryaznova's avatar
Elena Gryaznova committed
test_23a() {	# was test_23
Nathan Rutman's avatar
Nathan Rutman committed
        setup
        # fail mds
Yury Umanets's avatar
Yury Umanets committed
	stop $SINGLEMDS   
Nathan Rutman's avatar
Nathan Rutman committed
	# force down client so that recovering mds waits for reconnect
Elena Gryaznova's avatar
Elena Gryaznova committed
	local running=$(grep -c $MOUNT /proc/mounts) || true
    	if [ $running -ne 0 ]; then
        	echo "Stopping client $MOUNT (opts: -f)"
        	umount -f $MOUNT
    	fi

Nathan Rutman's avatar
Nathan Rutman committed
	# enter recovery on mds
	start_mds
	# try to start a new client
	mount_client $MOUNT &
	sleep 5
Elena Gryaznova's avatar
Elena Gryaznova committed
	MOUNT_PID=$(ps -ef | grep "t lustre" | grep -v grep | awk '{print $2}')
Nathan Rutman's avatar
Nathan Rutman committed
	MOUNT_LUSTRE_PID=`ps -ef | grep mount.lustre | grep -v grep | awk '{print $2}'`
	echo mount pid is ${MOUNT_PID}, mount.lustre pid is ${MOUNT_LUSTRE_PID}
	ps --ppid $MOUNT_PID
	ps --ppid $MOUNT_LUSTRE_PID
	# FIXME why o why can't I kill these? Manual "ctrl-c" works...
Elena Gryaznova's avatar
Elena Gryaznova committed
	kill -TERM $MOUNT_LUSTRE_PID
Nathan Rutman's avatar
Nathan Rutman committed
	echo "waiting for mount to finish"
	ps -ef | grep mount
Elena Gryaznova's avatar
Elena Gryaznova committed
	# we can not wait $MOUNT_PID because it is not a child of this shell
	local PID1
	local PID2
	local WAIT=0
	local MAX_WAIT=20
	local sleep=1
	while [ "$WAIT" -lt "$MAX_WAIT" ]; do
		sleep $sleep
		PID1=$(ps -ef | awk '{print $2}' | grep -w $MOUNT_PID)
		PID2=$(ps -ef | awk '{print $2}' | grep -w $MOUNT_LUSTRE_PID)
		echo PID1=$PID1
		echo PID2=$PID2
		[ -z "$PID1" -a -z "$PID2" ] && break
		echo "waiting for mount to finish ... "
		WAIT=$(( WAIT + sleep))
	done
	[ "$WAIT" -eq "$MAX_WAIT" ] && error "MOUNT_PID $MOUNT_PID and \
		MOUNT__LUSTRE_PID $MOUNT__LUSTRE_PID still not killed in $WAIT secs"
	ps -ef | grep mount
	stop_mds || error
	stop_ost || error
Nathan Rutman's avatar
Nathan Rutman committed
}
Elena Gryaznova's avatar
Elena Gryaznova committed
run_test 23a "interrupt client during recovery mount delay"

Elena Gryaznova's avatar
Elena Gryaznova committed
umount_client $MOUNT
cleanup_nocli

test_23b() {    # was test_23
	start_ost
	start_mds
	# Simulate -EINTR during mount OBD_FAIL_LDLM_CLOSE_THREAD
komaln's avatar
komaln committed
	lctl set_param fail_loc=0x80000313
Elena Gryaznova's avatar
Elena Gryaznova committed
	mount_client $MOUNT
	cleanup
}
run_test 23b "Simulate -EINTR during mount"

Elena Gryaznova's avatar
Elena Gryaznova committed
fs2mds_HOST=$mds_HOST
fs2ost_HOST=$ost_HOST

cleanup_24a() {
	trap 0
	echo "umount $MOUNT2 ..."
	umount $MOUNT2 || true
	echo "stopping fs2mds ..."
	stop fs2mds -f || true
	echo "stopping fs2ost ..."
	stop fs2ost -f || true
}
Nathan Rutman's avatar
Nathan Rutman committed

test_24a() {
Nathan Rutman's avatar
Nathan Rutman committed
	#set up fs1 
	gen_config
	#set up fs2
Elena Gryaznova's avatar
Elena Gryaznova committed
	[ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
	if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
		do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
		skip "mixed loopback and real device not working" && return
	fi
Elena Gryaznova's avatar
Elena Gryaznova committed

	local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
	local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}

Nathan Rutman's avatar
Nathan Rutman committed
	# test 8-char fsname as well
	local FSNAME2=test1234
Elena Gryaznova's avatar
Elena Gryaznova committed
	add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME2} --nomgs --mgsnode=$MGSNID --reformat $fs2mdsdev || exit 10
Nathan Rutman's avatar
Nathan Rutman committed

Nathan Rutman's avatar
Nathan Rutman committed
	add fs2ost $OST_MKFS_OPTS --fsname=${FSNAME2} --reformat $fs2ostdev || exit 10
Nathan Rutman's avatar
Nathan Rutman committed

	setup
Elena Gryaznova's avatar
Elena Gryaznova committed
	start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
Nathan Rutman's avatar
Nathan Rutman committed
	start fs2ost $fs2ostdev $OST_MOUNT_OPTS
	mkdir -p $MOUNT2
Nathan Rutman's avatar
Nathan Rutman committed
	mount -t lustre $MGSNID:/${FSNAME2} $MOUNT2 || return 1
Nathan Rutman's avatar
Nathan Rutman committed
	# 1 still works
	check_mount || return 2
	# files written on 1 should not show up on 2
	cp /etc/passwd $DIR/$tfile
	sleep 10
	[ -e $MOUNT2/$tfile ] && error "File bleed" && return 7
	# 2 should work
	sleep 5
Nathan Rutman's avatar
Nathan Rutman committed
	cp /etc/passwd $MOUNT2/b || return 3
	rm $MOUNT2/b || return 4
	# 2 is actually mounted
        grep $MOUNT2' ' /proc/mounts > /dev/null || return 5
	# failover 
	facet_failover fs2mds
	facet_failover fs2ost
	df
 	umount_client $MOUNT 
	# the MDS must remain up until last MDT
	stop_mds
Yury Umanets's avatar
Yury Umanets committed
	MDS=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }' | head -1)
	[ -z "$MDS" ] && error "No MDT" && return 8
Elena Gryaznova's avatar
Elena Gryaznova committed
	cleanup_24a
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup_nocli || return 6
}
run_test 24a "Multiple MDTs on a single node"

test_24b() {
Elena Gryaznova's avatar
Elena Gryaznova committed
	if [ -z "$fs2mds_DEV" ]; then
		do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
		skip "mixed loopback and real device not working" && return
	fi
Elena Gryaznova's avatar
Elena Gryaznova committed

	local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}

Elena Gryaznova's avatar
Elena Gryaznova committed
	add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME}2 --mgs --reformat $fs2mdsdev || exit 10 
Nathan Rutman's avatar
Nathan Rutman committed
	setup
Elena Gryaznova's avatar
Elena Gryaznova committed
	start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && return 2
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup || return 6
}
run_test 24b "Multiple MGSs on a single node (should return err)"

test_25() {
	setup
	check_mount || return 2
	local MODULES=$($LCTL modules | awk '{ print $2 }')
	rmmod $MODULES 2>/dev/null || true
	cleanup || return 6
}
run_test 25 "Verify modules are referenced"

test_26() {
    load_modules
    # we need modules before mount for sysctl, so make sure...
Yury Umanets's avatar
Yury Umanets committed
    do_facet $SINGLEMDS "lsmod | grep -q lustre || modprobe lustre"
Nathan Rutman's avatar
Nathan Rutman committed
#define OBD_FAIL_MDS_FS_SETUP            0x135
Yury Umanets's avatar
Yury Umanets committed
    do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000135"
Nathan Rutman's avatar
Nathan Rutman committed
    start_mds && echo MDS started && return 1
komaln's avatar
komaln committed
    lctl get_param -n devices
    DEVS=$(lctl get_param -n devices | wc -l)
Nathan Rutman's avatar
Nathan Rutman committed
    [ $DEVS -gt 0 ] && return 2
    unload_modules || return 203
}
run_test 26 "MDT startup failure cleans LOV (should return errs)"

set_and_check() {
Elena Gryaznova's avatar
Elena Gryaznova committed
	local myfacet=$1
	local TEST=$2
	local PARAM=$3
	local ORIG=$(do_facet $myfacet "$TEST") 
	if [ $# -gt 3 ]; then
	    local FINAL=$4
Nathan Rutman's avatar
Nathan Rutman committed
	else
	    local -i FINAL
	    FINAL=$(($ORIG + 5))
	fi
	echo "Setting $PARAM from $ORIG to $FINAL"
Yury Umanets's avatar
Yury Umanets committed
	do_facet $SINGLEMDS "$LCTL conf_param $PARAM=$FINAL" || error conf_param failed
Nathan Rutman's avatar
Nathan Rutman committed
	local RESULT
Nathan Rutman's avatar
Nathan Rutman committed
	local MAX=90
Nathan Rutman's avatar
Nathan Rutman committed
	local WAIT=0
	while [ 1 ]; do
	    sleep 5
Elena Gryaznova's avatar
Elena Gryaznova committed
	    RESULT=$(do_facet $myfacet "$TEST") 
Nathan Rutman's avatar
Nathan Rutman committed
	    if [ $RESULT -eq $FINAL ]; then
		echo "Updated config after $WAIT sec (got $RESULT)"
		break
	    fi
	    WAIT=$((WAIT + 5))
	    if [ $WAIT -eq $MAX ]; then
		echo "Config update not seen: wanted $FINAL got $RESULT"
		return 3
	    fi
	    echo "Waiting $(($MAX - $WAIT)) secs for config update" 
	done
}

test_27a() {
	start_ost || return 1
	start_mds || return 2
	echo "Requeue thread should have started: " 
	ps -e | grep ll_cfg_requeue 
komaln's avatar
komaln committed
	set_and_check ost1 "lctl get_param -n obdfilter.$FSNAME-OST0000.client_cache_seconds" "$FSNAME-OST0000.ost.client_cache_seconds" || return 3
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup_nocli
}
run_test 27a "Reacquire MGS lock if OST started first"

test_27b() {
Yury Umanets's avatar
Yury Umanets committed
	# FIXME. ~grev
Nathan Rutman's avatar
Nathan Rutman committed
        setup
Yury Umanets's avatar
Yury Umanets committed
        local device=$(do_facet $SINGLEMDS "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDT") { print $4 }')

	facet_failover $SINGLEMDS
	set_and_check $SINGLEMDS "lctl get_param -n mdt.$device.identity_acquire_expire" "$device.mdt.identity_acquire_expire" || return 3
	set_and_check client "lctl get_param -n mdc.$device-mdc-*.max_rpcs_in_flight" "$device.mdc.max_rpcs_in_flight" || return 4
Elena Gryaznova's avatar
Elena Gryaznova committed
	check_mount
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup
}
run_test 27b "Reacquire MGS lock after failover"

test_28() {
        setup
komaln's avatar
komaln committed
	TEST="lctl get_param -n llite.$FSNAME-*.max_read_ahead_whole_mb"
Nathan Rutman's avatar
Nathan Rutman committed
	PARAM="$FSNAME.llite.max_read_ahead_whole_mb"
	ORIG=$($TEST)
	FINAL=$(($ORIG + 1))
	set_and_check client "$TEST" "$PARAM" $FINAL || return 3
	FINAL=$(($FINAL + 1))
	set_and_check client "$TEST" "$PARAM" $FINAL || return 4
Nathan Rutman's avatar
Nathan Rutman committed
 	umount_client $MOUNT || return 200
	mount_client $MOUNT
	RESULT=$($TEST)
	if [ $RESULT -ne $FINAL ]; then
	    echo "New config not seen: wanted $FINAL got $RESULT"
	    return 4
	else
	    echo "New config success: got $RESULT"
	fi
Nathan Rutman's avatar
Nathan Rutman committed
	set_and_check client "$TEST" "$PARAM" $ORIG || return 5
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup
}
run_test 28 "permanent parameter setting"

test_29() {
Elena Gryaznova's avatar
Elena Gryaznova committed
	[ "$OSTCOUNT" -lt "2" ] && skip "$OSTCOUNT < 2, skipping" && return
Nathan Rutman's avatar
Nathan Rutman committed
        setup > /dev/null 2>&1
	start_ost2
	sleep 10

	local PARAM="$FSNAME-OST0001.osc.active"
komaln's avatar
komaln committed
        local PROC_ACT="osc.$FSNAME-OST0001-osc-[^M]*.active"
        local PROC_UUID="osc.$FSNAME-OST0001-osc-[^M]*.ost_server_uuid"

        ACTV=$(lctl get_param -n $PROC_ACT)
Nathan Rutman's avatar
Nathan Rutman committed
	DEAC=$((1 - $ACTV))
komaln's avatar
komaln committed
	set_and_check client "lctl get_param -n $PROC_ACT" "$PARAM" $DEAC || return 2
Nathan Rutman's avatar
Nathan Rutman committed
        # also check ost_server_uuid status
komaln's avatar
komaln committed
	RESULT=$(lctl get_param -n $PROC_UUID | grep DEACTIV)
Nathan Rutman's avatar
Nathan Rutman committed
	if [ -z "$RESULT" ]; then
komaln's avatar
komaln committed
	    echo "Live client not deactivated: $(lctl get_param -n $PROC_UUID)"
Nathan Rutman's avatar
Nathan Rutman committed
	    return 3
	else
	    echo "Live client success: got $RESULT"
	fi

	# check MDT too 
komaln's avatar
komaln committed
	local MPROC="osc.$FSNAME-OST0001-osc-[M]*.active"
Elena Gryaznova's avatar
Elena Gryaznova committed
	local MAX=30
	local WAIT=0
	while [ 1 ]; do
	    sleep 5
Yury Umanets's avatar
Yury Umanets committed
	    RESULT=`do_facet $SINGLEMDS " lctl get_param -n $MPROC"`
Elena Gryaznova's avatar
Elena Gryaznova committed
	    [ ${PIPESTATUS[0]} = 0 ] || error "Can't read $MPROC"
	    if [ $RESULT -eq $DEAC ]; then
		echo "MDT deactivated also after $WAIT sec (got $RESULT)"
		break
	    fi
	    WAIT=$((WAIT + 5))
	    if [ $WAIT -eq $MAX ]; then
		echo "MDT not deactivated: wanted $DEAC got $RESULT"
		return 4
	    fi
	    echo "Waiting $(($MAX - $WAIT)) secs for MDT deactivated"
	done
Nathan Rutman's avatar
Nathan Rutman committed

        # test new client starts deactivated
 	umount_client $MOUNT || return 200
	mount_client $MOUNT
komaln's avatar
komaln committed
	RESULT=$(lctl get_param -n $PROC_UUID | grep DEACTIV | grep NEW)
Nathan Rutman's avatar
Nathan Rutman committed
	if [ -z "$RESULT" ]; then
komaln's avatar
komaln committed
	    echo "New client not deactivated from start: $(lctl get_param -n $PROC_UUID)"
Nathan Rutman's avatar
Nathan Rutman committed
	    return 5
	else
	    echo "New client success: got $RESULT"
	fi

	# make sure it reactivates
komaln's avatar
komaln committed
	set_and_check client "lctl get_param -n $PROC_ACT" "$PARAM" $ACTV || return 6
Nathan Rutman's avatar
Nathan Rutman committed

 	umount_client $MOUNT
	stop_ost2
	cleanup_nocli
	#writeconf to remove all ost2 traces for subsequent tests
	writeconf
Elena Gryaznova's avatar
Elena Gryaznova committed
	start_mds
	start_ost
	cleanup
Nathan Rutman's avatar
Nathan Rutman committed
}
run_test 29 "permanently remove an OST"

test_30() {
Elena Gryaznova's avatar
Elena Gryaznova committed
	setup

komaln's avatar
komaln committed
	TEST="lctl get_param -n llite.$FSNAME-*.max_read_ahead_whole_mb"
Nathan Rutman's avatar
Nathan Rutman committed
	ORIG=$($TEST)
	LIST=(1 2 3 4 5 4 3 2 1 2 3 4 5 4 3 2 1 2 3 4 5)
	for i in ${LIST[@]}; do
Elena Gryaznova's avatar
Elena Gryaznova committed
	    set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" $i || return 3
Nathan Rutman's avatar
Nathan Rutman committed
	done
	# make sure client restart still works 
 	umount_client $MOUNT
	mount_client $MOUNT || return 4
	[ "$($TEST)" -ne "$i" ] && return 5   
Elena Gryaznova's avatar
Elena Gryaznova committed
	set_and_check client "$TEST" "$FSNAME.llite.max_read_ahead_whole_mb" $ORIG || return 6
Nathan Rutman's avatar
Nathan Rutman committed
	cleanup
}
run_test 30 "Big config llog"

test_31() { # bug 10734
        # ipaddr must not exist
        mount -t lustre 4.3.2.1@tcp:/lustre $MOUNT || true
	cleanup
}
run_test 31 "Connect to non-existent node (shouldn't crash)"

Nathan Rutman's avatar
Nathan Rutman committed
test_32a() {
Andreas Dilger's avatar
Andreas Dilger committed
	# XXX - make this test verify 1.8 -> 2.0 upgrade is working
	# XXX - make this run on client-only systems with real hardware on
	#       the OST and MDT
	#       there appears to be a lot of assumption here about loopback
	#       devices
	# or maybe this test is just totally useless on a client-only system
Elena Gryaznova's avatar
Elena Gryaznova committed
	[ "$NETTYPE" = "tcp" ] || { skip "NETTYPE != tcp" && return 0; }
Elena Gryaznova's avatar
Elena Gryaznova committed
	[ "$mds_HOST" = "`hostname`" ] || { skip "remote MDS" && return 0; }
	[ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
		{ skip "remote OST" && return 0; }

Andreas Dilger's avatar
Andreas Dilger committed
	[ -z "$TUNEFS" ] && skip "No tunefs" && return
	local DISK1_8=$LUSTRE/tests/disk1_8.tgz
	[ ! -r $DISK1_8 ] && skip "Cannot find $DISK1_8" && return 0

	mkdir -p $TMP/$tdir
	tar xjvf $DISK1_8 -C $TMP/$tdir || \
		{ skip "Cannot untar $DISK1_8" && return 0; }
Elena Gryaznova's avatar
Elena Gryaznova committed

Nathan Rutman's avatar
Nathan Rutman committed
	load_modules
komaln's avatar
komaln committed
	lctl set_param debug=$PTLDEBUG
Nathan Rutman's avatar
Nathan Rutman committed

Elena Gryaznova's avatar
Elena Gryaznova committed
	$TUNEFS $tmpdir/mds || error "tunefs failed"
Nathan Rutman's avatar
Nathan Rutman committed
	# nids are wrong, so client wont work, but server should start
Elena Gryaznova's avatar
Elena Gryaznova committed
	start mds $tmpdir/mds "-o loop,exclude=lustre-OST0000" || return 3
Andreas Dilger's avatar
Andreas Dilger committed
	local UUID=$(lctl get_param -n mdt.lustre-MDT0000.uuid)
Nathan Rutman's avatar
Nathan Rutman committed
	echo MDS uuid $UUID
	[ "$UUID" == "mdsA_UUID" ] || error "UUID is wrong: $UUID" 

Elena Gryaznova's avatar
Elena Gryaznova committed
	$TUNEFS --mgsnode=`hostname` $tmpdir/ost1 || error "tunefs failed"
	start ost1 $tmpdir/ost1 "-o loop" || return 5
	UUID=$(lctl get_param -n obdfilter.lustre-OST0000.uuid)
Nathan Rutman's avatar
Nathan Rutman committed
	echo OST uuid $UUID
	[ "$UUID" == "ost1_UUID" ] || error "UUID is wrong: $UUID" 

	local NID=$($LCTL list_nids | head -1)

	echo "OSC changes should return err:" 
	$LCTL conf_param lustre-OST0000.osc.max_dirty_mb=15 && return 7
	$LCTL conf_param lustre-OST0000.failover.node=$NID && return 8
	echo "ok."
	echo "MDC changes should succeed:" 
	$LCTL conf_param lustre-MDT0000.mdc.max_rpcs_in_flight=9 || return 9
	$LCTL conf_param lustre-MDT0000.failover.node=$NID || return 10
	echo "ok."

	# With a new good MDT failover nid, we should be able to mount a client
	# (but it cant talk to OST)
Andreas Dilger's avatar
Andreas Dilger committed
	local OLDMOUNTOPT=$MOUNTOPT
	MOUNTOPT="exclude=lustre-OST0000"
Nathan Rutman's avatar
Nathan Rutman committed
	mount_client $MOUNT
Nathan Rutman's avatar
Nathan Rutman committed
        MOUNTOPT=$OLDMOUNTOPT
komaln's avatar
komaln committed
	set_and_check client "lctl get_param -n mdc.*.max_rpcs_in_flight" "lustre-MDT0000.mdc.max_rpcs_in_flight" ||
		return 11
Nathan Rutman's avatar
Nathan Rutman committed

	zconf_umount `hostname` $MOUNT -f
	cleanup_nocli
Elena Gryaznova's avatar
Elena Gryaznova committed
	load_modules
Nathan Rutman's avatar
Nathan Rutman committed

        # mount a second time to make sure we didnt leave upgrade flag on
Elena Gryaznova's avatar
Elena Gryaznova committed
	load_modules
	$TUNEFS --dryrun $tmpdir/mds || error "tunefs failed"
	load_modules
	start mds $tmpdir/mds "-o loop,exclude=lustre-OST0000" || return 12
	cleanup_nocli
Elena Gryaznova's avatar
Elena Gryaznova committed
	rm -rf $tmpdir || true	# true is only for TMP on NFS