Whamcloud - gitweb
LU-2988 mgs: Fix two "lctl replace_nids" resource leaks
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index 9263c82..32ddff1 100644 (file)
@@ -9,8 +9,8 @@ set -e
 
 ONLY=${ONLY:-"$*"}
 
-# bug number for skipped test:
-ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT"
+# bug number for skipped test:     LU-2828
+ALWAYS_EXCEPT="$CONF_SANITY_EXCEPT 59 64"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
 is_sles11()                                            # LU-2181
@@ -75,6 +75,10 @@ if [[ "$LDISKFS_MKFS_OPTS" != *lazy_itable_init* ]]; then
        LDISKFS_MKFS_OPTS=$(csa_add "$LDISKFS_MKFS_OPTS" -E lazy_itable_init)
 fi
 
+[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
+# bug number for skipped test:        LU-2778 LU-2059
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 57b     50h"
+
 init_logging
 
 #
@@ -110,7 +114,7 @@ writeconf_or_reformat() {
        # Better reformat if it fails...
        writeconf_all $MDSCOUNT 2 ||
                { echo "tunefs failed, reformatting instead" &&
-                 reformat_and_config && return 1; }
+                 reformat_and_config && return 0; }
        return 0
 }
 
@@ -599,24 +603,25 @@ test_17() {
                return
        fi
 
-        setup
-        check_mount || return 41
-        cleanup || return $?
+       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"
+       if ! combined_mgs_mds ; then
+               stop mgs
+       fi
 
-        do_facet mgs "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' $MGSDEV || return \$?" || return $?
+       do_facet mgs "$DEBUGFS -w -R 'unlink CONFIGS/$FSNAME-MDT0000' \
+               $(mgsdevname) || return \$?" || return $?
 
-        if ! combined_mgs_mds ; then
-                start_mgs
-        fi
+       if ! combined_mgs_mds ; then
+               start_mgs
+       fi
 
-        start_ost
-        start_mds && return 42
-        reformat_and_config
+       start_ost
+       start_mds && return 42
+       reformat_and_config
 }
 run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)"
 
@@ -641,8 +646,14 @@ test_18() {
                 log "use STORED_MDSSIZE=$STORED_MDSSIZE"
 
         # check if the block device is large enough
-        [ -z "$OK" ] && $(is_blkdev $SINGLEMDS $MDSDEV $MIN) && OK=1 &&
-                myMDSSIZE=$MIN && log "use device $MDSDEV with MIN=$MIN"
+       is_blkdev $SINGLEMDS $MDSDEV $MIN
+       local large_enough=$?
+       if [ -n "$OK" ]; then
+               [ $large_enough -ne 0 ] && OK=""
+       else
+               [ $large_enough -eq 0 ] && OK=1 && myMDSSIZE=$MIN &&
+                       log "use device $MDSDEV with MIN=$MIN"
+       fi
 
         # check if a loopback device has enough space for fs metadata (5%)
 
@@ -1200,6 +1211,11 @@ test_31() { # bug 10734
 }
 run_test 31 "Connect to non-existent node (shouldn't crash)"
 
+
+T32_QID=60000
+T32_BLIMIT=20480 # Kbytes
+T32_ILIMIT=2
+
 #
 # This is not really a test but a tool to create new disk
 # image tarballs for the upgrade tests.
@@ -1230,10 +1246,19 @@ test_32newtarball() {
 
        mkdir $tmp/src
        tar cf - -C $src . | tar xf - -C $tmp/src
+       dd if=/dev/zero of=$tmp/src/t32_qf_old bs=1M \
+               count=$(($T32_BLIMIT / 1024 / 2))
+       chown $T32_QID.$T32_QID $tmp/src/t32_qf_old
 
        formatall
 
        setupall
+
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.50) ] &&
+               $LFS quotacheck -ug /mnt/$FSNAME
+       $LFS setquota -u $T32_QID -b 0 -B $T32_BLIMIT -i 0 -I $T32_ILIMIT \
+               /mnt/$FSNAME
+
        tar cf - -C $tmp/src . | tar xf - -C /mnt/$FSNAME
        stopall
 
@@ -1247,6 +1272,19 @@ test_32newtarball() {
        popd
        $LCTL get_param -n version | head -n 1 |
                sed -e 's/^lustre: *//' >$tmp/img/commit
+
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.50) ] &&
+               $LFS quotaon -ug /mnt/$FSNAME
+       $LFS quota -u $T32_QID -v /mnt/$FSNAME
+       $LFS quota -v -u $T32_QID /mnt/$FSNAME |
+               awk 'BEGIN { num='1' } { if ($1 == "'/mnt/$FSNAME'") \
+               { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
+               | tr -d "*" > $tmp/img/bspace
+       $LFS quota -v -u $T32_QID /mnt/$FSNAME |
+               awk 'BEGIN { num='5' } { if ($1 == "'/mnt/$FSNAME'") \
+               { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
+               | tr -d "*" > $tmp/img/ispace
+
        stopall
 
        pushd $tmp/src
@@ -1380,6 +1418,86 @@ t32_wait_til_devices_gone() {
        return 1
 }
 
+t32_verify_quota() {
+       local node=$1
+       local fsname=$2
+       local mnt=$3
+       local fstype=$(facet_fstype $SINGLEMDS)
+       local qval
+       local cmd
+
+       $LFS quota -u $T32_QID -v $mnt
+
+       qval=$($LFS quota -v -u $T32_QID $mnt |
+               awk 'BEGIN { num='1' } { if ($1 == "'$mnt'") \
+               { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
+               | tr -d "*")
+       [ $qval -eq $img_bspace ] || {
+               echo "bspace, act:$qval, exp:$img_bspace"
+               return 1
+       }
+
+       qval=$($LFS quota -v -u $T32_QID $mnt |
+               awk 'BEGIN { num='5' } { if ($1 == "'$mnt'") \
+               { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
+               | tr -d "*")
+       [ $qval -eq $img_ispace ] || {
+               echo "ispace, act:$qval, exp:$img_ispace"
+               return 1
+       }
+
+       qval=$($LFS quota -v -u $T32_QID $mnt |
+               awk 'BEGIN { num='3' } { if ($1 == "'$mnt'") \
+               { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
+               | tr -d "*")
+       [ $qval -eq $T32_BLIMIT ] || {
+               echo "blimit, act:$qval, exp:$T32_BLIMIT"
+               return 1
+       }
+
+       qval=$($LFS quota -v -u $T32_QID $mnt |
+               awk 'BEGIN { num='7' } { if ($1 == "'$mnt'") \
+               { if (NF == 1) { getline } else { num++ } ; print $num;} }' \
+               | tr -d "*")
+       [ $qval -eq $T32_ILIMIT ] || {
+               echo "ilimit, act:$qval, exp:$T32_ILIMIT"
+               return 1
+       }
+
+       do_node $node $LCTL conf_param $fsname.quota.mdt=ug
+       cmd="$LCTL get_param -n osd-$fstype.$fsname-MDT0000"
+       cmd=$cmd.quota_slave.enabled
+       wait_update $node "$cmd" "ug" || {
+               echo "Enable mdt quota failed"
+               return 1
+       }
+
+       do_node $node $LCTL conf_param $fsname.quota.ost=ug
+       cmd="$LCTL get_param -n osd-$fstype.$fsname-OST0000"
+       cmd=$cmd.quota_slave.enabled
+       wait_update $node "$cmd" "ug" || {
+               echo "Enable ost quota failed"
+               return 1
+       }
+
+       chmod 0777 $mnt
+       runas -u $T32_QID -g $T32_QID dd if=/dev/zero of=$mnt/t32_qf_new \
+               bs=1M count=$(($T32_BLIMIT / 1024)) oflag=sync && {
+               echo "Write succeed, but expect -EDQUOT"
+               return 1
+       }
+       rm -f $mnt/t32_qf_new
+
+       runas -u $T32_QID -g $T32_QID createmany -m $mnt/t32_qf_ \
+               $T32_ILIMIT && {
+               echo "Create succeed, but expect -EDQUOT"
+               return 1
+       }
+       unlinkmany $mnt/t32_qf_ $T32_ILIMIT
+
+       return 0
+}
+
 t32_test() {
        local tarball=$1
        local writeconf=$2
@@ -1396,6 +1514,8 @@ t32_test() {
        local img_commit
        local img_kernel
        local img_arch
+       local img_bspace
+       local img_ispace
        local fsname=t32fs
        local nid=$($r $LCTL list_nids | head -1)
        local mopts
@@ -1403,6 +1523,7 @@ t32_test() {
        local nrpcs_orig
        local nrpcs
        local list
+       local fstype=$(facet_fstype $SINGLEMDS)
 
        trap 'trap - RETURN; t32_test_cleanup' RETURN
 
@@ -1415,6 +1536,8 @@ t32_test() {
        img_commit=$($r cat $tmp/commit)
        img_kernel=$($r cat $tmp/kernel)
        img_arch=$($r cat $tmp/arch)
+       img_bspace=$($r cat $tmp/bspace)
+       img_ispace=$($r cat $tmp/ispace)
        echo "Upgrading from $(basename $tarball), created with:"
        echo "  Commit: $img_commit"
        echo "  Kernel: $img_kernel"
@@ -1428,6 +1551,12 @@ t32_test() {
        }
        if [ "$writeconf" ]; then
                mopts=loop,writeconf
+               if [ $fstype == "ldiskfs" ]; then
+                       $r $TUNEFS --quota $tmp/mdt || {
+                               error_noexit "Enable mdt quota feature"
+                               return 1
+                       }
+               fi
        else
                mopts=loop,exclude=$fsname-OST0000
        fi
@@ -1477,6 +1606,12 @@ t32_test() {
        }
        if [ "$writeconf" ]; then
                mopts=loop,mgsnode=$nid,$writeconf
+               if [ $fstype == "ldiskfs" ]; then
+                       $r $TUNEFS --quota $tmp/ost || {
+                               error_noexit "Enable ost quota feature"
+                               return 1
+                       }
+               fi
        else
                mopts=loop,mgsnode=$nid
        fi
@@ -1521,16 +1656,16 @@ t32_test() {
        }
 
        if [ "$dne_upgrade" != "no" ]; then
-               $r2 $LCTL conf_param \
+               $r $LCTL conf_param \
                                $fsname-MDT0001.mdc.max_rpcs_in_flight=9 || {
                        error_noexit "Setting MDT1 \"max_rpcs_in_flight\""
                        return 1
                }
-               $r2 $LCTL conf_param $fsname-MDT0001.failover.node=$nid || {
+               $r $LCTL conf_param $fsname-MDT0001.failover.node=$nid || {
                        error_noexit "Setting MDT1 \"failover.node\""
                        return 1
                }
-               $r2 $LCTL conf_param $fsname-MDT0001.lov.stripesize=4M || {
+               $r $LCTL conf_param $fsname-MDT0001.lov.stripesize=4M || {
                        error_noexit "Setting MDT1 \"lov.stripesize\""
                        return 1
                }
@@ -1544,6 +1679,12 @@ t32_test() {
                }
                shall_cleanup_lustre=true
                $LCTL set_param debug="$PTLDEBUG"
+
+               t32_verify_quota $node $fsname $tmp/mnt/lustre || {
+                       error_noexit "verify quota failed"
+                       return 1
+               }
+
                if [ "$dne_upgrade" != "no" ]; then
                        $LFS mkdir -i 1 $tmp/mnt/lustre/remote_dir || {
                                error_noexit "set remote dir failed"
@@ -1559,6 +1700,15 @@ t32_test() {
                        popd
                fi
 
+               dd if=/dev/zero of=$tmp/mnt/lustre/tmp_file bs=10k count=10 || {
+                       error_noexit "dd failed"
+                       return 1
+               }
+               rm -rf $tmp/mnt/lustre/tmp_file || {
+                       error_noexit "rm failed"
+                       return 1
+               }
+
                if $r test -f $tmp/sha1sums; then
                        # LU-2393 - do both sorts on same node to ensure locale
                        # is identical
@@ -2225,15 +2375,23 @@ test_41b() {
 run_test 41b "mount mds with --nosvc and --nomgs on first mount"
 
 test_42() { #bug 14693
-        setup
-        check_mount || return 2
-        do_facet mgs $LCTL conf_param lustre.llite.some_wrong_param=10
-        umount_client $MOUNT
-        mount_client $MOUNT || return 1
-        cleanup
-        return 0
+       setup
+       check_mount || error "client was not mounted"
+
+       do_facet mgs $LCTL conf_param $FSNAME.llite.some_wrong_param=10
+       umount_client $MOUNT ||
+               error "unmounting client failed with invalid llite param"
+       mount_client $MOUNT ||
+               error "mounting client failed with invalid llite param"
+
+       do_facet mgs $LCTL conf_param $FSNAME.sys.some_wrong_param=20
+       cleanup || error "stopping $FSNAME failed with invalid sys param"
+       setup
+       check_mount || "client was not mounted with invalid sys param"
+       cleanup || error "stopping $FSNAME failed with invalid sys param"
+       return 0
 }
-run_test 42 "invalid config param should not prevent client from mounting"
+run_test 42 "allow client/server mount/unmount with invalid config param"
 
 test_43() {
        [ $UID -ne 0 -o $RUNAS_ID -eq 0 ] && skip_env "run as root"
@@ -2768,6 +2926,42 @@ test_50g() {
 }
 run_test 50g "deactivated OST should not cause panic====================="
 
+# LU-642
+test_50h() {
+       # prepare MDT/OST, make OSC inactive for OST1
+       [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
+       do_facet ost1 "$TUNEFS --param osc.active=0 `ostdevname 1`" ||
+               error "tunefs OST1 failed"
+       start_mds  || error "Unable to start MDT"
+       start_ost  || error "Unable to start OST1"
+       start_ost2 || error "Unable to start OST2"
+       mount_client $MOUNT || error "client start failed"
+
+       mkdir -p $DIR/$tdir
+
+       # activatate OSC for OST1
+       local TEST="$LCTL get_param -n osc.${FSNAME}-OST0000-osc-[!M]*.active"
+       set_conf_param_and_check client                                 \
+               "$TEST" "${FSNAME}-OST0000.osc.active" 1 ||
+               error "Unable to activate OST1"
+
+       mkdir -p $DIR/$tdir/2
+       $LFS setstripe -c -1 -i 0 $DIR/$tdir/2
+       sleep 1 && echo "create a file after OST1 is activated"
+       # create some file
+       createmany -o $DIR/$tdir/2/$tfile-%d 1
+
+       # check OSC import is working
+       stat $DIR/$tdir/2/* >/dev/null 2>&1 ||
+               error "some OSC imports are still not connected"
+
+       # cleanup
+       umount_client $MOUNT || error "Unable to umount client"
+       stop_ost2 || error "Unable to stop OST2"
+       cleanup_nocli
+}
+run_test 50h "LU-642: activate deactivated OST  ==="
+
 test_51() {
        local LOCAL_TIMEOUT=20
 
@@ -2960,7 +3154,6 @@ thread_sanity() {
        local nthrs
         shift 4
 
-        setup
         check_mount || return 41
 
         # We need to expand $parampat, but it may match multiple parameters, so
@@ -3034,18 +3227,28 @@ thread_sanity() {
 
         load_modules
         setup
-        cleanup
 }
 
 test_53a() {
+       setup
        thread_sanity OST ost1 'ost.*.ost' 'oss_num_threads' '16'
+       cleanup
 }
 run_test 53a "check OSS thread count params"
 
 test_53b() {
-       thread_sanity MDT $SINGLEMDS 'mdt.*.*.' 'mdt_num_threads' '16'
+       setup
+       local mds=$(do_facet $SINGLEMDS "lctl get_param -N mds.*.*.threads_max \
+                   2>/dev/null")
+       if [ -z "$mds" ]; then
+               #running this on an old MDT
+               thread_sanity MDT $SINGLEMDS 'mdt.*.*.' 'mdt_num_threads' 16
+       else
+               thread_sanity MDT $SINGLEMDS 'mds.*.*.' 'mds_num_threads' 16
+       fi
+       cleanup
 }
-run_test 53b "check MDT thread count params"
+run_test 53b "check MDS thread count params"
 
 test_54a() {
        if [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
@@ -3371,9 +3574,121 @@ test_64() {
        echo "$LFS df"
        $LFS df --lazy || error "lfs df failed"
        cleanup || return $?
+       #writeconf to remove all ost2 traces for subsequent tests
+       writeconf_or_reformat
 }
 run_test 64 "check lfs df --lazy "
 
+test_65() { # LU-2237
+       # Currently, the test is only valid for ldiskfs backend
+       [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
+               skip "non-ldiskfs backend" && return
+
+       local devname=$(mdsdevname ${SINGLEMDS//mds/})
+       local brpt=$(facet_mntpt brpt)
+       local opts=""
+
+       if ! do_facet $SINGLEMDS "test -b $devname"; then
+               opts="-o loop"
+       fi
+
+       stop_mds
+       local obj=$(do_facet $SINGLEMDS \
+                   "$DEBUGFS -c -R \\\"stat last_rcvd\\\" $devname" |
+                   grep Inode)
+       if [ -z "$obj" ]; then
+               # The MDT may be just re-formatted, mount the MDT for the
+               # first time to guarantee the "last_rcvd" file is there.
+               start_mds || error "fail to mount the MDS for the first time"
+               stop_mds
+       fi
+
+       # remove the "last_rcvd" file
+       do_facet $SINGLEMDS "mkdir -p $brpt"
+       do_facet $SINGLEMDS \
+               "mount -t $(facet_fstype $SINGLEMDS) $opts $devname $brpt"
+       do_facet $SINGLEMDS "rm -f ${brpt}/last_rcvd"
+       do_facet $SINGLEMDS "umount $brpt"
+
+       # restart MDS, the "last_rcvd" file should be recreated.
+       start_mds || error "fail to restart the MDS"
+       stop_mds
+       obj=$(do_facet $SINGLEMDS \
+             "$DEBUGFS -c -R \\\"stat last_rcvd\\\" $devname" | grep Inode)
+       [ -n "$obj" ] || error "fail to re-create the last_rcvd"
+}
+run_test 65 "re-create the lost last_rcvd file when server mount"
+
+test_66() {
+       [[ $(lustre_version_code mgs) -ge $(version_code 2.3.59) ]] ||
+               { skip "Need MGS version at least 2.3.59"; return 0; }
+
+       setup
+       local OST1_NID=$(do_facet ost1 $LCTL list_nids | head -1)
+       local MDS_NID=$(do_facet $SINGLEMDS $LCTL list_nids | head -1)
+
+       echo "replace_nids should fail if MDS, OSTs and clients are UP"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID &&
+               error "replace_nids fail"
+
+       umount_client $MOUNT || error "unmounting client failed"
+       echo "replace_nids should fail if MDS and OSTs are UP"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID &&
+               error "replace_nids fail"
+
+       stop_ost
+       echo "replace_nids should fail if MDS is UP"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID &&
+               error "replace_nids fail"
+
+       stop_mds || error "stopping mds failed"
+
+       if combined_mgs_mds; then
+               start_mds "-o nosvc" ||
+                       error "starting mds with nosvc option failed"
+       fi
+
+       echo "command should accept two parameters"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 &&
+               error "command should accept two params"
+
+       echo "correct device name should be passed"
+       do_facet mgs $LCTL replace_nids $FSNAME-WRONG0000 $OST1_NID &&
+               error "wrong devname"
+
+       echo "wrong nids list should not destroy the system"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 "wrong nids list" &&
+               error "wrong parse"
+
+       echo "replace OST nid"
+       do_facet mgs $LCTL replace_nids $FSNAME-OST0000 $OST1_NID ||
+               error "replace nids failed"
+
+       echo "command should accept two parameters"
+       do_facet mgs $LCTL replace_nids $FSNAME-MDT0000 &&
+               error "command should accept two params"
+
+       echo "wrong nids list should not destroy the system"
+       do_facet mgs $LCTL replace_nids $FSNAME-MDT0000 "wrong nids list" &&
+               error "wrong parse"
+
+       echo "replace MDS nid"
+       do_facet mgs $LCTL replace_nids $FSNAME-MDT0000 $MDS_NID ||
+               error "replace nids failed"
+
+       if ! combined_mgs_mds ; then
+               stop_mgs
+       else
+               stop_mds
+       fi
+
+       setup_noconfig
+       check_mount || error "error after nid replace"
+       cleanup || error "cleanup failed"
+       reformat
+}
+run_test 66 "replace nids"
+
 test_70a() {
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
        local MDTIDX=1
@@ -3618,6 +3933,45 @@ test_71e() {
 }
 run_test 71e "start OST0, MDT1, OST1, MDT0"
 
+test_72() { #LU-2634
+       local mdsdev=$(mdsdevname 1)
+       local ostdev=$(ostdevname 1)
+       local cmd="$E2FSCK -fnvd $mdsdev"
+       local fn=3
+
+       [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] &&
+               skip "ldiskfs only test" && return
+
+       #tune MDT with "-O extents"
+       add $SINGLEMDS \
+               $(mkfs_opts $SINGLEMDS ${mdsdev}) --reformat $mdsdev ||
+                       error "add $SINGLEMDS failed"
+       $TUNE2FS -O extents $mdsdev
+       add ost1 $(mkfs_opts ost1 $ostdev) --reformat $ostdev ||
+               error "add $ostdev failed"
+       start_mgsmds || error "start mds failed"
+       start_ost || error "start ost failed"
+       mount_client $MOUNT || error "mount client failed"
+
+       #create some short symlinks
+       mkdir -p $DIR/$tdir
+       createmany -o $DIR/$tdir/$tfile-%d $fn
+       echo "create $fn short symlinks"
+       for i in $(seq -w 1 $fn); do
+               ln -s $DIR/$tdir/$tfile-$i $MOUNT/$tfile-$i
+       done
+       ls -al $MOUNT
+
+       #umount
+       umount_client $MOUNT || error "umount client failed"
+       stop_mds || error "stop mds failed"
+       stop_ost || error "stop ost failed"
+
+       #run e2fsck
+       run_e2fsck $(facet_active_host $SINGLEMDS) $mdsdev "-n"
+}
+run_test 72 "test fast symlink with extents flag enabled"
+
 if ! combined_mgs_mds ; then
        stop mgs
 fi