X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fconf-sanity.sh;h=ffd5b3033999062d3510fa6993fa75341989de0a;hb=2f8c65486df47bfe38068345603172d90c0861e6;hp=4eaeacdeb6d1209e2baada77c8cf3958a252a777;hpb=9570cac99cb852d8c0ba0694e8b4d33e32539775;p=fs%2Flustre-release.git diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index 4eaeacde..ffd5b30 100644 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -2,6 +2,11 @@ # 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. + set -e SRCDIR=`dirname $0` @@ -9,6 +14,7 @@ PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH LUSTRE=${LUSTRE:-`dirname $0`/..} RLUSTRE=${RLUSTRE:-$LUSTRE} +MOUNTLUSTRE=${MOUNTLUSTRE:-/sbin/mount.lustre} . $LUSTRE/tests/test-framework.sh @@ -16,16 +22,14 @@ init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/local.sh} -FORCE=${FORCE:-" --force"} - gen_config() { rm -f $XMLCONFIG - add_mds mds --dev $MDSDEV --size $MDSSIZE - add_lov lov1 mds --stripe_sz $STRIPE_BYTES\ + add_mds mds1 --dev $MDSDEV --size $MDSSIZE + add_lov lov1 mds1 --stripe_sz $STRIPE_BYTES\ --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0 add_ost ost --lov lov1 --dev $OSTDEV --size $OSTSIZE - add_client client mds --lov lov1 --path $MOUNT + add_client client mds1 --lov lov1 --path $MOUNT } gen_second_config() { @@ -35,38 +39,39 @@ gen_second_config() { add_lov lov2 mds2 --stripe_sz $STRIPE_BYTES\ --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0 add_ost ost2 --lov lov2 --dev $OSTDEV --size $OSTSIZE - add_client client mds2 --lov lov2 --path $MOUNT2 + add_client client --mds mds2 --lov lov2 --path $MOUNT2 } start_mds() { - echo "start mds service on `facet_active_host mds`" - start mds --reformat $MDSLCONFARGS > /dev/null || return 94 + echo "start mds1 service on `facet_active_host mds1`" + start mds1 --reformat $MDSLCONFARGS || return 94 } + stop_mds() { - echo "stop mds service on `facet_active_host mds`" - stop mds $@ > /dev/null || return 97 + echo "stop mds1 service on `facet_active_host mds1`" + stop mds1 $@ || return 97 } start_ost() { echo "start ost service on `facet_active_host ost`" - start ost --reformat $OSTLCONFARGS > /dev/null || return 95 + start ost --reformat $OSTLCONFARGS || return 95 } stop_ost() { echo "stop ost service on `facet_active_host ost`" - stop ost $@ > /dev/null || return 98 + stop ost $@ || return 98 } mount_client() { local MOUNTPATH=$1 echo "mount lustre on ${MOUNTPATH}....." - zconf_mount $MOUNTPATH > /dev/null || return 96 + zconf_mount `hostname` $MOUNTPATH || return 96 } umount_client() { local MOUNTPATH=$1 echo "umount lustre on ${MOUNTPATH}....." - zconf_umount $MOUNTPATH > /dev/null || return 97 + zconf_umount `hostname` $MOUNTPATH || return 97 } manual_umount_client(){ @@ -77,13 +82,19 @@ manual_umount_client(){ setup() { start_ost start_mds - mount_client $MOUNT + mount_client $MOUNT } cleanup() { - umount_client $MOUNT || return -200 - stop_mds || return -201 - stop_ost || return -202 + umount_client $MOUNT || return 200 + stop_mds || return 201 + stop_ost || return 202 + # catch case where these return just fine, but modules are still not unloaded + /sbin/lsmod | grep -q portals + if [ 1 -ne $? ]; then + echo "modules still loaded..." + return 203 + fi } check_mount() { @@ -105,25 +116,27 @@ build_test_filter #create single point mountpoint gen_config - +start_krb5_kdc || exit 1 +start_lsvcgssd || return 2 +start_lgssd || return 3 test_0() { start_ost start_mds - mount_client $MOUNT + mount_client $MOUNT check_mount || return 41 - cleanup + cleanup || return $? } run_test 0 "single mount setup" test_1() { start_ost echo "start ost second time..." - start ost --reformat $OSTLCONFARGS > /dev/null + start ost --reformat $OSTLCONFARGS start_mds mount_client $MOUNT check_mount || return 42 - cleanup + cleanup || return $? } run_test 1 "start up ost twice" @@ -131,68 +144,158 @@ test_2() { start_ost start_mds echo "start mds second time.." - start mds --reformat $MDSLCONFARGS > /dev/null + start mds1 --reformat $MDSLCONFARGS - mount_client $MOUNT + mount_client $MOUNT check_mount || return 43 - cleanup + cleanup || return $? } run_test 2 "start up mds twice" test_3() { - setup + setup mount_client $MOUNT check_mount || return 44 umount_client $MOUNT - cleanup + cleanup || return $? } run_test 3 "mount client twice" test_4() { setup touch $DIR/$tfile || return 85 - stop_ost ${FORCE} - - # cleanup may return an error from the failed - # disconnects; for now I'll consider this successful - # if all the modules have unloaded. - if ! cleanup ; then - lsmod | grep -q portals && return 1 - fi + stop_ost --force + cleanup + 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" test_5() { setup - touch $DIR/$tfile || return 86 - stop_mds ${FORCE} || return 98 + touch $DIR/$tfile || return 1 + stop_mds --force || return 2 - # cleanup may return an error from the failed - # disconnects; for now I'll consider this successful + # cleanup may return an error from the failed + # disconnects; for now I'll consider this successful # if all the modules have unloaded. - if ! cleanup ; then - lsmod | grep -q portals && return 1 - fi + + # as MDS is down, umount without -f may cause blocking + # and this test will never finish. Blocking is possible + # as umount may want to cancel locks with RPC's and these + # RPC's will wait forever, as pinger thread will try to + # recover failed import endlessly. + # + # Thus, main point is: nobody should expect umount finish + # quickly and cleanly without -f flag when MDS or OST is + # down for sure. --umka + umount -f $MOUNT & + UMOUNT_PID=$! + sleep 2 + echo "killing umount" + kill -TERM $UMOUNT_PID + echo "waiting for umount to finish" + wait $UMOUNT_PID + + # cleanup client modules + $LCONF --force --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null + + # stop_mds is a no-op here, and should not fail + stop_mds || return 4 + + # this should have --force flag specified, as umount -f + # will skip disconnect phase and thus OST will have one + # extra refcount what will cause class_cleanup() failure + # if --force is not specified. --umka + stop_ost --force || return 5 + + lsmod | grep -q portals && return 6 + return 0 +} +run_test 5 "force cleanup mds, then cleanup --force" + +test_5b() { + start_ost + start_mds + stop_mds + + [ -d $MOUNT ] || mkdir -p $MOUNT + $LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null + llmount -o nettype=$NETTYPE $mds_HOST://mds_svc/client_facet $MOUNT && exit 2 + + # cleanup client modules + $LCONF --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null + + # stop_mds is a no-op here, and should not fail + stop_mds || return 3 + stop_ost || return 4 + + lsmod | grep -q portals && return 5 return 0 + } -run_test 5 "force cleanup mds, then cleanup" +run_test 5b "mds down, cleanup after failed mount (bug 2712)" + +test_5c() { + start_ost + start_mds + + [ -d $MOUNT ] || mkdir -p $MOUNT + $LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null + llmount -o nettype=$NETTYPE $mds_HOST://wrong_mds_svc/client_facet $MOUNT && return 2 + + # cleanup client modules + $LCONF --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null + + stop_mds || return 3 + stop_ost || return 4 + + lsmod | grep -q portals && return 5 + return 0 + +} +run_test 5c "cleanup after failed mount (bug 2712)" + +test_5d() { + start_ost + start_mds + stop_ost --force + + [ -d $MOUNT ] || mkdir -p $MOUNT + $LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null + llmount -o nettype=$NETTYPE $mds_HOST://mds1_svc/client_facet $MOUNT || return 1 + + umount $MOUNT || return 2 + # cleanup client modules + $LCONF --cleanup --nosetup --node client_facet $XMLCONFIG > /dev/null + + stop_mds || return 3 + + lsmod | grep -q portals && return 4 + return 0 + +} +run_test 5d "ost down, don't crash during mount attempt" test_6() { setup manual_umount_client mount_client ${MOUNT} || return 87 touch $DIR/a || return 86 - cleanup + cleanup || return $? } run_test 6 "manual umount, then mount again" test_7() { setup manual_umount_client - cleanup + cleanup || return $? } run_test 7 "manual umount, then cleanup" @@ -200,12 +303,12 @@ test_8() { start_ost start_mds - mount_client $MOUNT - mount_client $MOUNT2 + mount_client $MOUNT + mount_client $MOUNT2 check_mount2 || return 45 umount $MOUNT - umount_client $MOUNT2 + umount_client $MOUNT2 stop_mds stop_ost @@ -216,7 +319,7 @@ test_9() { # backup the old values of PTLDEBUG and SUBSYSTEM OLDPTLDEBUG=$PTLDEBUG OLDSUBSYSTEM=$SUBSYSTEM - + # generate new configuration file with lmc --ptldebug and --subsystem PTLDEBUG="trace" SUBSYSTEM="mdc" @@ -226,34 +329,449 @@ test_9() { start_ost start_mds mount_client $MOUNT - [ "`cat /proc/sys/portals/debug`" = "1" ] && \ - echo "lmc --debug success" || return 1 - [ "`cat /proc/sys/portals/subsystem_debug`" = "16777216" ] && \ - echo "lmc --subsystem success" || return 1 + CHECK_PTLDEBUG="`cat /proc/sys/portals/debug`" + if [ $CHECK_PTLDEBUG = "1" ]; then + echo "lmc --debug success" + else + echo "lmc --debug: want 1, have $CHECK_PTLDEBUG" + return 1 + fi + CHECK_SUBSYSTEM="`cat /proc/sys/portals/subsystem_debug`" + if [ $CHECK_SUBSYSTEM = "2" ]; then + echo "lmc --subsystem success" + else + echo "lmc --subsystem: want 2, have $CHECK_SUBSYSTEM" + return 1 + fi check_mount || return 41 - cleanup + cleanup || return $? # the new PTLDEBUG/SUBSYSTEM used for lconf --ptldebug/subsystem - PTLDEBUG="inode" - SUBSYSTEM="mds" + PTLDEBUG="inode+trace" + SUBSYSTEM="mds+ost" # check lconf --ptldebug/subsystem overriding lmc --ptldebug/subsystem start_ost start_mds + CHECK_PTLDEBUG="`do_facet mds1 sysctl portals.debug | cut -d= -f2`" + if [ $CHECK_PTLDEBUG = "3" ]; then + echo "lconf --debug success" + else + echo "lconf --debug: want 3, have $CHECK_PTLDEBUG" + return 1 + fi + CHECK_SUBSYS="`do_facet mds1 sysctl portals.subsystem_debug|cut -d= -f2`" + if [ $CHECK_SUBSYS = "20" ]; then + echo "lconf --subsystem success" + else + echo "lconf --subsystem: want 20, have $CHECK_SUBSYS" + return 1 + fi mount_client $MOUNT - [ "`cat /proc/sys/portals/debug`" = "2" ] && \ - echo "lconf --debug overriding success" || return 1 - [ "`cat /proc/sys/portals/subsystem_debug`" = "33554432" ] && \ - echo "lconf --subsystem overriding success" || return 1 check_mount || return 41 - cleanup + cleanup || return $? # resume the old configuration PTLDEBUG=$OLDPTLDEBUG SUBSYSTEM=$OLDSUBSYSTEM gen_config } -run_test 9 "test --ptldebug and --subsystem for lmc" +run_test 9 "test --ptldebug and --subsystem for lmc and lconf" + +test_10() { + echo "generate configuration with the same name for node and mds" + OLDXMLCONFIG=$XMLCONFIG + XMLCONFIG="broken.xml" + [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG + facet="mds1" + 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 mds1_facet \ + --lov lov1 --path $MOUNT + + echo "mount lustre" + start_ost + start_mds + mount_client $MOUNT + check_mount || return 41 + cleanup || return $? + + echo "Success!" + XMLCONFIG=$OLDXMLCONFIG +} +run_test 10 "mount lustre with the same name for node and mds" + +test_11() { + OLDXMLCONFIG=$XMLCONFIG + XMLCONFIG="conf11.xml" + + [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG + add_mds mds1 --dev $MDSDEV --size $MDSSIZE + add_ost ost --dev $OSTDEV --size $OSTSIZE + add_client client mds1 --path $MOUNT --ost ost_svc || return $? + echo "Default lov config success!" + + [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG + add_mds mds1 --dev $MDSDEV --size $MDSSIZE + add_ost ost --dev $OSTDEV --size $OSTSIZE + add_client client mds1 --path $MOUNT && 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 localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE + echo "--add mds --node localhost --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE + # --mkfsoptions "-I 128" + do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $? + if [ `sed -n '/>-I 128
$BATCHFILE + echo "--add mds --node localhost --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 localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE + echo "--add mds --node localhost --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE + # --mkfsoptions '-I 128' + do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $? + if [ `sed -n '/>-I 128 $BATCHFILE + echo "--add mds --node localhost --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 localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE + echo "--add mds --node localhost --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE + # --mkfsoptions \-\I\ \128 + do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $? + if [ `sed -n '/>-I 128 $BATCHFILE + echo "--add mds --node localhost --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" + +test_13() { + OLDXMLCONFIG=$XMLCONFIG + XMLCONFIG="conf13-1.xml" + SECONDXMLCONFIG="conf13-2.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 localhost --nid localhost.localdomain --nettype tcp + do_lmc --add mds --node localhost --mds mds1_name_longer_than_31characters + do_lmc --add mds --node localhost --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"'" '/