Whamcloud - gitweb
LU-11434 tests: add version check conf-sanity 109a/b
[fs/lustre-release.git] / lustre / tests / conf-sanity.sh
index 8373e9a..7e07859 100644 (file)
@@ -519,6 +519,32 @@ test_5g() {
 }
 run_test 5g "handle missing debugfs"
 
+test_5h() {
+       setup
+
+       stop mds1
+       #define OBD_FAIL_MDS_FS_SETUP            0x135
+       do_facet mds1 "$LCTL set_param fail_loc=0x80000135"
+       start_mdt 1 && error "start mdt should fail"
+       start_mdt 1 || error "start mdt failed"
+       client_up || error "client_up failed"
+       cleanup
+}
+run_test 5h "start mdt failure at mdt_fs_setup()"
+
+test_5i() {
+       setup
+
+       stop mds1
+       #define OBD_FAIL_QUOTA_INIT              0xA05
+       do_facet mds1 "$LCTL set_param fail_loc=0x80000A05"
+       start_mdt 1 && error "start mdt should fail"
+       start_mdt 1 || error "start mdt failed"
+       client_up || error "client_up failed"
+       cleanup
+}
+run_test 5i "start mdt failure at mdt_quota_init()"
+
 test_6() {
        setup
        manual_umount_client
@@ -1061,22 +1087,35 @@ run_test 27b "Reacquire MGS lock after failover"
 
 test_28A() { # was test_28
        setup_noconfig
-       TEST="llite.$FSNAME-*.max_read_ahead_whole_mb"
-       PARAM="$FSNAME.llite.max_read_ahead_whole_mb"
-       ORIG=$($LCTL get_param -n $TEST)
-       FINAL=$(($ORIG + 1))
-       set_persistent_param_and_check client "$TEST" "$PARAM" $FINAL
-       FINAL=$(($FINAL + 1))
-       set_persistent_param_and_check client "$TEST" "$PARAM" $FINAL
+
+       local TEST="llite.$FSNAME-*.max_read_ahead_whole_mb"
+       local PARAM="$FSNAME.llite.max_read_ahead_whole_mb"
+       local orig=$($LCTL get_param -n $TEST)
+       local max=$($LCTL get_param -n \
+                       llite.$FSNAME-*.max_read_ahead_per_file_mb)
+
+       orig=${orig%%.[0-9]*}
+       max=${max%%.[0-9]*}
+       echo "ORIG:$orig MAX:$max"
+       [[ $max -le $orig ]] && orig=$((max - 3))
+       echo "ORIG:$orig MAX:$max"
+
+       local final=$((orig + 1))
+
+       set_persistent_param_and_check client "$TEST" "$PARAM" $final
+       final=$((final + 1))
+       set_persistent_param_and_check client "$TEST" "$PARAM" $final
        umount_client $MOUNT || error "umount_client $MOUNT failed"
        mount_client $MOUNT || error "mount_client $MOUNT failed"
-       RESULT=$($LCTL get_param -n $TEST)
-       if [ $RESULT -ne $FINAL ]; then
-               error "New config not seen: wanted $FINAL got $RESULT"
+
+       local result=$($LCTL get_param -n $TEST)
+
+       if [ $result -ne $final ]; then
+               error "New config not seen: wanted $final got $result"
        else
-               echo "New config success: got $RESULT"
+               echo "New config success: got $result"
        fi
-       set_persistent_param_and_check client "$TEST" "$PARAM" $ORIG
+       set_persistent_param_and_check client "$TEST" "$PARAM" $orig
        cleanup || error "cleanup failed with rc $?"
 }
 run_test 28A "permanent parameter setting"
@@ -1214,6 +1253,8 @@ test_30a() {
        mount_client $MOUNT || error "mount_client $MOUNT failed"
        FINAL=$($LCTL get_param -n $TEST)
        echo "deleted (default) value=$FINAL, orig=$ORIG"
+       ORIG=${ORIG%%.[0-9]*}
+       FINAL=${FINAL%%.[0-9]*}
        # assumes this parameter started at the default value
        [ "$FINAL" -eq "$ORIG" ] || fail "Deleted value=$FINAL, orig=$ORIG"
 
@@ -3494,11 +3535,11 @@ test_48() { # bz-17636 LU-7473
        then
                count=28        # hard coded of RPC protocol
        elif [ $(facet_fstype $SINGLEMDS) != ldiskfs ]; then
-               count=4000      # max_num 4091 max_ea_size = 32768
+               count=4000      # max_num 4091 max_ea_size = ~65536
        elif ! large_xattr_enabled; then
                count=450       # max_num 497 max_ea_size = 4012
        else
-               count=4500      # max_num 8187 max_ea_size = 1048492
+               count=4500      # max_num 8187 max_ea_size = 65452
                                # not create too much (>5000) to save test time
        fi
 
@@ -4516,7 +4557,7 @@ test_60() { # LU-471
 run_test 60 "check mkfs.lustre --mkfsoptions -E -O options setting"
 
 test_61() { # LU-80
-       local lxattr=false
+       local lxattr=$(large_xattr_enabled)
 
        [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.1.53) ] ||
                skip "Need MDS version at least 2.1.53"
@@ -4575,7 +4616,7 @@ test_61() { # LU-80
        log "remove large xattr $name from $file"
        setfattr -x $name $file || error "removing $name from $file failed"
 
-       if $lxattr; then
+       if $lxattr && [ $(facet_fstype $SINGLEMDS) == ldiskfs ]; then
                stopall || error "stopping for e2fsck run"
                for num in $(seq $MDSCOUNT); do
                        run_e2fsck $(facet_active_host mds$num) \
@@ -5847,8 +5888,23 @@ test_81() { # LU-4665
 
        # Check max_easize.
        local max_easize=$($LCTL get_param -n llite.*.max_easize)
-       [[ $max_easize -eq 128 ]] ||
-               error "max_easize is $max_easize, should be 128 bytes"
+       if [ $MDS1_VERSION -lt $(version_code 2.12.51) ]
+       then
+               [[ $max_easize -eq 128 ]] ||
+                       error "max_easize is $max_easize, should be 128 bytes"
+       else
+               # LU-11868
+               # 4012 is 4096 - ldiskfs ea overhead
+               [[ $max_easize -ge 4012 ]] ||
+               error "max_easize is $max_easize, should be at least 4012 bytes"
+
+               # 65452 is XATTR_SIZE_MAX - ldiskfs ea overhead
+               if large_xattr_enabled;
+               then
+                       [[ $max_easize -ge 65452 ]] ||
+                       error "max_easize is $max_easize, should be at least 65452 bytes"
+               fi
+       fi
 
        restore_ostindex
 }
@@ -7976,6 +8032,8 @@ test_109_file_shortened() {
 
 test_109a()
 {
+       [ $MDS1_VERSION -lt $(version_code 2.10.59) ] &&
+               skip "Needs MDS version 2.10.59 or later."
        [ "$(facet_fstype mgs)" == "zfs" ] &&
                skip "LU-8727: no implementation for ZFS"
 
@@ -8028,6 +8086,8 @@ run_test 109a "test lctl clear_conf fsname"
 
 test_109b()
 {
+       [ $MDS1_VERSION -lt $(version_code 2.10.59) ] &&
+               skip "Needs MDS version 2.10.59 or later."
        [ "$(facet_fstype mgs)" == "zfs" ] &&
                skip "LU-8727: no implementation for ZFS"
 
@@ -8676,6 +8736,149 @@ test_124()
 }
 run_test 124 "check failover after replace_nids"
 
+get_max_sectors_kb() {
+       local facet="$1"
+       local device="$2"
+       local dev_base=$(basename $(do_facet ${facet} "readlink -f ${device}"))
+       local max_sectors_path="/sys/block/${dev_base}/queue/max_sectors_kb"
+
+       do_facet ${facet} "[[ -e ${max_sectors_path} ]] &&
+                          cat ${max_sectors_path}"
+}
+
+get_max_hw_sectors_kb() {
+       local facet="$1"
+       local device="$2"
+       local dev_base=$(basename $(do_facet ${facet} "readlink -f ${device}"))
+       local max_hw_path="/sys/block/${dev_base}/queue/max_hw_sectors_kb"
+
+       do_facet ${facet} "[[ -e ${max_hw_path} ]] && cat ${max_hw_path}"
+}
+
+set_max_sectors_kb() {
+       local facet="$1"
+       local device="$2"
+       local value="$3"
+       local dev_base=$(basename $(do_facet ${facet} "readlink -f ${device}"))
+       local max_sectors_path="/sys/block/${dev_base}/queue/max_sectors_kb"
+
+       do_facet ${facet} "[[ -e ${max_sectors_path} ]] &&
+                          echo ${value} > ${max_sectors_path}"
+       rc=$?
+
+       [[ $rc -ne 0 ]] && echo "Failed to set ${max_sectors_path} to ${value}"
+
+       return $rc
+}
+
+# Return 0 if all slave devices have max_sectors_kb == max_hw_sectors_kb
+# Otherwise return > 0
+check_slaves_max_sectors_kb()
+{
+       local facet="$1"
+       local device="$2"
+       local dev_base=$(basename $(do_facet ${facet} "readlink -f ${device}"))
+       local slaves_dir=/sys/block/${dev_base}/slaves
+       local slave_devices=$(do_facet ${facet} "ls ${slaves_dir} 2>/dev/null")
+       [[ -z ${slave_devices} ]] && return 0
+
+       local slave max_sectors new_max_sectors max_hw_sectors path
+       local rc=0
+       for slave in ${slave_devices}; do
+               path="/dev/${slave}"
+               ! is_blkdev ${facet} ${path} && continue
+               max_sectors=$(get_max_sectors_kb ${facet} ${path})
+               max_hw_sectors=$(get_max_hw_sectors_kb ${facet} ${path})
+               new_max_sectors=${max_hw_sectors}
+               [[ ${new_max_sectors} -gt ${RQ_SIZE_LIMIT} ]] &&
+                       new_max_sectors=${RQ_SIZE_LIMIT}
+
+               if [[ ${max_sectors} -ne ${new_max_sectors} ]]; then
+                       echo "${path} ${max_sectors} ${new_max_sectors}"
+                       ((rc++))
+               fi
+               check_slaves_max_sectors_kb ${facet} ${path}
+               ((rc + $?))
+       done
+
+       return $rc
+}
+
+test_125()
+{
+       local facet_list="mgs mds1 ost1"
+       combined_mgs_mds && facet_list="mgs ost1"
+
+       local facet
+       for facet in ${facet_list}; do
+               [[ $(facet_fstype ${facet}) != ldiskfs ]] &&
+                       skip "ldiskfs only test" &&
+                       return 0
+               ! is_blkdev ${facet} $(facet_device ${facet}) &&
+                       skip "requires all real devices" &&
+                       return 0
+       done
+
+       local rc=0
+       # We don't increase IO request size limit past 16MB. See comments in
+       # lustre/utils/libmount_utils_ldiskfs.c:tune_max_sectors_kb()
+       RQ_SIZE_LIMIT=$((16 * 1024))
+       local device old_max_sectors new_max_sectors max_hw_sectors
+       for facet in ${facet_list}; do
+               device=$(facet_device ${facet})
+               old_max_sectors=$(get_max_sectors_kb ${facet} ${device})
+               max_hw_sectors=$(get_max_hw_sectors_kb ${facet} ${device})
+
+               # The expected value after l_tunedisk is executed
+               new_max_sectors=$old_max_sectors
+               [[ ${new_max_sectors_kb} -gt ${RQ_SIZE_LIMIT} ]] &&
+                       new_max_sectors_kb=${RQ_SIZE_LIMIT}
+
+               # Ensure the current value of max_sectors_kb does not equal
+               # max_hw_sectors_kb, so we can tell whether l_tunedisk did
+               # anything
+               set_max_sectors_kb ${facet} ${device} $((new_max_sectors - 1))
+
+               # Value before l_tunedisk
+               local pre_max_sectors=$(get_max_sectors_kb ${facet} ${device})
+               if [[ ${pre_max_sectors} -ne $((new_max_sectors - 1)) ]]; then
+                       echo "unable to satsify test pre-condition:"
+                       echo "${pre_max_sectors} != $((new_max_sectors - 1))"
+                       ((rc++))
+                       continue
+               fi
+
+               echo "Before: ${facet} ${device} ${pre_max_sectors} ${max_hw_sectors}"
+
+               do_facet ${facet} "libtool execute l_tunedisk ${device}"
+
+               # Value after l_tunedisk
+               local post_max_sectors=$(get_max_sectors_kb ${facet} ${device})
+
+               echo "After: ${facet} ${device} ${post_max_sectors} ${max_hw_sectors}"
+
+               if [[ ${facet} != ost1 ]]; then
+                       if [[ ${post_max_sectors} -ne ${pre_max_sectors} ]]; then
+                               echo "l_tunedisk modified max_sectors_kb of ${facet}"
+                               ((rc++))
+                       fi
+
+                       set_max_sectors_kb ${facet} ${device} ${old_max_sectors}
+               else
+                       if [[ ${post_max_sectors} -eq ${pre_max_sectors} ]]; then
+                               echo "l_tunedisk failed to modify max_sectors_kb of ${facet}"
+                               ((rc++))
+                       fi
+
+                       check_slaves_max_sectors_kb ${facet} ${device} ||
+                               ((rc++))
+               fi
+       done
+
+       return $rc
+}
+run_test 125 "check l_tunedisk only tunes OSTs and their slave devices"
+
 if ! combined_mgs_mds ; then
        stop mgs
 fi