Newer
Older
#!/bin/bash
# requirement:
# add uml1 uml2 uml3 in your /etc/hosts
# 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.
ONLY=${ONLY:-"$*"}
# These tests don't apply to mountconf
# xml xml xml xml xml xml dumb
MOUNTCONFSKIP="10 11 12 13 13b 14 15 "
# bug number for skipped test: 13369
ALWAYS_EXCEPT=" $CONF_SANITY_EXCEPT $MOUNTCONFSKIP 34a"
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
SRCDIR=`dirname $0`
PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
LUSTRE=${LUSTRE:-`dirname $0`/..}
RLUSTRE=${RLUSTRE:-$LUSTRE}
. $LUSTRE/tests/test-framework.sh
init_test_env $@
# use small MDS + OST size to speed formatting time
MDSSIZE=40000
OSTSIZE=40000
#
[ "$SLOW" = "no" ] && EXCEPT_SLOW="0 1 2 3 6 7 15 18 24b 25 30 31 32 33 34a "
writeconf() {
local facet=mds
shift
stop ${facet} -f
rm -f ${facet}active
# who knows if/where $TUNEFS is installed? Better reformat if it fails...
do_facet ${facet} "$TUNEFS --writeconf $MDSDEV" || echo "tunefs failed, reformatting instead" && reformat
}
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
}
start_mds() {
echo "start mds service on `facet_active_host mds`"
start mds $MDSDEV $MDS_MOUNT_OPTS || return 94
echo "stop mds service on `facet_active_host mds`"
# These tests all use non-failover stop
stop mds -f || return 97
}
start_ost() {
echo "start ost1 service on `facet_active_host ost1`"
start ost1 `ostdevname 1` $OST_MOUNT_OPTS || return 95
}
stop_ost() {
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
start_client() {
echo "start client on `facet_active_host client`"
start client || return 99
}
stop_client() {
echo "stop client on `facet_active_host client`"
stop client || return 100
}
mount_client() {
local MOUNTPATH=$1
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
}
umount_client() {
local MOUNTPATH=$1
echo "umount lustre on ${MOUNTPATH}....."
}
manual_umount_client(){
do_facet client "umount -d ${FORCE} $MOUNT"
rc=$?
return $rc
}
setup() {
start_ost
start_mds
unload_modules || return 203
}
cleanup() {
umount_client $MOUNT || return 200
cleanup_nocli || return $?
}
check_mount() {
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
if [ "$ONLY" == "setup" ]; then
setup
exit
fi
if [ "$ONLY" == "cleanup" ]; then
cleanup
exit
fi
#create single point mountpoint
gen_config
check_mount || return 41
}
run_test 0 "single mount setup"
test_1() {
start_ost
echo "start ost second time..."
check_mount || return 42
run_test 1 "start up ost twice (should return errors)"
test_2() {
start_ost
start_mds
echo "start mds second time.."
check_mount || return 43
#mount.lustre returns an error if already in mtab
mount_client $MOUNT && return $?
check_mount || return 44
test_4() {
setup
touch $DIR/$tfile || return 85
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"
fuser -m -v $MOUNT && echo "$MOUNT is in use by user space process."
# cleanup may return an error from the failed
# disconnects; for now I'll consider this successful
if grep " $MOUNT " /proc/mounts; then
echo "test 5: /proc/mounts after failed umount"
umount $MOUNT &
UMOUNT_PID=$!
sleep 2
echo "killing umount"
kill -TERM $UMOUNT_PID
echo "waiting for umount to finish"
wait $UMOUNT_PID
grep " $MOUNT " /proc/mounts && echo "test 5: /proc/mounts after second umount" && return 11
cleanup_nocli || return $?
# df may have lingering entry
manual_umount_client
# mtab may have lingering entry
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"
test_5b() {
start_ost
[ -d $MOUNT ] || mkdir -p $MOUNT
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
umount_client $MOUNT
run_test 5b "mds down, cleanup after failed mount (bug 2712) (should return errs)"
test_5c() {
start_ost
start_mds
[ -d $MOUNT ] || mkdir -p $MOUNT
grep " $MOUNT " /etc/mtab && echo "test 5c: mtab before mount" && return 10
local oldfs="${FSNAME}"
FSNAME="wrong.${FSNAME}"
mount_client $MOUNT || :
FSNAME=${oldfs}
grep " $MOUNT " /etc/mtab && echo "test 5c: mtab after failed mount" && return 11
umount_client $MOUNT
cleanup_nocli || return $?
run_test 5c "cleanup after failed mount (bug 2712) (should return errs)"
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"
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
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
}
run_test 6 "manual umount, then mount again"
test_7() {
setup
manual_umount_client
}
run_test 7 "manual umount, then cleanup"
test_8() {
check_mount2 || return 45
}
run_test 8 "double mount setup"
do_facet ost1 lctl set_param debug=\'inode trace\' || return 1
do_facet ost1 lctl set_param subsystem_debug=\'mds ost\' || return 1
if [ "$CHECK_PTLDEBUG" ] && [ "$CHECK_PTLDEBUG" = "trace inode" ];then
echo "lnet.debug success"
else
echo "lnet.debug: want 'trace inode', have '$CHECK_PTLDEBUG'"
return 1
fi
if [ "$CHECK_SUBSYS" ] && [ "$CHECK_SUBSYS" = "mds ost" ]; then
echo "lnet.subsystem_debug success"
else
echo "lnet.subsystem_debug: want 'mds ost', have '$CHECK_SUBSYS'"
return 1
fi
OLDXMLCONFIG=$XMLCONFIG
XMLCONFIG="broken.xml"
[ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
rm -f ${facet}active
add_facet $facet
echo "the name for node and mds is the same"
do_lmc --add mds --node ${facet}_facet --mds ${facet}_facet \
--dev $MDSDEV --size $MDSSIZE || return $?
do_lmc --add lov --mds ${facet}_facet --lov lov1 --stripe_sz \
$STRIPE_BYTES --stripe_cnt $STRIPES_PER_OBJ \
--stripe_pattern 0 || return $?
add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE
facet="client"
add_facet $facet --lustre_upcall $UPCALL
do_lmc --add mtpt --node ${facet}_facet --mds mds_facet \
--lov lov1 --path $MOUNT
echo "mount lustre"
start_ost
start_mds
mount_client $MOUNT
check_mount || return 41
cleanup || return $?
test_11() {
OLDXMLCONFIG=$XMLCONFIG
XMLCONFIG="conf11.xml"
[ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
add_client client mds --path $MOUNT --ost ost_svc || return $?
echo "--add mtpt with neither --lov nor --ost will return error"
echo ""
echo "Success!"
XMLCONFIG=$OLDXMLCONFIG
}
run_test 11 "use default lov configuration (should return error)"
test_12() {
OLDXMLCONFIG=$XMLCONFIG
XMLCONFIG="batch.xml"
BATCHFILE="batchfile"
# test double quote
[ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
[ -f "$BATCHFILE" ] && rm -f $BATCHFILE
echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE
# --mkfsoptions "-I 128"
do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
echo "matched double quote success"
else
echo "matched double quote fail"
return 1
echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128" >> $BATCHFILE
# --mkfsoptions "-I 128
do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
echo "unmatched double quote should return error"
# test single quote
rm -f $BATCHFILE
echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE
# --mkfsoptions '-I 128'
do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
echo "matched single quote success"
else
echo "matched single quote fail"
return 1
fi
rm -f $XMLCONFIG
rm -f $BATCHFILE
echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128" >> $BATCHFILE
# --mkfsoptions '-I 128
do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
echo "unmatched single quote should return error"
# test backslash
rm -f $BATCHFILE
echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE
# --mkfsoptions \-\I\ \128
do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
echo "backslash followed by a whitespace/letter success"
else
echo "backslash followed by a whitespace/letter fail"
return 1
fi
rm -f $XMLCONFIG
rm -f $BATCHFILE
echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions -I\ 128\\" >> $BATCHFILE
# --mkfsoptions -I\ 128\
do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
echo "backslash followed by nothing should return error"
rm -f $BATCHFILE
XMLCONFIG=$OLDXMLCONFIG
}
run_test 12 "lmc --batch, with single/double quote, backslash in batchfile"
OLDXMLCONFIG=$XMLCONFIG
XMLCONFIG="conf13-1.xml"
# check long uuid will be truncated properly and uniquely
echo "To generate XML configuration file(with long ost name): $XMLCONFIG"
[ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
do_lmc --add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp
do_lmc --add mds --node $HOSTNAME --mds mds1_name_longer_than_31characters
do_lmc --add mds --node $HOSTNAME --mds mds2_name_longer_than_31characters
if [ ! -f "$XMLCONFIG" ]; then
echo "Error:no file $XMLCONFIG created!"
return 1
fi
EXPECTEDMDS1UUID="e_longer_than_31characters_UUID"
EXPECTEDMDS2UUID="longer_than_31characters_UUID_2"
FOUNDMDS1UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '1p' \
| sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
FOUNDMDS2UUID=`awk -F"'" '/<mds .*uuid=/' $XMLCONFIG | sed -n '2p' \
| sed "s/ /\n\r/g" | awk -F"'" '/uuid=/{print $2}'`
[ -z "$FOUNDMDS1UUID" ] && echo "MDS1 UUID empty" && return 1
[ -z "$FOUNDMDS2UUID" ] && echo "MDS2 UUID empty" && return 1
if ([ $EXPECTEDMDS1UUID = $FOUNDMDS1UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS2UUID ]) || \
([ $EXPECTEDMDS1UUID = $FOUNDMDS2UUID ] && [ $EXPECTEDMDS2UUID = $FOUNDMDS1UUID ]); then
echo "Success:long uuid truncated successfully and being unique."
else
echo "Error:expected uuid for mds1 and mds2: $EXPECTEDMDS1UUID; $EXPECTEDMDS2UUID"
echo "but: found uuid for mds1 and mds2: $FOUNDMDS1UUID; $FOUNDMDS2UUID"
test_13b() {
OLDXMLCONFIG=$XMLCONFIG
XMLCONFIG="conf13-1.xml"
SECONDXMLCONFIG="conf13-2.xml"
# check multiple invocations for lmc generate same XML configuration file
rm -f $XMLCONFIG
echo "Generate the first XML configuration file"
gen_config
echo "mv $XMLCONFIG to $SECONDXMLCONFIG"
sed -e "s/mtime[^ ]*//" $XMLCONFIG > $SECONDXMLCONFIG || return $?
# don't compare .xml mtime, it will always be different
if [ `sed -e "s/mtime[^ ]*//" $XMLCONFIG | diff - $SECONDXMLCONFIG | wc -l` -eq 0 ]; then
echo "Success:multiple invocations for lmc generate same XML file"
else
echo "Error: multiple invocations for lmc generate different XML file"
return 1
fi
run_test 13b "check lmc generates consistent .xml file"
test_14() {
rm -f $XMLCONFIG
# create xml file with --mkfsoptions for ost
echo "create xml file with --mkfsoptions for ost"
add_mds mds --dev $MDSDEV --size $MDSSIZE
add_lov lov1 mds --stripe_sz $STRIPE_BYTES\
--stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0
add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE \
EXPECTEDSTRING="mkfsoptions>-Llabel_conf_14"
echo "Error: expected: $EXPECTEDSTRING; found: $FOUNDSTRING"
return 1
fi
echo "Success:mkfsoptions for ost written to xml file correctly."
# mount lustre to test lconf mkfsoptions-parsing
echo "mount lustre"
start_ost
start_mds
mount_client $MOUNT || return $?
if [ -z "`do_facet ost1 dumpe2fs -h $OSTDEV | grep label_conf_14`" ]; then
echo "Error: the mkoptions not applied to mke2fs of ost."
return 1
fi
echo "lconf mkfsoptions for ost success"
gen_config
}
run_test 14 "test mkfsoptions of ost for lmc and lconf"
cleanup_15() {
trap 0
[ -f $MOUNTLUSTRE ] && echo "remove $MOUNTLUSTRE" && rm -f $MOUNTLUSTRE
if [ -f $MOUNTLUSTRE.sav ]; then
echo "return original $MOUNTLUSTRE.sav to $MOUNTLUSTRE"
mv $MOUNTLUSTRE.sav $MOUNTLUSTRE
fi
}
# this only tests the kernel mount command, not anything about lustre.
echo "mount lustre on ${MOUNT} without $MOUNTLUSTRE....."
if [ -f "$MOUNTLUSTRE" ]; then
echo "save $MOUNTLUSTRE to $MOUNTLUSTRE.sav"
mv $MOUNTLUSTRE $MOUNTLUSTRE.sav && trap cleanup_15 EXIT INT
if [ -f $MOUNTLUSTRE ]; then
mount_client $MOUNT && error "mount succeeded" && return 1
echo "mount lustre on $MOUNT without $MOUNTLUSTRE failed as expected"
cleanup_15
}
run_test 15 "zconf-mount without /sbin/mount.lustre (should return error)"
test_16() {
if [ ! -e "$MDSDEV" ]; then
log "no $MDSDEV existing, so mount Lustre to create one"
setup
check_mount || return 41
cleanup || return $?
[ -f "$MDSDEV" ] && LOOPOPT="-o loop"
log "change the mode of $MDSDEV/OBJECTS,LOGS,PENDING to 555"
chmod 555 $TMPMTPT/{OBJECTS,LOGS,PENDING} &&
umount $TMPMTPT" || return $?
log "mount Lustre to change the mode of OBJECTS/LOGS/PENDING, then umount Lustre"
check_mount || return 41
cleanup || return $?
log "read the mode of OBJECTS/LOGS/PENDING and check if they has been changed properly"
EXPECTEDOBJECTSMODE=`do_facet mds "debugfs -R 'stat OBJECTS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
EXPECTEDLOGSMODE=`do_facet mds "debugfs -R 'stat LOGS' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
EXPECTEDPENDINGMODE=`do_facet mds "debugfs -R 'stat PENDING' $MDSDEV 2> /dev/null" | grep 'Mode: ' | sed -e "s/.*Mode: *//" -e "s/ *Flags:.*//"`
if [ "$EXPECTEDOBJECTSMODE" = "0777" ]; then
fi
}
run_test 16 "verify that lustre will correct the mode of OBJECTS/LOGS/PENDING"
check_mount || return 41
cleanup || return $?
fi
echo "Remove mds config log"
do_facet mds "debugfs -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
test_18() {
[ -f $MDSDEV ] && echo "remove $MDSDEV" && rm -f $MDSDEV
echo "mount mds with large journal..."
local myMDSSIZE=2000000
OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
FOUNDSIZE=`do_facet mds "debugfs -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}'`
if [ $FOUNDSIZE -gt $((32 * 1024 * 1024)) ]; then
log "Success: mkfs creates large journals. Size: $((FOUNDSIZE >> 20))M"
error "expected journal size > 32M, found $((FOUNDSIZE >> 20))M"
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
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() {
#reformat to remove all logs
reformat
start_mds
echo Client mount with ost in logs, but none running
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
mount_client $MOUNT
check_mount || return 41
pass
cleanup
}
run_test 22 "start a client before osts (should return errs)"
setup
# fail mds
stop mds
# force down client so that recovering mds waits for reconnect
local running=$(grep -c $MOUNT /proc/mounts) || true
if [ $running -ne 0 ]; then
echo "Stopping client $MOUNT (opts: -f)"
umount -f $MOUNT
fi
# enter recovery on mds
start_mds
# try to start a new client
mount_client $MOUNT &
sleep 5
MOUNT_PID=$(ps -ef | grep "t lustre" | grep -v grep | awk '{print $2}')
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...
echo "waiting for mount to finish"
ps -ef | grep mount
# 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
run_test 23a "interrupt client during recovery mount delay"
umount_client $MOUNT
cleanup_nocli
test_23b() { # was test_23
start_ost
start_mds
# Simulate -EINTR during mount OBD_FAIL_LDLM_CLOSE_THREAD
mount_client $MOUNT
cleanup
}
run_test 23b "Simulate -EINTR during mount"
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
}
[ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
do_facet mds [ -b "$MDSDEV" ] && \
skip "mixed loopback and real device not working" && return
fi
local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME2} --nomgs --mgsnode=$MGSNID --reformat $fs2mdsdev || exit 10
add fs2ost $OST_MKFS_OPTS --fsname=${FSNAME2} --reformat $fs2ostdev || exit 10
start fs2mds $fs2mdsdev $MDS_MOUNT_OPTS && trap cleanup_24a EXIT INT
start fs2ost $fs2ostdev $OST_MOUNT_OPTS
mkdir -p $MOUNT2
# 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
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
MDS=$(do_facet mds "lctl get_param -n devices" | awk '($3 ~ "mdt" && $4 ~ "MDS") { print $4 }')
cleanup_nocli || return 6
}
run_test 24a "Multiple MDTs on a single node"
test_24b() {
if [ -z "$fs2mds_DEV" ]; then
do_facet mds [ -b "$MDSDEV" ] && \
skip "mixed loopback and real device not working" && return
fi
add fs2mds $MDS_MKFS_OPTS --fsname=${FSNAME}2 --mgs --reformat $fs2mdsdev || exit 10
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...
lctl get_param -n devices
DEVS=$(lctl get_param -n devices | wc -l)
[ $DEVS -gt 0 ] && return 2
unload_modules || return 203
}
run_test 26 "MDT startup failure cleans LOV (should return errs)"
set_and_check() {
local myfacet=$1
local TEST=$2
local PARAM=$3
local ORIG=$(do_facet $myfacet "$TEST")
if [ $# -gt 3 ]; then
local FINAL=$4
else
local -i FINAL
FINAL=$(($ORIG + 5))
fi
echo "Setting $PARAM from $ORIG to $FINAL"
do_facet mds "$LCTL conf_param $PARAM=$FINAL" || error conf_param failed
if [ $RESULT -eq $FINAL ]; then
echo "Updated config after $WAIT sec (got $RESULT)"