X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Ftest-framework.sh;h=95ddf56ba0c3517068de209df404c978e7302bd5;hp=43b17e91cb47e313e5ce8a69d2139590ee25331f;hb=15dd813536ad06a119dfb2358f00281eed22a98b;hpb=85cbe1a3ee6940f7468884bca43cd736a5365694 diff --git a/lustre/tests/test-framework.sh b/lustre/tests/test-framework.sh index 43b17e9..95ddf56 100755 --- a/lustre/tests/test-framework.sh +++ b/lustre/tests/test-framework.sh @@ -54,16 +54,25 @@ fi [ -z "$MODPROBECONF" -a -f /etc/modprobe.conf ] && MODPROBECONF=/etc/modprobe.conf +sanitize_parameters() { + for i in DIR DIR1 DIR2 MOUNT MOUNT1 MOUNT2 + do + local path=${!i} + if [ -d "$path" ]; then + eval export $i=$(echo $path | sed -r 's/\/+$//g') + fi + done +} assert_DIR () { - local failed="" - [[ $DIR/ = $MOUNT/* ]] || \ - { failed=1 && echo "DIR=$DIR not in $MOUNT. Aborting."; } - [[ $DIR1/ = $MOUNT1/* ]] || \ - { failed=1 && echo "DIR1=$DIR1 not in $MOUNT1. Aborting."; } - [[ $DIR2/ = $MOUNT2/* ]] || \ - { failed=1 && echo "DIR2=$DIR2 not in $MOUNT2. Aborting"; } + local failed="" + [[ $DIR/ = $MOUNT/* ]] || + { failed=1 && echo "DIR=$DIR not in $MOUNT. Aborting."; } + [[ $DIR1/ = $MOUNT1/* ]] || + { failed=1 && echo "DIR1=$DIR1 not in $MOUNT1. Aborting."; } + [[ $DIR2/ = $MOUNT2/* ]] || + { failed=1 && echo "DIR2=$DIR2 not in $MOUNT2. Aborting"; } - [ -n "$failed" ] && exit 99 || true + [ -n "$failed" ] && exit 99 || true } usage() { @@ -133,6 +142,7 @@ init_test_env() { export TEST_FAILED=false export FAIL_ON_SKIP_ENV=${FAIL_ON_SKIP_ENV:-false} export RPC_MODE=${RPC_MODE:-false} + export DO_CLEANUP=${DO_CLEANUP:-true} export MKE2FS=$MKE2FS if [ -z "$MKE2FS" ]; then @@ -284,6 +294,8 @@ init_test_env() { export DIR2 export SAVE_PWD=${SAVE_PWD:-$LUSTRE/tests} export AT_MAX_PATH + export LDEV=${LDEV:-"$LUSTRE/scripts/ldev"} + [ ! -f "$LDEV" ] && export LDEV=$(which ldev 2> /dev/null) if [ "$ACCEPTOR_PORT" ]; then export PORT_OPT="--port $ACCEPTOR_PORT" @@ -324,20 +336,20 @@ init_test_env() { export SHUTDOWN_ATTEMPTS=${SHUTDOWN_ATTEMPTS:-3} export OSD_TRACK_DECLARES_LBUG=${OSD_TRACK_DECLARES_LBUG:-"yes"} - # command line + # command line - while getopts "rvwf:" opt $*; do - case $opt in - f) CONFIG=$OPTARG;; - r) REFORMAT=--reformat;; - v) VERBOSE=true;; - w) WRITECONF=writeconf;; - \?) usage;; - esac - done + while getopts "rvwf:" opt $*; do + case $opt in + f) CONFIG=$OPTARG;; + r) REFORMAT=yes;; + v) VERBOSE=true;; + w) WRITECONF=writeconf;; + \?) usage;; + esac + done - shift $((OPTIND - 1)) - ONLY=${ONLY:-$*} + shift $((OPTIND - 1)) + ONLY=${ONLY:-$*} # print the durations of each test if "true" DDETAILS=${DDETAILS:-false} @@ -392,9 +404,7 @@ export LINUX_VERSION_CODE=$(version_code ${LINUX_VERSION//\./ }) lustre_build_version() { local facet=${1:-client} - # lustre: 2.6.52 - # kernel: patchless_client - # build: v2_6_92_0-gadb3ee4-2.6.32-431.29.2.el6_lustre.x86_64 + # lustre: 2.8.52 local VER=$(do_facet $facet $LCTL get_param -n version 2> /dev/null | awk '/lustre: / { print $2 }') # lctl 2.6.50 @@ -560,13 +570,15 @@ load_modules_local() { load_module lov/lov load_module mgc/mgc load_module obdecho/obdecho - if ! client_only; then - SYMLIST=/proc/kallsyms - grep -q crc16 $SYMLIST || { modprobe crc16 2>/dev/null || true; } - grep -q -w jbd $SYMLIST || { modprobe jbd 2>/dev/null || true; } - grep -q -w jbd2 $SYMLIST || { modprobe jbd2 2>/dev/null || true; } + if ! client_only; then + SYMLIST=/proc/kallsyms + grep -q crc16 $SYMLIST || + { modprobe crc16 2>/dev/null || true; } + grep -q -w jbd2 $SYMLIST || + { modprobe jbd2 2>/dev/null || true; } load_module lfsck/lfsck - [ "$LQUOTA" != "no" ] && load_module quota/lquota $LQUOTAOPTS + [ "$LQUOTA" != "no" ] && + load_module quota/lquota $LQUOTAOPTS if [[ $(node_fstypes $HOSTNAME) == *zfs* ]]; then modprobe zfs load_module osd-zfs/osd_zfs @@ -574,6 +586,8 @@ load_modules_local() { if [[ $(node_fstypes $HOSTNAME) == *ldiskfs* ]]; then grep -q exportfs_decode_fh $SYMLIST || { modprobe exportfs 2> /dev/null || true; } + grep -q -w mbcache $SYMLIST || + { modprobe mbcache 2>/dev/null || true; } load_module ../ldiskfs/ldiskfs load_module osd-ldiskfs/osd_ldiskfs fi @@ -585,7 +599,7 @@ load_modules_local() { load_module osp/osp load_module ofd/ofd load_module osp/osp - fi + fi load_module llite/lustre llite_lloop_enabled && load_module llite/llite_lloop @@ -686,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 @@ -817,7 +843,7 @@ facet_type() { facet_number() { local facet=$1 - if [ $facet == mgs ]; then + if [ $facet == mgs ] || [ $facet == client ]; then return 1 fi @@ -964,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 @@ -1135,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() @@ -1177,6 +1216,15 @@ set_default_debug_facet () { set_default_debug_nodes $node } +set_hostid () { + local hostid=${1:-$(hostid)} + + if [ ! -s /etc/hostid ]; then + printf $(echo -n $hostid | + sed 's/\(..\)\(..\)\(..\)\(..\)/\\x\4\\x\3\\x\2\\x\1/') >/etc/hostid + fi +} + # Facet functions mount_facets () { local facets=${1:-$(get_facets)} @@ -1223,6 +1271,8 @@ mount_facet() { local opt=${facet}_opt local mntpt=$(facet_mntpt $facet) local opts="${!opt} $@" + local fstype=$(facet_fstype $facet) + local devicelabel module_loaded lustre || load_modules @@ -1236,6 +1286,16 @@ mount_facet() { import_zpool $facet || return ${PIPESTATUS[0]} fi + case $fstype in + ldiskfs) + devicelabel=$(do_facet ${facet} "$E2LABEL ${!dev}");; + zfs) + devicelabel=$(do_facet ${facet} "$ZFS get -H -o value \ + lustre:svname ${!dev}");; + *) + error "unknown fstype!";; + esac + echo "Starting ${facet}: $opts ${!dev} $mntpt" # for testing LU-482 error handling in mount_facets() and test_0a() if [ -f $TMP/test-lu482-trigger ]; then @@ -1251,6 +1311,11 @@ mount_facet() { return $RC fi + health=$(do_facet ${facet} "$LCTL get_param -n health_check") + if [[ "$health" != "healthy" ]]; then + error "$facet is in a unhealthy state" + fi + set_default_debug_facet $facet if [[ $facet == mds* ]]; then @@ -1261,7 +1326,6 @@ mount_facet() { if [[ $opts =~ .*nosvc.* ]]; then echo "Start ${!dev} without service" else - local fstype=$(facet_fstype $facet) case $fstype in ldiskfs) @@ -1279,6 +1343,12 @@ mount_facet() { esac fi + # commit the device label change to disk + if [[ $devicelabel =~ (:[a-zA-Z]{3}[0-9]{4}) ]]; then + do_facet $facet "sync; sync; sync" + fi + + label=$(devicelabel ${facet} ${!dev}) [ -z "$label" ] && echo no label for ${!dev} && exit 1 eval export ${facet}_svc=${label} @@ -1482,32 +1552,44 @@ setup_quota(){ } zconf_mount() { - local client=$1 - local mnt=$2 - local opts=${3:-$MOUNT_OPTS} - opts=${opts:+-o $opts} - local flags=${4:-$MOUNT_FLAGS} - - local device=$MGSNID:/$FSNAME - if [ -z "$mnt" -o -z "$FSNAME" ]; then - echo Bad zconf mount command: opt=$flags $opts dev=$device mnt=$mnt - exit 1 - fi - - echo "Starting client: $client: $flags $opts $device $mnt" - do_node $client mkdir -p $mnt - do_node $client $MOUNT_CMD $flags $opts $device $mnt || return 1 - - set_default_debug_nodes $client + local client=$1 + local mnt=$2 + local opts=${3:-$MOUNT_OPTS} + opts=${opts:+-o $opts} + local flags=${4:-$MOUNT_FLAGS} + + local device=$MGSNID:/$FSNAME$FILESET + if [ -z "$mnt" -o -z "$FSNAME" ]; then + echo "Bad mount command: opt=$flags $opts dev=$device " \ + "mnt=$mnt" + exit 1 + fi + + echo "Starting client: $client: $flags $opts $device $mnt" + do_node $client mkdir -p $mnt + if [ -n "$FILESET" -a -z "$SKIP_FILESET" ];then + do_node $client $MOUNT_CMD $flags $opts $MGSNID:/$FSNAME \ + $mnt || return 1 + #disable FILESET if not supported + do_nodes $client lctl get_param -n \ + mdc.$FSNAME-MDT0000*.import | grep -q subtree || + device=$MGSNID:/$FSNAME + do_node $client mkdir -p $mnt/$FILESET + do_node $client "! grep -q $mnt' ' /proc/mounts || + umount $mnt" + fi + do_node $client $MOUNT_CMD $flags $opts $device $mnt || return 1 + + set_default_debug_nodes $client - return 0 + return 0 } zconf_umount() { local client=$1 local mnt=$2 local force - local busy + local busy local need_kill [ "$3" ] && force=-f @@ -1548,13 +1630,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 @@ -1590,21 +1672,35 @@ sanity_mount_check () { # mount clients if not mouted zconf_mount_clients() { - local clients=$1 - local mnt=$2 - local opts=${3:-$MOUNT_OPTS} - opts=${opts:+-o $opts} - local flags=${4:-$MOUNT_FLAGS} - - local device=$MGSNID:/$FSNAME - if [ -z "$mnt" -o -z "$FSNAME" ]; then - echo Bad zconf mount command: opt=$flags $opts dev=$device mnt=$mnt - exit 1 - fi - - echo "Starting client $clients: $flags $opts $device $mnt" - - do_nodes $clients " + local clients=$1 + local mnt=$2 + local opts=${3:-$MOUNT_OPTS} + opts=${opts:+-o $opts} + local flags=${4:-$MOUNT_FLAGS} + + local device=$MGSNID:/$FSNAME$FILESET + if [ -z "$mnt" -o -z "$FSNAME" ]; then + echo "Bad conf mount command: opt=$flags $opts dev=$device " \ + "mnt=$mnt" + exit 1 + fi + + echo "Starting client $clients: $flags $opts $device $mnt" + if [ -n "$FILESET" -a ! -n "$SKIP_FILESET" ]; then + do_nodes $clients "! grep -q $mnt' ' /proc/mounts || + umount $mnt" + do_nodes $clients $MOUNT_CMD $flags $opts $MGSNID:/$FSNAME \ + $mnt || return 1 + #disable FILESET if not supported + do_nodes $clients lctl get_param -n \ + mdc.$FSNAME-MDT0000*.import | grep -q subtree || + device=$MGSNID:/$FSNAME + do_nodes $clients mkdir -p $mnt/$FILESET + do_nodes $clients "! grep -q $mnt' ' /proc/mounts || + umount $mnt" + fi + + do_nodes $clients " running=\\\$(mount | grep -c $mnt' '); rc=0; if [ \\\$running -eq 0 ] ; then @@ -1614,12 +1710,12 @@ if [ \\\$running -eq 0 ] ; then fi; exit \\\$rc" || return ${PIPESTATUS[0]} - echo "Started clients $clients: " - do_nodes $clients "mount | grep $mnt' '" + echo "Started clients $clients: " + do_nodes $clients "mount | grep $mnt' '" - set_default_debug_nodes $clients + set_default_debug_nodes $clients - return 0 + return 0 } zconf_umount_clients() { @@ -1662,7 +1758,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 } @@ -2356,16 +2452,17 @@ client_evicted() { } client_reconnect_try() { - uname -n >> $MOUNT/recon - if [ -z "$CLIENTS" ]; then - df $MOUNT; uname -n >> $MOUNT/recon - else - do_nodes $CLIENTS "df $MOUNT; uname -n >> $MOUNT/recon" > /dev/null - fi - echo Connected clients: - cat $MOUNT/recon - ls -l $MOUNT/recon > /dev/null - rm $MOUNT/recon + local f=$MOUNT/recon + + uname -n >> $f + if [ -z "$CLIENTS" ]; then + $LFS df $MOUNT; uname -n >> $f + else + do_nodes $CLIENTS "$LFS df $MOUNT; uname -n >> $f" > /dev/null + fi + echo "Connected clients: $(cat $f)" + ls -l $f > /dev/null + rm $f } client_reconnect() { @@ -2460,7 +2557,7 @@ obd_name() { replay_barrier() { local facet=$1 do_facet $facet "sync; sync; sync" - df $MOUNT + $LFS df $MOUNT # make sure there will be no seq change local clients=${CLIENTS:-$HOSTNAME} @@ -2545,7 +2642,7 @@ fail() { facet_failover $* || error "failover: $?" wait_clients_import_state "$clients" "$facets" FULL - clients_up || error "post-failover df: $?" + clients_up || error "post-failover stat: $?" } fail_nodf() { @@ -2559,8 +2656,8 @@ fail_abort() { change_active $facet wait_for_facet $facet mount_facet $facet -o abort_recovery - clients_up || echo "first df failed: $?" - clients_up || error "post-failover df: $?" + clients_up || echo "first stat failed: $?" + clients_up || error "post-failover stat: $?" } do_lmc() { @@ -3167,7 +3264,7 @@ facet_mntpt () { [[ $facet = mgs ]] && combined_mgs_mds && facet="mds1" local var=${facet}_MOUNT - eval mntpt=${!var:-${MOUNT%/*}/$facet} + eval mntpt=${!var:-${MOUNT}-$facet} echo -n $mntpt } @@ -3175,7 +3272,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 @@ -3187,7 +3284,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 } @@ -3199,7 +3296,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 @@ -3222,7 +3319,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} @@ -3238,16 +3335,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 } ######## @@ -3267,7 +3366,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 only after the facet added, but # currently we use do_facet mds in local.sh @@ -3290,12 +3390,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() { @@ -3356,7 +3458,6 @@ mkfs_opts() { opts+=${LDLM_TIMEOUT:+" --param=sys.ldlm_timeout=$LDLM_TIMEOUT"} if [ $type == MDS ]; then - opts+=${SECLEVEL:+" --param=mdt.sec_level"} opts+=${MDSCAPA:+" --param-mdt.capa=$MDSCAPA"} opts+=${STRIPE_BYTES:+" --param=lov.stripesize=$STRIPE_BYTES"} opts+=${STRIPES_PER_OBJ:+" --param=lov.stripecount=$STRIPES_PER_OBJ"} @@ -3380,7 +3481,6 @@ mkfs_opts() { fi if [ $type == OST ]; then - opts+=${SECLEVEL:+" --param=ost.sec_level"} opts+=${OSSCAPA:+" --param=ost.capa=$OSSCAPA"} if [ $fstype == ldiskfs ]; then @@ -3475,9 +3575,16 @@ format_ost() { formatall() { stopall + # Set hostid for ZFS/SPL zpool import protection + # (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 @@ -3567,21 +3674,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) @@ -3650,7 +3755,7 @@ mounted_lustre_filesystems() { } init_facet_vars () { - [ "$CLIENTONLY" ] && return 0 + [ -n "$CLIENTONLY" ] && return 0 local facet=$1 shift local device=$1 @@ -3775,14 +3880,17 @@ set_conf_param_and_check() { do_facet mgs "$LCTL conf_param $PARAM='$FINAL'" || error "conf_param $PARAM failed" - wait_update $(facet_host $myfacet) "$TEST" "$FINAL" || + wait_update_facet $myfacet "$TEST" "$FINAL" || error "check $PARAM failed!" } 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 @@ -3843,14 +3951,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/} @@ -3865,9 +3973,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 @@ -3932,21 +4040,22 @@ is_empty_fs() { } check_and_setup_lustre() { - nfs_client_mode && return + sanitize_parameters + nfs_client_mode && return cifs_client_mode && return - local MOUNTED=$(mounted_lustre_filesystems) - - local do_check=true - # 1. - # both MOUNT and MOUNT2 are not mounted - if ! is_mounted $MOUNT && ! is_mounted $MOUNT2; then - [ "$REFORMAT" ] && formatall - # setupall mounts both MOUNT and MOUNT2 (if MOUNT_2 is set) - setupall - is_mounted $MOUNT || error "NAME=$NAME not mounted" - export I_MOUNTED=yes - do_check=false + local MOUNTED=$(mounted_lustre_filesystems) + + local do_check=true + # 1. + # both MOUNT and MOUNT2 are not mounted + if ! is_mounted $MOUNT && ! is_mounted $MOUNT2; then + [ "$REFORMAT" = "yes" ] && formatall + # setupall mounts both MOUNT and MOUNT2 (if MOUNT_2 is set) + setupall + is_mounted $MOUNT || error "NAME=$NAME not mounted" + export I_MOUNTED=yes + do_check=false # 2. # MOUNT2 is mounted elif is_mounted $MOUNT2; then @@ -3969,7 +4078,7 @@ check_and_setup_lustre() { restore_mount $MOUNT2 export I_MOUNTED2=yes fi - fi + fi # 5. # MOUNT is mounted MOUNT2 is not mounted @@ -3990,7 +4099,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)" @@ -4010,12 +4119,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 @@ -4234,8 +4345,12 @@ check_and_cleanup_lustre() { fi if is_mounted $MOUNT; then - [ -n "$DIR" ] && rm -rf $DIR/[Rdfs][0-9]* || - error "remove sub-test dirs failed" + if $DO_CLEANUP; then + [ -n "$DIR" ] && rm -rf $DIR/[Rdfs][0-9]* || + error "remove sub-test dirs failed" + else + echo "skip cleanup" + fi [ "$ENABLE_QUOTA" ] && restore_quota || true fi @@ -4558,7 +4673,8 @@ clear_failloc() { } set_nodes_failloc () { - do_nodes $(comma_list $1) lctl set_param fail_val=0 fail_loc=$2 + local fv=${3:-0} + do_nodes $(comma_list $1) lctl set_param fail_val=$fv fail_loc=$2 } cancel_lru_locks() { @@ -4605,13 +4721,21 @@ pgcache_empty() { } debugsave() { - DEBUGSAVE="$(lctl get_param -n debug)" + DEBUGSAVE="$(lctl get_param -n debug)" + DEBUGSAVE_SERVER=$(do_facet $SINGLEMDS "$LCTL get_param -n debug") } debugrestore() { - [ -n "$DEBUGSAVE" ] && \ - do_nodes $(comma_list $(nodes_list)) "$LCTL set_param debug=\\\"${DEBUGSAVE}\\\";" - DEBUGSAVE="" + [ -n "$DEBUGSAVE" ] && + do_nodes $CLIENTS "$LCTL set_param debug=\\\"${DEBUGSAVE}\\\""|| + true + DEBUGSAVE="" + + [ -n "DEBUGSAVE_SERVER" ] && + do_nodes $(comma_list $(all_server_nodes)) \ + "$LCTL set_param debug=\\\"${DEBUGSAVE_SERVER}\\\"" || + true + DEBUGSAVE_SERVER="" } debug_size_save() { @@ -4642,20 +4766,17 @@ stop_full_debug_logging() { # prints bash call stack print_stack_trace() { + local skip=${1:-1} echo " Trace dump:" - for (( i=1; i < ${#BASH_LINENO[*]} ; i++ )) ; do - local s=${BASH_SOURCE[$i]} - local l=${BASH_LINENO[$i-1]} - local f=${FUNCNAME[$i]} - echo " = $s:$l:$f()" + for (( i=$skip; i < ${#BASH_LINENO[*]} ; i++ )) ; do + local src=${BASH_SOURCE[$i]} + local lineno=${BASH_LINENO[$i-1]} + local funcname=${FUNCNAME[$i]} + echo " = $src:$lineno:$funcname()" done } -################################## -# Test interface -################################## - -error_noexit() { +report_error() { local TYPE=${TYPE:-"FAIL"} local dump=true @@ -4665,10 +4786,8 @@ error_noexit() { dump=false fi - log " ${TESTSUITE} ${TESTNAME}: @@@@@@ ${TYPE}: $@ " - print_stack_trace >&2 - + (print_stack_trace 2) >&2 mkdir -p $LOGDIR # We need to dump the logs on all nodes if $dump; then @@ -4687,6 +4806,17 @@ error_noexit() { echo "$@" > $LOGDIR/err fi fi + + # cleanup the env for failed tests + reset_fail_loc +} + +################################## +# Test interface +################################## + +error_noexit() { + report_error "$@" } exit_status () { @@ -4698,12 +4828,13 @@ exit_status () { } error() { - error_noexit "$@" + report_error "$@" exit 1 } error_exit() { - error "$@" + report_error "$@" + exit 1 } # use only if we are ignoring failures for this test, bugno required. @@ -4713,15 +4844,27 @@ error_exit() { error_ignore() { local TYPE="IGNORE ($1)" shift - error_noexit "$@" + report_error "$@" } error_and_remount() { - error_noexit "$@" + report_error "$@" remount_client $MOUNT 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 $@ } @@ -4907,17 +5050,17 @@ check_mds() { } reset_fail_loc () { - echo -n "Resetting fail_loc on all nodes..." - do_nodes $(comma_list $(nodes_list)) "lctl set_param -n fail_loc=0 \ - fail_val=0 2>/dev/null || true" - echo done. + echo -n "Resetting fail_loc on all nodes..." + do_nodes $(comma_list $(nodes_list)) "lctl set_param -n fail_loc=0 \ + fail_val=0 2>/dev/null" || true + echo done. } # -# 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() { @@ -4929,6 +5072,18 @@ banner() { log "$msg== $(date +"%H:%M:%S (%s)")" } +check_dmesg_for_errors() { + local res + local errors="VFS: Busy inodes after unmount of\|\ +ldiskfs_check_descriptors: Checksum for group 0 failed\|\ +group descriptors corrupted" + + res=$(do_nodes $(comma_list $(nodes_list)) "dmesg" | grep "$errors") + [ -z "$res" ] && return 0 + echo "Kernel error detected: $res" + return 1 +} + # # Run a single test function and cleanup after it. # @@ -4944,12 +5099,17 @@ run_one() { local SAVE_UMASK=`umask` umask 0022 + if ! grep -q $DIR /proc/mounts; then + $SETUP + fi + banner "test $testnum: $message" test_${testnum} || error "test_$testnum failed with $?" cd $SAVE_PWD reset_fail_loc check_grant ${testnum} || error "check_grant $testnum failed with $?" check_catastrophe || error "LBUG/LASSERT detected" + check_dmesg_for_errors || error "Error in dmesg detected" if [ "$PARALLEL" != "yes" ]; then ps auxww | grep -v grep | grep -q multiop && error "multiop still running" @@ -4958,6 +5118,7 @@ run_one() { unset tdir unset tfile umask $SAVE_UMASK + $CLEANUP return 0 } @@ -5150,15 +5311,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 () @@ -5172,8 +5333,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() @@ -5185,10 +5346,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 () @@ -5349,19 +5510,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 ] -} - -is_patchless () -{ - lctl get_param version | grep -q patchless + [ -n "$CLIENTONLY" ] || [ "x$CLIENTMODSONLY" = "xyes" ] } check_versions () { @@ -6070,19 +6226,21 @@ create_pool() { } add_pool_to_list () { - local fsname=${1%%.*} - local poolname=${1##$fsname.} + local fsname=${1%%.*} + local poolname=${1##$fsname.} - local listvar=${fsname}_CREATED_POOLS - eval export ${listvar}=$(expand_list ${!listvar} $poolname) + local listvar=${fsname}_CREATED_POOLS + local temp=${listvar}=$(expand_list ${!listvar} $poolname) + eval export $temp } remove_pool_from_list () { - local fsname=${1%%.*} - local poolname=${1##$fsname.} + local fsname=${1%%.*} + local poolname=${1##$fsname.} - local listvar=${fsname}_CREATED_POOLS - eval export ${listvar}=$(exclude_items_from_list ${!listvar} $poolname) + local listvar=${fsname}_CREATED_POOLS + local temp=${listvar}=$(exclude_items_from_list ${!listvar} $poolname) + eval export $temp } destroy_pool_int() { @@ -6162,7 +6320,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} @@ -6568,29 +6726,36 @@ check_write_access() { } init_logging() { - if [[ -n $YAML_LOG ]]; then - return - fi - local SAVE_UMASK=`umask` - umask 0000 - - export YAML_LOG=${LOGDIR}/results.yml - mkdir -p $LOGDIR - init_clients_lists - - if [ ! -f $YAML_LOG ]; then # If the yaml log already exists then we will just append to it - if check_shared_dir $LOGDIR; then - touch $LOGDIR/shared - echo "Logging to shared log directory: $LOGDIR" - else - echo "Logging to local directory: $LOGDIR" - fi + [[ -n $YAML_LOG ]] && return + local save_umask=$(umask) + umask 0000 - yml_nodes_file $LOGDIR >> $YAML_LOG - yml_results_file >> $YAML_LOG - fi + export YAML_LOG=${LOGDIR}/results.yml + mkdir -p $LOGDIR + init_clients_lists + + # If the yaml log already exists then we will just append to it + if [ ! -f $YAML_LOG ]; then + if check_shared_dir $LOGDIR; then + touch $LOGDIR/shared + echo "Logging to shared log directory: $LOGDIR" + else + echo "Logging to local directory: $LOGDIR" + fi + + yml_nodes_file $LOGDIR >> $YAML_LOG + yml_results_file >> $YAML_LOG + fi - umask $SAVE_UMASK + umask $save_umask + + # If modules are not yet loaded then older "lctl lustre_build_version" + # will fail. Use lctl build version instead. + log "Client: $($LCTL lustre_build_version)" + log "MDS: $(do_facet $SINGLEMDS $LCTL lustre_build_version 2>/dev/null|| + do_facet $SINGLEMDS $LCTL --version)" + log "OSS: $(do_facet ost1 $LCTL lustre_build_version 2> /dev/null || + do_facet ost1 $LCTL --version)" } log_test() { @@ -6792,11 +6957,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} } # @@ -6807,20 +6971,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.