Whamcloud - gitweb
LU-246 Add a barrier for recovery completion for conf-sanity
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index 1879ee9..11cf00f 100644 (file)
@@ -39,6 +39,11 @@ MDSSIZE=200000
 OSTSIZE=200000
 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
 
+if ! combined_mgs_mds; then
+    # bug number for skipped test:    23954
+    ALWAYS_EXCEPT="$ALWAYS_EXCEPT       24b"
+fi
+
 # STORED_MDSSIZE is used in test_18
 if [ -n "$MDSSIZE" ]; then
     STORED_MDSSIZE=$MDSSIZE
@@ -125,6 +130,12 @@ stop_mds() {
        stop $SINGLEMDS -f  || return 97
 }
 
+stop_mgs() {
+       echo "stop mgs service on `facet_active_host mgs`"
+       # These tests all use non-failover stop
+       stop mgs -f  || return 97
+}
+
 start_ost() {
        echo "start ost1 service on `facet_active_host ost1`"
        start ost1 `ostdevname 1` $OST_MOUNT_OPTS $@ || return 95
@@ -154,12 +165,10 @@ mount_client() {
 }
 
 remount_client() {
-       local SAVEMOUNTOPT=$MOUNTOPT
-       MOUNTOPT="remount,$1"
+       local mountopt="-o remount,$1"
        local MOUNTPATH=$2
        echo "remount '$1' lustre on ${MOUNTPATH}....."
-       zconf_mount `hostname`  $MOUNTPATH  || return 96
-       MOUNTOPT=$SAVEMOUNTOPT
+       zconf_mount `hostname`  $MOUNTPATH "$mountopt"  || return 96
 }
 
 umount_client() {
@@ -181,6 +190,7 @@ setup() {
        start_mds || error "MDT start failed"
        start_ost || error "OST start failed"
        mount_client $MOUNT || error "client start failed"
+       client_up || error "client_up failed"
 }
 
 setup_noconfig() {
@@ -523,6 +533,21 @@ test_9() {
 }
 run_test 9 "test ptldebug and subsystem for mkfs"
 
+is_blkdev () {
+        local facet=$1
+        local dev=$2
+        local size=${3:-""}
+
+        local rc=0
+        do_facet $facet "test -b $dev" || rc=1
+        if [[ "$size" ]]; then
+                local in=$(do_facet $facet "dd if=$dev of=/dev/null bs=1k count=1 skip=$size 2>&1" |\
+                        awk '($3 == "in") { print $1 }')
+                [[ $in  = "1+0" ]] || rc=1
+        fi
+        return $rc
+}
+
 #
 # Test 16 was to "verify that lustre will correct the mode of OBJECTS".
 # But with new MDS stack we don't care about the mode of local objects
@@ -530,21 +555,24 @@ run_test 9 "test ptldebug and subsystem for mkfs"
 #
 
 test_17() {
-        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
+        setup
+        check_mount || return 41
+        cleanup || return $?
 
-        if [ ! -e "$MDSDEV" ]; then
-            echo "no $MDSDEV existing, so mount Lustre to create one"
-           setup
-            check_mount || return 41
-            cleanup || return $?
+        echo "Remove mds config log"
+        if ! combined_mgs_mds ; then
+                stop mgs
         fi
 
-        echo "Remove mds config log"
-        do_facet $SINGLEMDS "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MDSDEV || return \$?" || return $?
+        do_facet mgs "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MGSDEV || return \$?" || return $?
+
+        if ! combined_mgs_mds ; then
+                start_mgs
+        fi
 
         start_ost
-       start_mds && return 42
-       reformat_and_config
+        start_mds && return 42
+        reformat_and_config
 }
 run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
 
@@ -566,17 +594,18 @@ test_18() {
                 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 && \
+        [ -z "$OK" ] && $(is_blkdev $SINGLEMDS $MDSDEV $MIN) && 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 && \
+
+        if [ -z "$OK" ]; then
+                local SPACE=$(do_facet $SINGLEMDS "[ -f $MDSDEV -o ! -e $MDSDEV ] && df -P \\\$(dirname $MDSDEV)" |
+                        awk '($1 != "Filesystem") {print $4}')
+                ! [ -z "$SPACE" ]  &&  [ $SPACE -gt $((MIN / 20)) ] && \
+                        OK=1 && myMDSSIZE=$MIN && \
                         log "use file $MDSDEV with MIN=$MIN"
+        fi
 
         [ -z "$OK" ] && skip_env "$MDSDEV too small for ${MIN}kB MDS" && return
 
@@ -584,15 +613,21 @@ test_18() {
         echo "mount mds with large journal..."
         local OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS
 
-        MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
+        local opts="--mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT"
+
+        if combined_mgs_mds ; then
+            MDS_MKFS_OPTS="--mgs $opts"
+        else
+            MDS_MKFS_OPTS="--mgsnode=$MGSNID $opts"
+        fi
 
         reformat_and_config
         echo "mount lustre system..."
-       setup
+        setup
         check_mount || return 41
 
         echo "check journal size..."
-        local FOUNDSIZE=`do_facet $SINGLEMDS "$DEBUGFS -c -R 'stat <8>' $MDSDEV" | awk '/Size: / { print $NF; exit;}'`
+        local FOUNDSIZE=$(do_facet $SINGLEMDS "$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"
         else
@@ -670,6 +705,29 @@ test_21c() {
 }
 run_test 21c "start mds between two osts, stop mds last"
 
+test_21d() {
+        if combined_mgs_mds ; then
+                skip "need separate mgs device" && return 0
+        fi
+        stopall
+
+        reformat
+
+        start_mgs
+        start_ost
+        start_ost2
+        start_mds
+        wait_osc_import_state mds ost2 FULL
+
+        stop_ost
+        stop_ost2
+        stop_mds
+        stop_mgs
+        #writeconf to remove all ost2 traces for subsequent tests
+        writeconf
+}
+run_test 21d "start mgs then ost and then mds"
+
 test_22() {
        start_mds
 
@@ -781,18 +839,15 @@ cleanup_24a() {
 }
 
 test_24a() {
-       #set up fs1
-       gen_config
-
-       #set up fs2
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
-       [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
        if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
-               do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+               is_blkdev $SINGLEMDS $MDSDEV && \
                skip_env "mixed loopback and real device not working" && return
        fi
 
+       [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
+
        local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
        local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
 
@@ -837,7 +892,9 @@ test_24b() {
        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
        if [ -z "$fs2mds_DEV" ]; then
-               do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+               local dev=${SINGLEMDS}_dev
+               local MDSDEV=${!dev}
+               is_blkdev $SINGLEMDS $MDSDEV && \
                skip_env "mixed loopback and real device not working" && return
        fi
 
@@ -980,6 +1037,9 @@ test_29() {
            echo "Waiting $(($MAX - $WAIT)) secs for MDT deactivated"
        done
 
+        # quotacheck should not fail immediately after deactivate
+       [ -n "$ENABLE_QUOTA" ] && { $LFS quotacheck -ug $MOUNT || error "quotacheck has failed" ; }
+
         # test new client starts deactivated
        umount_client $MOUNT || return 200
        mount_client $MOUNT
@@ -991,6 +1051,9 @@ test_29() {
            echo "New client success: got $RESULT"
        fi
 
+        # quotacheck should not fail after umount/mount operation
+       [ -n "$ENABLE_QUOTA" ] && { $LFS quotacheck -ug $MOUNT || error "quotacheck has failed" ; }
+
        # make sure it reactivates
        set_and_check client "lctl get_param -n $PROC_ACT" "$PARAM" $ACTV || return 6
 
@@ -1263,7 +1326,9 @@ test_33a() { # bug 12333, was test_33
         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST
 
         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" ]; then
-                do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+                local dev=${SINGLEMDS}_dev
+                local MDSDEV=${!dev}
+                is_blkdev $SINGLEMDS $MDSDEV && \
                 skip_env "mixed loopback and real device not working" && return
         fi
 
@@ -1472,22 +1537,22 @@ test_35b() { # bug 18674
 run_test 35b "Continue reconnection retries, if the active server is busy"
 
 test_36() { # 12743
-        local rc
+        [ $OSTCOUNT -lt 2 ] && skip_env "skipping test for single OST" && return
+
+        [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
+               { skip "remote OST" && return 0; }
+
+        local rc=0
         local FSNAME2=test1234
         local fs3ost_HOST=$ost_HOST
         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
         [ -n "$ost1_HOST" ] && fs2ost_HOST=$ost1_HOST && fs3ost_HOST=$ost1_HOST
-        rc=0
 
         if [ -z "$fs2ost_DEV" -o -z "$fs2mds_DEV" -o -z "$fs3ost_DEV" ]; then
-               do_facet $SINGLEMDS [ -b "$MDSDEV" ] && \
+               is_blkdev $SINGLEMDS $MDSDEV && \
                skip_env "mixed loopback and real device not working" && return
         fi
-        [ $OSTCOUNT -lt 2 ] && skip_env "skipping test for single OST" && return
-
-       [ "$ost_HOST" = "`hostname`" -o "$ost1_HOST" = "`hostname`" ] || \
-               { skip "remote OST" && return 0; }
 
         local fs2mdsdev=${fs2mds_DEV:-${MDSDEV}_2}
         local fs2ostdev=${fs2ost_DEV:-$(ostdevname 1)_2}
@@ -1546,28 +1611,32 @@ test_36() { # 12743
 run_test 36 "df report consistency on OSTs with different block size"
 
 test_37() {
-       client_only && skip "client only testing" && return 0
-       LOCAL_MDSDEV="$TMP/mdt.img"
-       SYM_MDSDEV="$TMP/sym_mdt.img"
+       local mntpt=$(facet_mntpt $SINGLEMDS)
+       local mdsdev=$(mdsdevname ${SINGLEMDS//mds/})
+       local mdsdev_sym="$TMP/sym_mdt.img"
+
+       echo "MDS :     $mdsdev"
+       echo "SYMLINK : $mdsdev_sym"
+       do_facet $SINGLEMDS rm -f $mdsdev_sym
 
-       echo "MDS :     $LOCAL_MDSDEV"
-       echo "SYMLINK : $SYM_MDSDEV"
-       rm -f $LOCAL_MDSDEV
+       do_facet $SINGLEMDS ln -s $mdsdev $mdsdev_sym
 
-       touch $LOCAL_MDSDEV
-       mkfs.lustre --reformat --fsname=lustre --mdt --mgs --device-size=9000 $LOCAL_MDSDEV ||
-               error "mkfs.lustre $LOCAL_MDSDEV failed"
-       ln -s $LOCAL_MDSDEV $SYM_MDSDEV
+       echo "mount symlink device - $mdsdev_sym"
 
-       echo "mount symlink device - $SYM_MDSDEV"
+       local rc=0
+       mount_op=$(do_facet $SINGLEMDS mount -v -t lustre $MDS_MOUNT_OPTS  $mdsdev_sym $mntpt 2>&1 )
+       rc=${PIPESTATUS[0]}
 
-       mount_op=`mount -v -t lustre -o loop $SYM_MDSDEV ${MOUNT%/*}/mds 2>&1 | grep "unable to set tunable"`
-       umount -d ${MOUNT%/*}/mds
-       rm -f $LOCAL_MDSDEV $SYM_MDSDEV
+       echo mount_op=$mount_op
 
-       if [ -n "$mount_op" ]; then
-               error "**** FAIL: set tunables failed for symlink device"
+       do_facet $SINGLEMDS "umount -d $mntpt && rm -f $mdsdev_sym"
+
+       if $(echo $mount_op | grep -q "unable to set tunable"); then
+               error "set tunables failed for symlink device"
        fi
+
+       [ $rc -eq 0 ] || error "mount symlink $mdsdev_sym failed! rc=$rc"
+
        return 0
 }
 run_test 37 "verify set tunables works for symlink device"
@@ -1641,13 +1710,15 @@ run_test 39 "leak_finder recognizes both LUSTRE and LNET malloc messages"
 test_40() { # bug 15759
        start_ost
        #define OBD_FAIL_TGT_TOOMANY_THREADS     0x706
-       do_facet $SINGLEMDS "sysctl -w lustre.fail_loc=0x80000706"
+       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x80000706"
        start_mds
        cleanup
 }
 run_test 40 "race during service thread startup"
 
-test_41() { #bug 14134
+test_41a() { #bug 14134
+        echo $MDS_MOUNT_OPTS | grep "loop" && skip " loop devices does not work with nosvc option" && return
+
         local rc
         local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
@@ -1668,8 +1739,33 @@ test_41() { #bug 14134
         unload_modules_conf || return 204
         return $rc
 }
-run_test 41 "mount mds with --nosvc and --nomgs"
+run_test 41a "mount mds with --nosvc and --nomgs"
+
+test_41b() {
+        echo $MDS_MOUNT_OPTS | grep "loop" && skip " loop devices does not work with nosvc option" && return
+
+        stopall
+        reformat
+        local MDSDEV=$(mdsdevname ${SINGLEMDS//mds/})
 
+        start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nosvc -n
+        start_ost
+        start $SINGLEMDS $MDSDEV $MDS_MOUNT_OPTS -o nomgs,force
+        mkdir -p $MOUNT
+        mount_client $MOUNT || return 1
+        sleep 5
+
+        echo "blah blah" > $MOUNT/$tfile
+        cat $MOUNT/$tfile || return 200
+
+        umount_client $MOUNT
+        stop_ost || return 201
+        stop_mds -f || return 202
+        stop_mds -f || return 203
+
+}
+
+run_test 41b "mount mds with --nosvc and --nomgs on first mount"
 test_42() { #bug 14693
         setup
         check_mount || return 2
@@ -2077,6 +2173,8 @@ test_50c() {
        umount_client $MOUNT || error "Unable to unmount client"
        stop_ost2 || error "Unable to stop OST2"
        stop_mds || error "Unable to stop MDS"
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 50c "lazystatfs one server down =========================="
 
@@ -2097,6 +2195,8 @@ test_50d() {
        umount_client $MOUNT || error "Unable to unmount client"
        stop_ost2 || error "Unable to stop OST2"
        stop_mds || error "Unable to stop MDS"
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 50d "lazystatfs client/server conn race =========================="
 
@@ -2228,6 +2328,8 @@ test_51() {
        wait $pid
        stop_ost2 || return 3
        cleanup
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 51 "Verify that mdt_reint handles RMF_MDT_MD correctly when an OST is added"
 
@@ -2404,21 +2506,22 @@ thread_sanity() {
         lassert 23 "$msg (PDSH problems?)" '(($tstarted && $tmin && $tmax))' || return $?
         lassert 24 "$msg" '(($tstarted >= $tmin && $tstarted <= $tmax ))' || return $?
 
-        # Check that we can lower min/max
-        do_facet $facet "lctl set_param ${paramp}.threads_min=$((tmin - 1))"
+        # Check that we can change min/max
+        do_facet $facet "lctl set_param ${paramp}.threads_min=$((tmin + 1))"
         do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmax - 1))"
         tmin2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         tmax2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
-        lassert 25 "$msg" '(($tmin2 == ($tmin - 1) && $tmax2 == ($tmax -1)))' || return $?
+        lassert 25 "$msg" '(($tmin2 == ($tmin + 1) && $tmax2 == ($tmax -1)))' || return $?
 
         # Check that we can set min/max to the same value
-        do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmin - 1))"
+        tmin=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
+        do_facet $facet "lctl set_param ${paramp}.threads_max=$tmin"
         tmin2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         tmax2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
-        lassert 26 "$msg" '(($tmin2 == ($tmin - 1) && $tmax2 == ($tmin - 1)))' || return $?
+        lassert 26 "$msg" '(($tmin2 == $tmin && $tmax2 == $tmin))' || return $?
 
         # Check that we can't set max < min
-        do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmin - 2))"
+        do_facet $facet "lctl set_param ${paramp}.threads_max=$((tmin - 1))"
         tmin2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_min" || echo 0)
         tmax2=$(do_facet $facet "lctl get_param -n ${paramp}.threads_max" || echo 0)
         lassert 27 "$msg" '(($tmin2 <= $tmax2))' || return $?
@@ -2543,21 +2646,52 @@ test_56() {
 }
 run_test 56 "check big indexes"
 
-test_57() { # bug 22656
+test_57a() { # bug 22656
        local NID=$(do_facet ost1 "$LCTL get_param nis" | tail -1 | awk '{print $1}')
        writeconf
        do_facet ost1 "$TUNEFS --failnode=$NID `ostdevname 1`" || error "tunefs failed"
        start_mgsmds
        start_ost && error "OST registration from failnode should fail"
-       stop_mds
        reformat
 }
-run_test 57 "initial registration from failnode should fail (should return errs)"
+run_test 57a "initial registration from failnode should fail (should return errs)"
+
+test_57b() {
+       local NID=$(do_facet ost1 "$LCTL get_param nis" | tail -1 | awk '{print $1}')
+       writeconf
+       do_facet ost1 "$TUNEFS --servicenode=$NID `ostdevname 1`" || error "tunefs failed"
+       start_mgsmds
+       start_ost || error "OST registration from servicenode should not fail"
+       reformat
+}
+run_test 57b "initial registration from servicenode should not fail"
 
 count_osts() {
         do_facet mgs $LCTL get_param mgs.MGS.live.$FSNAME | grep OST | wc -l
 }
 
+test_58() { # bug 22658
+        [ "$FSTYPE" != "ldiskfs" ] && skip "not supported for $FSTYPE" && return
+       setup
+       mkdir -p $DIR/$tdir
+       createmany -o $DIR/$tdir/$tfile-%d 100
+       # make sure that OSTs do not cancel llog cookies before we unmount the MDS
+#define OBD_FAIL_OBD_LOG_CANCEL_NET      0x601
+       do_facet mds "lctl set_param fail_loc=0x601"
+       unlinkmany $DIR/$tdir/$tfile-%d 100
+       stop mds
+       local MNTDIR=$(facet_mntpt mds)
+       # remove all files from the OBJECTS dir
+       do_facet mds "mount -t ldiskfs $MDSDEV $MNTDIR"
+       do_facet mds "find $MNTDIR/OBJECTS -type f -delete"
+       do_facet mds "umount $MNTDIR"
+       # restart MDS with missing llog files
+       start_mds
+       do_facet mds "lctl set_param fail_loc=0"
+       reformat
+}
+run_test 58 "missing llog files must not prevent MDT from mounting"
+
 test_59() {
        start_mgsmds >> /dev/null
        local C1=$(count_osts)
@@ -2585,35 +2719,16 @@ test_59() {
        [ $C4 -eq 2 ] || error "OST2 writeconf should add log"
        stop_ost2 >> /dev/null
        cleanup_nocli >> /dev/null
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf
 }
 run_test 59 "writeconf mount option"
 
-
-test_58() { # bug 22658
-        [ "$FSTYPE" != "ldiskfs" ] && skip "not supported for $FSTYPE" && return
-       setup
-       mkdir -p $DIR/$tdir
-       createmany -o $DIR/$tdir/$tfile-%d 100
-       # make sure that OSTs do not cancel llog cookies before we unmount the MDS
-#define OBD_FAIL_OBD_LOG_CANCEL_NET      0x601
-       do_facet mds "lctl set_param fail_loc=0x601"
-       unlinkmany $DIR/$tdir/$tfile-%d 100
-       stop mds
-       local MNTDIR=$(facet_mntpt mds)
-       # remove all files from the OBJECTS dir
-       do_facet mds "mount -t ldiskfs $MDSDEV $MNTDIR"
-       do_facet mds "find $MNTDIR/OBJECTS -type f -delete"
-       do_facet mds "umount $MNTDIR"
-       # restart MDS with missing llog files
-       start_mds
-       do_facet mds "lctl set_param fail_loc=0"
-       reformat
-}
-run_test 58 "missing llog files must not prevent MDT from mounting"
-
 if ! combined_mgs_mds ; then
        stop mgs
 fi
+
 cleanup_gss
-equals_msg `basename $0`: test complete
-[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true
+
+complete $(basename $0) $SECONDS
+exit_status