Whamcloud - gitweb
LU-8226 tests: Change check_catastrophe() to check_node_health()
[fs/lustre-release.git] / lustre / tests / test-framework.sh
index 4e82e08..541f90f 100755 (executable)
@@ -700,6 +700,18 @@ fs_log_size() {
        echo -n $size
 }
 
+fs_inode_ksize() {
+       local facet=${1:-$SINGLEMDS}
+       local fstype=$(facet_fstype $facet)
+       local size=0
+       case $fstype in
+               ldiskfs) size=4;;  # ~4KB per inode
+               zfs)     size=11;; # 10 to 11KB per inode
+       esac
+
+       echo -n $size
+}
+
 check_gss_daemon_nodes() {
     local list=$1
     dname=$2
@@ -978,6 +990,19 @@ facet_vdevice() {
        echo -n $device
 }
 
+running_in_vm() {
+       local virt=$(virt-what 2> /dev/null)
+
+       [ $? -eq 0 ] && [ -n "$virt" ] && { echo $virt; return; }
+
+       virt=$(dmidecode -s system-product-name | awk '{print $1}')
+
+       case $virt in
+               VMware|KVM|VirtualBox|Parallels) echo ${virt,,} ;;
+               *) ;;
+       esac
+}
+
 #
 # Re-read the partition table on failover partner host.
 # After a ZFS storage pool is created on a shared device, the partition table
@@ -1149,7 +1174,7 @@ set_debug_size () {
     if [ -f /sys/devices/system/cpu/possible ]; then
         local cpus=$(($(cut -d "-" -f 2 /sys/devices/system/cpu/possible)+1))
     else
-        local cpus=$(getconf _NPROCESSORS_CONF)
+        local cpus=$(getconf _NPROCESSORS_CONF 2>/dev/null)
     fi
 
     # bug 19944, adjust size to be -gt num_possible_cpus()
@@ -1320,7 +1345,9 @@ mount_facet() {
 
        # commit the device label change to disk
        if [[ $devicelabel =~ (:[a-zA-Z]{3}[0-9]{4}) ]]; then
+               echo "Commit the device label on ${!dev}"
                do_facet $facet "sync; sync; sync"
+               sleep 5
        fi
 
 
@@ -1564,7 +1591,7 @@ zconf_umount() {
     local client=$1
     local mnt=$2
     local force
-    local busy 
+    local busy
     local need_kill
 
     [ "$3" ] && force=-f
@@ -1605,13 +1632,13 @@ if [ \\\$running -ne \\\$mpts ]; then
     echo \\\$(hostname) env are INSANE!;
     exit 1;
 fi"
-    [ $? -eq 0 ] || rc=1 
+    [ $? -eq 0 ] || rc=1
     done
     return $rc
 }
 
 sanity_mount_check_servers () {
-    [ "$CLIENTONLY" ] && 
+    [ -n "$CLIENTONLY" ] &&
         { echo "CLIENTONLY mode, skip mount_check_servers"; return 0; } || true
     echo Checking servers environments
 
@@ -1733,7 +1760,7 @@ shutdown_node_hard () {
         wait_for_function --quiet "! ping -w 3 -c 1 $host" 5 1 && return 0
         echo "waiting for $host to fail attempts=$attempts"
         [ $i -lt $attempts ] || \
-            { echo "$host still pingable after power down! attempts=$attempts" && return 1; } 
+            { echo "$host still pingable after power down! attempts=$attempts" && return 1; }
     done
 }
 
@@ -1904,55 +1931,59 @@ start_client_loads () {
 
 # only for remote client
 check_client_load () {
-    local client=$1
-    local var=$(node_var_name $client)_load
-    local TESTLOAD=run_${!var}.sh
-
-    ps auxww | grep -v grep | grep $client | grep -q "$TESTLOAD" || return 1
-
-    # bug 18914: try to connect several times not only when
-    # check ps, but  while check_catastrophe also
-    local tries=3
-    local RC=254
-    while [ $RC = 254 -a $tries -gt 0 ]; do
-        let tries=$tries-1
-        # assume success
-        RC=0
-        if ! check_catastrophe $client; then
-            RC=${PIPESTATUS[0]}
-            if [ $RC -eq 254 ]; then
-                # FIXME: not sure how long we shuold sleep here
-                sleep 10
-                continue
-            fi
-            echo "check catastrophe failed: RC=$RC "
-            return $RC
-        fi
-    done
-    # We can continue try to connect if RC=254
-    # Just print the warning about this
-    if [ $RC = 254 ]; then
-        echo "got a return status of $RC from do_node while checking catastrophe on $client"
-    fi
-
-    # see if the load is still on the client
-    tries=3
-    RC=254
-    while [ $RC = 254 -a $tries -gt 0 ]; do
-        let tries=$tries-1
-        # assume success
-        RC=0
-        if ! do_node $client "ps auxwww | grep -v grep | grep -q $TESTLOAD"; then
-            RC=${PIPESTATUS[0]}
-            sleep 30
-        fi
-    done
-    if [ $RC = 254 ]; then
-        echo "got a return status of $RC from do_node while checking (catastrophe and 'ps') the client load on $client"
-        # see if we can diagnose a bit why this is
-    fi
+       local client=$1
+       local var=$(node_var_name $client)_load
+       local testload=run_${!var}.sh
+
+       ps -C $testload | grep $client || return 1
+
+       # bug 18914: try to connect several times not only when
+       # check ps, but  while check_node_health also
+
+       local tries=3
+       local RC=254
+       while [ $RC = 254 -a $tries -gt 0 ]; do
+               let tries=$tries-1
+               # assume success
+               RC=0
+               if ! check_node_health $client; then
+                       RC=${PIPESTATUS[0]}
+                       if [ $RC -eq 254 ]; then
+                               # FIXME: not sure how long we shuold sleep here
+                               sleep 10
+                               continue
+                       fi
+                       echo "check node health failed: RC=$RC "
+                       return $RC
+               fi
+       done
+       # We can continue try to connect if RC=254
+       # Just print the warning about this
+       if [ $RC = 254 ]; then
+               echo "got a return status of $RC from do_node while checking " \
+               "node health on $client"
+       fi
+
+       # see if the load is still on the client
+       tries=3
+       RC=254
+       while [ $RC = 254 -a $tries -gt 0 ]; do
+               let tries=$tries-1
+               # assume success
+               RC=0
+               if ! do_node $client \
+                       "ps auxwww | grep -v grep | grep -q $testload"; then
+                       RC=${PIPESTATUS[0]}
+                       sleep 30
+               fi
+       done
+       if [ $RC = 254 ]; then
+               echo "got a return status of $RC from do_node while checking " \
+               "(node health and 'ps') the client load on $client"
+               # see if we can diagnose a bit why this is
+       fi
 
-    return $RC
+       return $RC
 }
 check_client_loads () {
    local clients=${1//,/ }
@@ -2401,25 +2432,27 @@ wait_remote_prog () {
     return $rc
 }
 
+lfs_df_check() {
+       local clients=${1:-$CLIENTS}
+
+       if [ -z "$clients" ]; then
+               $LFS df $MOUNT
+       else
+               $PDSH $clients "$LFS df $MOUNT" > /dev/null
+       fi
+}
+
+
 clients_up() {
-    # not every config has many clients
-    sleep 1
-    if [ ! -z "$CLIENTS" ]; then
-        $PDSH $CLIENTS "stat -f $MOUNT" > /dev/null
-    else
-        stat -f $MOUNT > /dev/null
-    fi
+       # not every config has many clients
+       sleep 1
+       lfs_df_check
 }
 
 client_up() {
-    local client=$1
-    # usually checked on particular client or locally
-    sleep 1
-    if [ ! -z "$client" ]; then
-        $PDSH $client "stat -f $MOUNT" > /dev/null
-    else
-        stat -f $MOUNT > /dev/null
-    fi
+       # usually checked on particular client or locally
+       sleep 1
+       lfs_df_check $1
 }
 
 client_evicted() {
@@ -3247,7 +3280,7 @@ facet_mntpt () {
 mount_ldiskfs() {
        local facet=$1
        local dev=$(facet_device $facet)
-       local mnt=$(facet_mntpt $facet)
+       local mnt=${2:-$(facet_mntpt $facet)}
        local opts
 
        if ! do_facet $facet test -b $dev; then
@@ -3259,7 +3292,7 @@ mount_ldiskfs() {
 unmount_ldiskfs() {
        local facet=$1
        local dev=$(facet_device $facet)
-       local mnt=$(facet_mntpt $facet)
+       local mnt=${2:-$(facet_mntpt $facet)}
 
        do_facet $facet $UMOUNT $mnt
 }
@@ -3271,7 +3304,7 @@ var_name() {
 mount_zfs() {
        local facet=$1
        local ds=$(facet_device $facet)
-       local mnt=$(facet_mntpt $facet)
+       local mnt=${2:-$(facet_mntpt $facet)}
        local canmnt
        local mntpt
 
@@ -3294,7 +3327,7 @@ mount_zfs() {
 unmount_zfs() {
        local facet=$1
        local ds=$(facet_device $facet)
-       local mnt=$(facet_mntpt $facet)
+       local mnt=${2:-$(facet_mntpt $facet)}
        local var_mntpt=mz_$(var_name ${facet}_$ds)_mountpoint
        local var_canmnt=mz_$(var_name ${facet}_$ds)_canmount
        local mntpt=${!var_mntpt}
@@ -3310,16 +3343,18 @@ unmount_zfs() {
 
 mount_fstype() {
        local facet=$1
+       local mnt=$2
        local fstype=$(facet_fstype $facet)
 
-       mount_$fstype $facet
+       mount_$fstype $facet $mnt
 }
 
 unmount_fstype() {
        local facet=$1
+       local mnt=$2
        local fstype=$(facet_fstype $facet)
 
-       unmount_$fstype $facet
+       unmount_$fstype $facet $mnt
 }
 
 ########
@@ -3339,7 +3374,8 @@ stopall() {
     zconf_umount_clients $clients $MOUNT "$*" || true
     [ -n "$MOUNT2" ] && zconf_umount_clients $clients $MOUNT2 "$*" || true
 
-    [ "$CLIENTONLY" ] && return
+    [ -n "$CLIENTONLY" ] && return
+
     # The add fn does rm ${facet}active file, this would be enough
     # if we use do_facet <facet> only after the facet added, but
     # currently we use do_facet mds in local.sh
@@ -3362,12 +3398,14 @@ stopall() {
 }
 
 cleanup_echo_devs () {
-    local devs=$($LCTL dl | grep echo | awk '{print $4}')
+       trap 0
+       local dev
+       local devs=$($LCTL dl | grep echo | awk '{print $4}')
 
-    for dev in $devs; do
-        $LCTL --device $dev cleanup
-        $LCTL --device $dev detach
-    done
+       for dev in $devs; do
+               $LCTL --device $dev cleanup
+               $LCTL --device $dev detach
+       done
 }
 
 cleanupall() {
@@ -3546,11 +3584,15 @@ format_ost() {
 formatall() {
        stopall
        # Set hostid for ZFS/SPL zpool import protection
-       do_rpc_nodes "$(comma_list $(remote_nodes_list))" set_hostid
+       # (Assumes MDS version is also OSS version)
+       if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.8.54) ];
+       then
+           do_rpc_nodes "$(comma_list $(remote_nodes_list))" set_hostid
+       fi
 
        # We need ldiskfs here, may as well load them all
        load_modules
-       [ "$CLIENTONLY" ] && return
+       [ -n "$CLIENTONLY" ] && return
        echo Formatting mgs, mds, osts
        if ! combined_mgs_mds ; then
                format_mgs
@@ -3640,21 +3682,19 @@ writeconf_all () {
 }
 
 setupall() {
-    nfs_client_mode && return
+       nfs_client_mode && return
        cifs_client_mode && return
 
-    sanity_mount_check ||
-        error "environments are insane!"
+       sanity_mount_check || error "environments are insane!"
 
-    load_modules
+       load_modules
 
-    if [ -z "$CLIENTONLY" ]; then
-        echo Setup mgs, mdt, osts
-        echo $WRITECONF | grep -q "writeconf" && \
-            writeconf_all
-        if ! combined_mgs_mds ; then
+       if [ -z "$CLIENTONLY" ]; then
+               echo Setup mgs, mdt, osts
+               echo $WRITECONF | grep -q "writeconf" && writeconf_all
+               if ! combined_mgs_mds ; then
                        start mgs $(mgsdevname) $MGS_MOUNT_OPTS
-        fi
+               fi
 
         for num in `seq $MDSCOUNT`; do
             DEVNAME=$(mdsdevname $num)
@@ -3723,7 +3763,7 @@ mounted_lustre_filesystems() {
 }
 
 init_facet_vars () {
-       [ "$CLIENTONLY" ] && return 0
+       [ -n "$CLIENTONLY" ] && return 0
        local facet=$1
        shift
        local device=$1
@@ -3853,9 +3893,12 @@ set_conf_param_and_check() {
 }
 
 init_param_vars () {
-       remote_mds_nodsh ||
-               TIMEOUT=$(do_facet $SINGLEMDS "lctl get_param -n timeout")
+       TIMEOUT=$(lctl get_param -n timeout)
+       TIMEOUT=${TIMEOUT:-20}
 
+       remote_mds_nodsh && log "Using TIMEOUT=$TIMEOUT" && return 0
+
+       TIMEOUT=$(do_facet $SINGLEMDS "lctl get_param -n timeout")
        log "Using TIMEOUT=$TIMEOUT"
 
        osc_ensure_active $SINGLEMDS $TIMEOUT
@@ -3916,14 +3959,14 @@ check_config_client () {
     local mntpt=$1
 
     local mounted=$(mount | grep " $mntpt ")
-    if [ "$CLIENTONLY" ]; then
+    if [ -n "$CLIENTONLY" ]; then
         # bug 18021
         # CLIENTONLY should not depend on *_HOST settings
         local mgc=$($LCTL device_list | awk '/MGC/ {print $4}')
         # in theory someone could create a new,
         # client-only config file that assumed lustre was already
         # configured and didn't set the MGSNID. If MGSNID is not set,
-        # then we should use the mgs nid currently being used 
+        # then we should use the mgs nid currently being used
         # as the default value. bug 18021
         [[ x$MGSNID = x ]] &&
             MGSNID=${mgc//MGC/}
@@ -3938,9 +3981,9 @@ check_config_client () {
         return 0
     fi
 
-    local myMGS_host=$mgs_HOST   
+    local myMGS_host=$mgs_HOST
     if [ "$NETTYPE" = "ptl" ]; then
-        myMGS_host=$(h2ptl $mgs_HOST | sed -e s/@ptl//) 
+        myMGS_host=$(h2ptl $mgs_HOST | sed -e s/@ptl//)
     fi
 
     echo Checking config lustre mounted on $mntpt
@@ -4043,7 +4086,7 @@ check_and_setup_lustre() {
                     restore_mount $MOUNT2
                     export I_MOUNTED2=yes
                 fi
-            fi 
+            fi
 
     # 5.
     # MOUNT is mounted MOUNT2 is not mounted
@@ -4064,7 +4107,7 @@ check_and_setup_lustre() {
         set_default_debug_nodes $(comma_list $(nodes_list))
     fi
 
-       if [ $(lower $OSD_TRACK_DECLARES_LBUG) == 'yes' ] ; then
+       if [ -z "$CLIENTONLY" -a $(lower $OSD_TRACK_DECLARES_LBUG) == 'yes' ]; then
                local facets=""
                [ "$(facet_fstype ost1)" = "ldiskfs" ] &&
                        facets="$(get_facets OST)"
@@ -4084,12 +4127,14 @@ check_and_setup_lustre() {
                set_flavor_all $SEC
        fi
 
-       #Enable remote MDT create for testing
-       for num in $(seq $MDSCOUNT); do
-               do_facet mds$num \
-                       lctl set_param -n mdt.${FSNAME}*.enable_remote_dir=1 \
-                               2>/dev/null
-       done
+       if [ -z "$CLIENTONLY" ]; then
+               # Enable remote MDT create for testing
+               for num in $(seq $MDSCOUNT); do
+                       do_facet mds$num \
+                               lctl set_param -n mdt.${FSNAME}*.enable_remote_dir=1 \
+                                       2>/dev/null
+               done
+       fi
 
        if [ "$ONLY" == "setup" ]; then
                exit 0
@@ -4694,7 +4739,7 @@ debugrestore() {
                true
        DEBUGSAVE=""
 
-       [ -n "DEBUGSAVE_SERVER" ] &&
+       [ -n "$DEBUGSAVE_SERVER" ] &&
                do_nodes $(comma_list $(all_server_nodes)) \
                         "$LCTL set_param debug=\\\"${DEBUGSAVE_SERVER}\\\"" ||
                         true
@@ -4816,6 +4861,18 @@ error_and_remount() {
        exit 1
 }
 
+# Throw an error if it's not running in vm - usually for performance
+# verification
+error_not_in_vm() {
+       local virt=$(running_in_vm)
+       if [[ -n "$virt" ]]; then
+               echo "running in VM '$virt', ignore error"
+               error_ignore env=$virt "$@"
+       else
+               error "$@"
+       fi
+}
+
 skip_env () {
        $FAIL_ON_SKIP_ENV && error false $@ || skip $@
 }
@@ -5009,9 +5066,9 @@ reset_fail_loc () {
 
 
 #
-# Log a message (on all nodes) padded with "=" before and after. 
+# Log a message (on all nodes) padded with "=" before and after.
 # Also appends a timestamp and prepends the testsuite name.
-# 
+#
 
 EQUALS="===================================================================================================="
 banner() {
@@ -5059,7 +5116,7 @@ run_one() {
        cd $SAVE_PWD
        reset_fail_loc
        check_grant ${testnum} || error "check_grant $testnum failed with $?"
-       check_catastrophe || error "LBUG/LASSERT detected"
+       check_node_health
        check_dmesg_for_errors || error "Error in dmesg detected"
        if [ "$PARALLEL" != "yes" ]; then
                ps auxww | grep -v grep | grep -q multiop &&
@@ -5262,15 +5319,15 @@ remote_mds ()
 
 remote_mds_nodsh()
 {
-    [ "$CLIENTONLY" ] && return 0 || true
-    remote_mds && [ "$PDSH" = "no_dsh" -o -z "$PDSH" -o -z "$mds_HOST" ]
+       [ -n "$CLIENTONLY" ] && return 0 || true
+       remote_mds && [ "$PDSH" = "no_dsh" -o -z "$PDSH" -o -z "$mds_HOST" ]
 }
 
 require_dsh_mds()
 {
-        remote_mds_nodsh && echo "SKIP: $TESTSUITE: remote MDS with nodsh" && \
-            MSKIPPED=1 && return 1
-        return 0
+       remote_mds_nodsh && echo "SKIP: $TESTSUITE: remote MDS with nodsh" &&
+               MSKIPPED=1 && return 1
+       return 0
 }
 
 remote_ost ()
@@ -5284,8 +5341,8 @@ remote_ost ()
 
 remote_ost_nodsh()
 {
-    [ "$CLIENTONLY" ] && return 0 || true 
-    remote_ost && [ "$PDSH" = "no_dsh" -o -z "$PDSH" -o -z "$ost_HOST" ]
+       [ -n "$CLIENTONLY" ] && return 0 || true
+       remote_ost && [ "$PDSH" = "no_dsh" -o -z "$PDSH" -o -z "$ost_HOST" ]
 }
 
 require_dsh_ost()
@@ -5297,10 +5354,10 @@ require_dsh_ost()
 
 remote_mgs_nodsh()
 {
-       [ "$CLIENTONLY" ] && return 0 || true
-    local MGS 
-    MGS=$(facet_host mgs)
-    remote_node $MGS && [ "$PDSH" = "no_dsh" -o -z "$PDSH" -o -z "$ost_HOST" ]
+       [ -n "$CLIENTONLY" ] && return 0 || true
+       local MGS
+       MGS=$(facet_host mgs)
+       remote_node $MGS && [ "$PDSH" = "no_dsh" -o -z "$PDSH" -o -z "$ost_HOST" ]
 }
 
 local_mode ()
@@ -5461,14 +5518,14 @@ get_random_entry () {
     rnodes=${rnodes//,/ }
 
     local -a nodes=($rnodes)
-    local num=${#nodes[@]} 
+    local num=${#nodes[@]}
     local i=$((RANDOM * num * 2 / 65536))
 
     echo ${nodes[i]}
 }
 
 client_only () {
-       [ "$CLIENTONLY" ] || [ "$CLIENTMODSONLY" = yes ]
+       [ -n "$CLIENTONLY" ] || [ "x$CLIENTMODSONLY" = "xyes" ]
 }
 
 check_versions () {
@@ -5755,16 +5812,21 @@ restore_lustre_params() {
        done
 }
 
-check_catastrophe() {
+check_node_health() {
        local nodes=${1:-$(comma_list $(nodes_list))}
 
-       do_nodes $nodes "rc=0;
-val=\\\$($LCTL get_param -n catastrophe 2>&1);
-if [[ \\\$? -eq 0 && \\\$val -ne 0 ]]; then
-       echo \\\$(hostname -s): \\\$val;
-       rc=\\\$val;
-fi;
-exit \\\$rc"
+       for node in ${nodes//,/ }; do
+               check_network "$node" 5
+               if [ $? -eq 0 ]; then
+                       do_node $node "rc=0;
+                       val=\\\$($LCTL get_param -n catastrophe 2>&1);
+                       if [[ \\\$? -eq 0 && \\\$val -ne 0 ]]; then
+                               echo \\\$(hostname -s): \\\$val;
+                               rc=\\\$val;
+                       fi;
+                       exit \\\$rc" || error "$node:LBUG/LASSERT detected"
+               fi
+       done
 }
 
 mdsrate_cleanup () {
@@ -6271,7 +6333,7 @@ gather_logs () {
     suffix="$ts.log"
     echo "Dumping lctl log to ${prefix}.*.${suffix}"
 
-    if [ "$CLIENTONLY" -o "$PDSH" == "no_dsh" ]; then
+    if [ -n "$CLIENTONLY" -o "$PDSH" == "no_dsh" ]; then
         echo "Dumping logs only on local client."
         $LCTL dk > ${prefix}.debug_log.$(hostname -s).${suffix}
         dmesg > ${prefix}.dmesg.$(hostname -s).${suffix}
@@ -6908,11 +6970,10 @@ get_obd_size() {
 #
 get_page_size() {
        local facet=$1
-       local size
+       local size=$(getconf PAGE_SIZE 2>/dev/null)
 
-       size=$(do_facet $facet getconf PAGE_SIZE)
-       [[ ${PIPESTATUS[0]} = 0 && -n "$size" ]] || size=4096
-       echo -n $size
+       [ -z "$CLIENTONLY" ] && size=$(do_facet $facet getconf PAGE_SIZE)
+       echo -n ${size:-4096}
 }
 
 #
@@ -6923,20 +6984,20 @@ get_block_count() {
        local device=$2
        local count
 
-       count=$(do_facet $facet "$DUMPE2FS -h $device 2>&1" |
+       [ -z "$CLIENTONLY" ] && count=$(do_facet $facet "$DUMPE2FS -h $device 2>&1" |
                awk '/^Block count:/ {print $3}')
-       echo -n $count
+       echo -n ${count:-0}
 }
 
 # Get the block size of the filesystem.
 get_block_size() {
-    local facet=$1
-    local device=$2
-    local size
+       local facet=$1
+       local device=$2
+       local size
 
-    size=$(do_facet $facet "$DUMPE2FS -h $device 2>&1" |
-           awk '/^Block size:/ {print $3}')
-    echo $size
+       [ -z "$CLIENTONLY" ] && size=$(do_facet $facet "$DUMPE2FS -h $device 2>&1" |
+               awk '/^Block size:/ {print $3}')
+       echo -n ${size:-0}
 }
 
 # Check whether the "large_xattr" feature is enabled or not.