mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 10:01:01 +03:00
Add auto-online test for ZED/FMA as part of the ZTS
Automated auto-online test to go along with ZED FMA integration (PR 4673) auto_online_001.pos works with real devices (sd- and mpath) and with non-real block devices (loop) by adding a scsi_debug device to the pool Note: In order for test group to run, ZED must not currently be running. Kernel 3.16.37 or higher needed for scsi_debug to work properly If timeout occurs on test using a scsi_debug device (error noticed on Ubuntu system), a reboot might be needed in order for test to pass. (more investigation into this) Also suppressed output from is_real_device/is_loop_device/is_mpath_device - was making the log file very cluttered with useless error messages "ie /dev/mapper/sdc is not a block device" from previous patch Reviewed-by: Don Brady <don.brady@intel.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: David Quigley <david.quigley@intel.com> Signed-off-by: Sydney Vanda <sydney.m.vanda@intel.com> Closes #5774
This commit is contained in:
parent
4859fe796c
commit
ec0e24c232
@ -108,6 +108,9 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_COMMANDS_LINUX], [
|
|||||||
AC_PATH_TOOL(IOSTAT, iostat, "")
|
AC_PATH_TOOL(IOSTAT, iostat, "")
|
||||||
AC_PATH_TOOL(LOCKFS, lsof, "")
|
AC_PATH_TOOL(LOCKFS, lsof, "")
|
||||||
AC_PATH_TOOL(LSBLK, lsblk, "")
|
AC_PATH_TOOL(LSBLK, lsblk, "")
|
||||||
|
AC_PATH_TOOL(LSMOD, lsmod, "")
|
||||||
|
AC_PATH_TOOL(LSSCSI, lsscsi, "")
|
||||||
|
AC_PATH_TOOL(MODLOAD, modprobe, "")
|
||||||
AC_PATH_TOOL(MODUNLOAD, rmmod, "")
|
AC_PATH_TOOL(MODUNLOAD, rmmod, "")
|
||||||
AC_PATH_TOOL(MPSTAT, mpstat, "")
|
AC_PATH_TOOL(MPSTAT, mpstat, "")
|
||||||
AC_PATH_TOOL(NEWFS, mke2fs, "")
|
AC_PATH_TOOL(NEWFS, mke2fs, "")
|
||||||
|
@ -235,6 +235,7 @@ AC_CONFIG_FILES([
|
|||||||
tests/zfs-tests/tests/functional/delegate/Makefile
|
tests/zfs-tests/tests/functional/delegate/Makefile
|
||||||
tests/zfs-tests/tests/functional/devices/Makefile
|
tests/zfs-tests/tests/functional/devices/Makefile
|
||||||
tests/zfs-tests/tests/functional/exec/Makefile
|
tests/zfs-tests/tests/functional/exec/Makefile
|
||||||
|
tests/zfs-tests/tests/functional/fault/Makefile
|
||||||
tests/zfs-tests/tests/functional/features/async_destroy/Makefile
|
tests/zfs-tests/tests/functional/features/async_destroy/Makefile
|
||||||
tests/zfs-tests/tests/functional/features/large_dnode/Makefile
|
tests/zfs-tests/tests/functional/features/large_dnode/Makefile
|
||||||
tests/zfs-tests/tests/functional/features/Makefile
|
tests/zfs-tests/tests/functional/features/Makefile
|
||||||
|
@ -409,6 +409,9 @@ tests = ['devices_003_pos']
|
|||||||
[tests/functional/exec]
|
[tests/functional/exec]
|
||||||
tests = ['exec_001_pos']
|
tests = ['exec_001_pos']
|
||||||
|
|
||||||
|
[tests/functional/fault]
|
||||||
|
tests = ['auto_online_001_pos']
|
||||||
|
|
||||||
[tests/functional/features/async_destroy]
|
[tests/functional/features/async_destroy]
|
||||||
tests = ['async_destroy_001_pos']
|
tests = ['async_destroy_001_pos']
|
||||||
|
|
||||||
|
@ -56,12 +56,15 @@ export LOFIADM="@LOFIADM@"
|
|||||||
export LOGNAME="@LOGNAME@"
|
export LOGNAME="@LOGNAME@"
|
||||||
export LS="@LS@"
|
export LS="@LS@"
|
||||||
export LSBLK="@LSBLK@"
|
export LSBLK="@LSBLK@"
|
||||||
|
export LSMOD="@LSMOD@"
|
||||||
|
export LSSCSI="@LSSCSI@"
|
||||||
export MD5SUM="@MD5SUM@"
|
export MD5SUM="@MD5SUM@"
|
||||||
export MKDIR="@MKDIR@"
|
export MKDIR="@MKDIR@"
|
||||||
export MKNOD="@MKNOD@"
|
export MKNOD="@MKNOD@"
|
||||||
export MKTEMP="@MKTEMP@"
|
export MKTEMP="@MKTEMP@"
|
||||||
export MNTTAB="@MNTTAB@"
|
export MNTTAB="@MNTTAB@"
|
||||||
export MODINFO="@MODINFO@"
|
export MODINFO="@MODINFO@"
|
||||||
|
export MODLOAD="@MODLOAD@"
|
||||||
export MODUNLOAD="@MODUNLOAD@"
|
export MODUNLOAD="@MODUNLOAD@"
|
||||||
export MOUNT="@MOUNT@"
|
export MOUNT="@MOUNT@"
|
||||||
export MPSTAT="@MPSTAT@"
|
export MPSTAT="@MPSTAT@"
|
||||||
|
@ -34,6 +34,10 @@
|
|||||||
# Common paths
|
# Common paths
|
||||||
bindir=@bindir@
|
bindir=@bindir@
|
||||||
sbindir=@sbindir@
|
sbindir=@sbindir@
|
||||||
|
etcdir=@sysconfdir@
|
||||||
|
|
||||||
|
# ZFS Directories
|
||||||
|
export ZEDLETDIR=${ZEDLETDIR:-${etcdir}/zfs/zed.d}
|
||||||
|
|
||||||
# ZFS Commands
|
# ZFS Commands
|
||||||
export ZDB=${ZDB:-${sbindir}/zdb}
|
export ZDB=${ZDB:-${sbindir}/zdb}
|
||||||
@ -47,6 +51,7 @@ export RAIDZ_TEST=${RAIDZ_TEST:-${bindir}/raidz_test}
|
|||||||
export ARC_SUMMARY=${ARC_SUMMARY:-${bindir}/arc_summary.py}
|
export ARC_SUMMARY=${ARC_SUMMARY:-${bindir}/arc_summary.py}
|
||||||
export ARCSTAT=${ARCSTAT:-${bindir}/arcstat.py}
|
export ARCSTAT=${ARCSTAT:-${bindir}/arcstat.py}
|
||||||
export DBUFSTAT=${DBUFSTAT:-${bindir}/dbufstat.py}
|
export DBUFSTAT=${DBUFSTAT:-${bindir}/dbufstat.py}
|
||||||
|
export ZED=${ZED:-${sbindir}/zed}
|
||||||
|
|
||||||
. $STF_SUITE/include/libtest.shlib
|
. $STF_SUITE/include/libtest.shlib
|
||||||
|
|
||||||
|
@ -1645,22 +1645,144 @@ function reexport_pool
|
|||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Verify a given disk is online or offline
|
# Verify a given disk or pool state
|
||||||
#
|
#
|
||||||
# Return 0 is pool/disk matches expected state, 1 otherwise
|
# Return 0 is pool/disk matches expected state, 1 otherwise
|
||||||
#
|
#
|
||||||
function check_state # pool disk state{online,offline}
|
function check_state # pool disk state{online,offline,degraded}
|
||||||
{
|
{
|
||||||
typeset pool=$1
|
typeset pool=$1
|
||||||
typeset disk=${2#$DEV_DSKDIR/}
|
typeset disk=${2#$DEV_DSKDIR/}
|
||||||
typeset state=$3
|
typeset state=$3
|
||||||
|
|
||||||
$ZPOOL status -v $pool | grep "$disk" \
|
[[ -z $pool ]] || [[ -z $state ]] \
|
||||||
| grep -i "$state" > /dev/null 2>&1
|
&& log_fail "Arguments invalid or missing"
|
||||||
|
|
||||||
|
if [[ -z $disk ]]; then
|
||||||
|
#check pool state only
|
||||||
|
$ZPOOL get -H -o value health $pool \
|
||||||
|
| grep -i "$state" > /dev/null 2>&1
|
||||||
|
else
|
||||||
|
$ZPOOL status -v $pool | grep "$disk" \
|
||||||
|
| grep -i "$state" > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
return $?
|
return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Cause a scan of all scsi host adapters by default
|
||||||
|
#
|
||||||
|
# $1 optional host number
|
||||||
|
#
|
||||||
|
function scan_scsi_hosts
|
||||||
|
{
|
||||||
|
typeset hostnum=${1}
|
||||||
|
|
||||||
|
if [[ -z $hostnum ]]; then
|
||||||
|
for host in /sys/class/scsi_host/host*; do
|
||||||
|
echo '- - -' > $host/scan
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "/sys/class/scsi_host/host$hostnum/scan"
|
||||||
|
echo '- - -' > "/sys/class/scsi_host/host$hostnum/scan"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Wait for newly created block devices to have their minors created.
|
||||||
|
#
|
||||||
|
function block_device_wait
|
||||||
|
{
|
||||||
|
if is_linux; then
|
||||||
|
$UDEVADM trigger
|
||||||
|
$UDEVADM settle
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Online or offline a disk on the system
|
||||||
|
#
|
||||||
|
# First checks state of disk. Test will fail if disk is not properly onlined
|
||||||
|
# or offlined. Online is a full rescan of SCSI disks by echoing to every
|
||||||
|
# host entry.
|
||||||
|
#
|
||||||
|
function on_off_disk # disk state{online,offline} host
|
||||||
|
{
|
||||||
|
typeset disk=$1
|
||||||
|
typeset state=$2
|
||||||
|
typeset host=$3
|
||||||
|
|
||||||
|
[[ -z $disk ]] || [[ -z $state ]] && \
|
||||||
|
log_fail "Arguments invalid or missing"
|
||||||
|
|
||||||
|
if is_linux; then
|
||||||
|
if [[ $state == "offline" ]] && ( is_mpath_device $disk ); then
|
||||||
|
dm_name="$($READLINK $DEV_DSKDIR/$disk \
|
||||||
|
| $NAWK -F / '{print $2}')"
|
||||||
|
slave="$($LS /sys/block/${dm_name}/slaves \
|
||||||
|
| $NAWK '{print $1}')"
|
||||||
|
while [[ -n $slave ]]; do
|
||||||
|
#check if disk is online
|
||||||
|
$LSSCSI | $EGREP $slave > /dev/null
|
||||||
|
if (($? == 0)); then
|
||||||
|
slave_dir="/sys/block/${dm_name}"
|
||||||
|
slave_dir+="/slaves/${slave}/device"
|
||||||
|
ss="${slave_dir}/state"
|
||||||
|
sd="${slave_dir}/delete"
|
||||||
|
log_must eval "$ECHO 'offline' > ${ss}"
|
||||||
|
log_must eval "$ECHO '1' > ${sd}"
|
||||||
|
$LSSCSI | $EGREP $slave > /dev/null
|
||||||
|
if (($? == 0)); then
|
||||||
|
log_fail "Offlining" \
|
||||||
|
"$disk failed"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
slave="$($LS /sys/block/$dm_name/slaves \
|
||||||
|
2>/dev/null | $NAWK '{print $1}')"
|
||||||
|
done
|
||||||
|
elif [[ $state == "offline" ]] && ( is_real_device $disk ); then
|
||||||
|
#check if disk is online
|
||||||
|
$LSSCSI | $EGREP $disk > /dev/null
|
||||||
|
if (($? == 0)); then
|
||||||
|
dev_state="/sys/block/$disk/device/state"
|
||||||
|
dev_delete="/sys/block/$disk/device/delete"
|
||||||
|
log_must eval "$ECHO 'offline' > ${dev_state}"
|
||||||
|
log_must eval "$ECHO '1' > ${dev_delete}"
|
||||||
|
$LSSCSI | $EGREP $disk > /dev/null
|
||||||
|
if (($? == 0)); then
|
||||||
|
log_fail "Offlining $disk" \
|
||||||
|
"failed"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_note "$disk is already offline"
|
||||||
|
fi
|
||||||
|
elif [[ $state == "online" ]]; then
|
||||||
|
#force a full rescan
|
||||||
|
log_must scan_scsi_hosts $host
|
||||||
|
block_device_wait
|
||||||
|
if is_mpath_device $disk; then
|
||||||
|
dm_name="$($READLINK $DEV_DSKDIR/$disk \
|
||||||
|
| $NAWK -F / '{print $2}')"
|
||||||
|
slave="$($LS /sys/block/$dm_name/slaves \
|
||||||
|
| $NAWK '{print $1}')"
|
||||||
|
$LSSCSI | $EGREP $slave > /dev/null
|
||||||
|
if (($? != 0)); then
|
||||||
|
log_fail "Onlining $disk failed"
|
||||||
|
fi
|
||||||
|
elif is_real_device $disk; then
|
||||||
|
$LSSCSI | $EGREP $disk > /dev/null
|
||||||
|
if (($? != 0)); then
|
||||||
|
log_fail "Onlining $disk failed"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_fail "$disk is not a real dev"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_fail "$disk failed to $state"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Get the mountpoint of snapshot
|
# Get the mountpoint of snapshot
|
||||||
# For the snapshot use <mp_filesystem>/.zfs/snapshot/<snap>
|
# For the snapshot use <mp_filesystem>/.zfs/snapshot/<snap>
|
||||||
@ -2754,7 +2876,8 @@ function is_real_device #disk
|
|||||||
[[ -z $disk ]] && log_fail "No argument for disk given."
|
[[ -z $disk ]] && log_fail "No argument for disk given."
|
||||||
|
|
||||||
if is_linux; then
|
if is_linux; then
|
||||||
$LSBLK $DEV_RDSKDIR/$disk -o TYPE | $EGREP disk > /dev/null 2>&1
|
($LSBLK $DEV_RDSKDIR/$disk -o TYPE | $EGREP disk > /dev/null) \
|
||||||
|
2>/dev/null
|
||||||
return $?
|
return $?
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -2768,7 +2891,8 @@ function is_loop_device #disk
|
|||||||
[[ -z $disk ]] && log_fail "No argument for disk given."
|
[[ -z $disk ]] && log_fail "No argument for disk given."
|
||||||
|
|
||||||
if is_linux; then
|
if is_linux; then
|
||||||
$LSBLK $DEV_RDSKDIR/$disk -o TYPE | $EGREP loop > /dev/null 2>&1
|
($LSBLK $DEV_RDSKDIR/$disk -o TYPE | $EGREP loop > /dev/null) \
|
||||||
|
2>/dev/null
|
||||||
return $?
|
return $?
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -2784,7 +2908,8 @@ function is_mpath_device #disk
|
|||||||
[[ -z $disk ]] && log_fail "No argument for disk given."
|
[[ -z $disk ]] && log_fail "No argument for disk given."
|
||||||
|
|
||||||
if is_linux; then
|
if is_linux; then
|
||||||
$LSBLK $DEV_MPATHDIR/$disk -o TYPE | $EGREP mpath > /dev/null 2>&1
|
($LSBLK $DEV_MPATHDIR/$disk -o TYPE | $EGREP mpath >/dev/null) \
|
||||||
|
2>/dev/null
|
||||||
if (($? == 0)); then
|
if (($? == 0)); then
|
||||||
$READLINK $DEV_MPATHDIR/$disk > /dev/null 2>&1
|
$READLINK $DEV_MPATHDIR/$disk > /dev/null 2>&1
|
||||||
return $?
|
return $?
|
||||||
@ -2807,11 +2932,13 @@ function set_slice_prefix
|
|||||||
if is_linux; then
|
if is_linux; then
|
||||||
while (( i < $DISK_ARRAY_NUM )); do
|
while (( i < $DISK_ARRAY_NUM )); do
|
||||||
disk="$($ECHO $DISKS | $NAWK '{print $(i + 1)}')"
|
disk="$($ECHO $DISKS | $NAWK '{print $(i + 1)}')"
|
||||||
if ( is_mpath_device $disk ) && [[ -z $($ECHO $disk | awk 'substr($1,18,1)\
|
if ( is_mpath_device $disk ) && [[ -z $($ECHO $disk \
|
||||||
~ /^[[:digit:]]+$/') ]] || ( is_real_device $disk ); then
|
| awk 'substr($1,18,1) ~ /^[[:digit:]]+$/') ]] || \
|
||||||
|
( is_real_device $disk ); then
|
||||||
export SLICE_PREFIX=""
|
export SLICE_PREFIX=""
|
||||||
return 0
|
return 0
|
||||||
elif ( is_mpath_device $disk || is_loop_device $disk ); then
|
elif ( is_mpath_device $disk || is_loop_device \
|
||||||
|
$disk ); then
|
||||||
export SLICE_PREFIX="p"
|
export SLICE_PREFIX="p"
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
@ -2872,6 +2999,34 @@ function get_device_dir #device
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Get persistent name for given disk
|
||||||
|
#
|
||||||
|
function get_persistent_disk_name #device
|
||||||
|
{
|
||||||
|
typeset device=$1
|
||||||
|
typeset dev_id
|
||||||
|
|
||||||
|
if is_linux; then
|
||||||
|
if is_real_device $device; then
|
||||||
|
dev_id="$($UDEVADM info -q all -n $DEV_DSKDIR/$device \
|
||||||
|
| $EGREP disk/by-id | $NAWK '{print $2; exit}' \
|
||||||
|
| $NAWK -F / '{print $3}')"
|
||||||
|
$ECHO $dev_id
|
||||||
|
elif is_mpath_device $device; then
|
||||||
|
dev_id="$($UDEVADM info -q all -n $DEV_DSKDIR/$device \
|
||||||
|
| $EGREP disk/by-id/dm-uuid \
|
||||||
|
| $NAWK '{print $2; exit}' \
|
||||||
|
| $NAWK -F / '{print $3}')"
|
||||||
|
$ECHO $dev_id
|
||||||
|
else
|
||||||
|
$ECHO $device
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
$ECHO $device
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Get the package name
|
# Get the package name
|
||||||
#
|
#
|
||||||
@ -3028,17 +3183,6 @@ function get_min
|
|||||||
echo $min
|
echo $min
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
|
||||||
# Wait for newly created block devices to have their minors created.
|
|
||||||
#
|
|
||||||
function block_device_wait
|
|
||||||
{
|
|
||||||
if is_linux; then
|
|
||||||
$UDEVADM trigger
|
|
||||||
$UDEVADM settle
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Synchronize all the data in pool
|
# Synchronize all the data in pool
|
||||||
#
|
#
|
||||||
|
@ -15,6 +15,7 @@ SUBDIRS = \
|
|||||||
delegate \
|
delegate \
|
||||||
devices \
|
devices \
|
||||||
exec \
|
exec \
|
||||||
|
fault \
|
||||||
features \
|
features \
|
||||||
grow_pool \
|
grow_pool \
|
||||||
grow_replicas \
|
grow_replicas \
|
||||||
|
6
tests/zfs-tests/tests/functional/fault/Makefile.am
Normal file
6
tests/zfs-tests/tests/functional/fault/Makefile.am
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/fault
|
||||||
|
dist_pkgdata_SCRIPTS = \
|
||||||
|
fault.cfg \
|
||||||
|
setup.ksh \
|
||||||
|
cleanup.ksh \
|
||||||
|
auto_online_001_pos.ksh
|
142
tests/zfs-tests/tests/functional/fault/auto_online_001_pos.ksh
Executable file
142
tests/zfs-tests/tests/functional/fault/auto_online_001_pos.ksh
Executable file
@ -0,0 +1,142 @@
|
|||||||
|
#!/bin/ksh -p
|
||||||
|
#
|
||||||
|
# CDDL HEADER START
|
||||||
|
#
|
||||||
|
# The contents of this file are subject to the terms of the
|
||||||
|
# Common Development and Distribution License (the "License").
|
||||||
|
# You may not use this file except in compliance with the License.
|
||||||
|
#
|
||||||
|
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
# or http://www.opensolaris.org/os/licensing.
|
||||||
|
# See the License for the specific language governing permissions
|
||||||
|
# and limitations under the License.
|
||||||
|
#
|
||||||
|
# When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
# If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
#
|
||||||
|
# CDDL HEADER END
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 by Intel Corporation. All rights reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
. $STF_SUITE/include/libtest.shlib
|
||||||
|
. $STF_SUITE/tests/functional/fault/fault.cfg
|
||||||
|
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Tesing auto-online FMA ZED logic.
|
||||||
|
#
|
||||||
|
# STRATEGY:
|
||||||
|
# 1. Create a pool
|
||||||
|
# 2. export a pool
|
||||||
|
# 3. offline disk
|
||||||
|
# 4. import pool with missing disk
|
||||||
|
# 5. online disk
|
||||||
|
# 6. ZED polls for an event change for online disk to be automatically
|
||||||
|
# added back to the pool.
|
||||||
|
# 7. Creates a raidz1 zpool using persistent disk path names
|
||||||
|
# (ie not /dev/sdc).
|
||||||
|
# 8. Tests import using pool guid and cache file.
|
||||||
|
#
|
||||||
|
# If loop devices are used, then a scsi_debug device is added to the pool.
|
||||||
|
#
|
||||||
|
verify_runnable "both"
|
||||||
|
|
||||||
|
if ! is_physical_device $DISKS; then
|
||||||
|
log_unsupported "Unsupported disks for this test."
|
||||||
|
fi
|
||||||
|
|
||||||
|
function cleanup
|
||||||
|
{
|
||||||
|
#online last disk before fail
|
||||||
|
on_off_disk $offline_disk "online"
|
||||||
|
poolexists $TESTPOOL && destroy_pool $TESTPOOL
|
||||||
|
}
|
||||||
|
|
||||||
|
log_assert "Testing auto-online FMA ZED logic"
|
||||||
|
|
||||||
|
log_onexit cleanup
|
||||||
|
|
||||||
|
target=$TESTPOOL
|
||||||
|
|
||||||
|
if is_loop_device $DISK1; then
|
||||||
|
SD=$($LSSCSI | $NAWK '/scsi_debug/ {print $6; exit}')
|
||||||
|
SDDEVICE=$($ECHO $SD | $NAWK -F / '{print $3}')
|
||||||
|
SDDEVICE_ID=$(get_persistent_disk_name $SDDEVICE)
|
||||||
|
autoonline_disks="$SDDEVICE"
|
||||||
|
else
|
||||||
|
autoonline_disks="$DISK1 $DISK2 $DISK3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clear disk labels
|
||||||
|
for i in {0..2}
|
||||||
|
do
|
||||||
|
log_must $ZPOOL labelclear -f /dev/disk/by-id/"${devs_id[i]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
if is_loop_device $DISK1; then
|
||||||
|
#create a pool with one scsi_debug device and 3 loop devices
|
||||||
|
log_must $ZPOOL create -f $TESTPOOL raidz1 $SDDEVICE_ID $DISK1 \
|
||||||
|
$DISK2 $DISK3
|
||||||
|
elif ( is_real_device $DISK1 || is_mpath_device $DISK1 ); then
|
||||||
|
log_must $ZPOOL create -f $TESTPOOL raidz1 ${devs_id[0]} \
|
||||||
|
${devs_id[1]} ${devs_id[2]}
|
||||||
|
else
|
||||||
|
log_fail "Disks are not supported for this test"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#add some data to the pool
|
||||||
|
log_must $MKFILE $FSIZE /$TESTPOOL/data
|
||||||
|
|
||||||
|
#pool guid import
|
||||||
|
typeset guid=$(get_config $TESTPOOL pool_guid)
|
||||||
|
if (( RANDOM % 2 == 0 )) ; then
|
||||||
|
target=$guid
|
||||||
|
fi
|
||||||
|
|
||||||
|
for offline_disk in $autoonline_disks
|
||||||
|
do
|
||||||
|
log_must $ZPOOL export -F $TESTPOOL
|
||||||
|
|
||||||
|
host=$($LS /sys/block/$offline_disk/device/scsi_device | $NAWK -F : '{ print $1}')
|
||||||
|
#offline disk
|
||||||
|
on_off_disk $offline_disk "offline"
|
||||||
|
|
||||||
|
#reimport pool with drive missing
|
||||||
|
log_must $ZPOOL import $target
|
||||||
|
check_state $TESTPOOL "" "degraded"
|
||||||
|
if (($? != 0)); then
|
||||||
|
log_fail "$TESTPOOL is not degraded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#online disk
|
||||||
|
on_off_disk $offline_disk "online" $host
|
||||||
|
|
||||||
|
log_note "Delay for ZED auto-online"
|
||||||
|
typeset -i timeout=0
|
||||||
|
$CAT ${ZEDLET_DIR}/zedlog | \
|
||||||
|
$EGREP "zfs_iter_vdev: matched devid" > /dev/null
|
||||||
|
while (($? != 0)); do
|
||||||
|
if ((timeout == $MAXTIMEOUT)); then
|
||||||
|
log_fail "Timeout occured"
|
||||||
|
fi
|
||||||
|
((timeout++))
|
||||||
|
$SLEEP 1
|
||||||
|
$CAT ${ZEDLET_DIR}/zedlog | \
|
||||||
|
$EGREP "zfs_iter_vdev: matched devid" > /dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
check_state $TESTPOOL "" "online"
|
||||||
|
if (($? != 0)); then
|
||||||
|
log_fail "$TESTPOOL is not back online"
|
||||||
|
fi
|
||||||
|
$SLEEP 2
|
||||||
|
done
|
||||||
|
log_must $ZPOOL destroy $TESTPOOL
|
||||||
|
|
||||||
|
|
||||||
|
log_pass "Auto-online test successful"
|
58
tests/zfs-tests/tests/functional/fault/cleanup.ksh
Executable file
58
tests/zfs-tests/tests/functional/fault/cleanup.ksh
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/ksh -p
|
||||||
|
#
|
||||||
|
# CDDL HEADER START
|
||||||
|
#
|
||||||
|
# The contents of this file are subject to the terms of the
|
||||||
|
# Common Development and Distribution License (the "License").
|
||||||
|
# You may not use this file except in compliance with the License.
|
||||||
|
#
|
||||||
|
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
# or http://www.opensolaris.org/os/licensing.
|
||||||
|
# See the License for the specific language governing permissions
|
||||||
|
# and limitations under the License.
|
||||||
|
#
|
||||||
|
# When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
# If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
#
|
||||||
|
# CDDL HEADER END
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 by Intel Corporation. All rights reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
. $STF_SUITE/include/libtest.shlib
|
||||||
|
. $STF_SUITE/tests/functional/fault/fault.cfg
|
||||||
|
|
||||||
|
verify_runnable "global"
|
||||||
|
|
||||||
|
cleanup_devices $DISKS
|
||||||
|
|
||||||
|
if [[ -f ${ZEDLET_DIR}/zed.pid ]]; then
|
||||||
|
zedpid=$($CAT ${ZEDLET_DIR}/zed.pid)
|
||||||
|
log_must $KILL $zedpid
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_must $RM ${ZEDLET_DIR}/all-syslog.sh
|
||||||
|
log_must $RM ${ZEDLET_DIR}/zed.pid
|
||||||
|
log_must $RM ${ZEDLET_DIR}/zedlog
|
||||||
|
log_must $RM ${ZEDLET_DIR}/state
|
||||||
|
log_must $RMDIR $ZEDLET_DIR
|
||||||
|
|
||||||
|
if is_loop_device $DISK1; then
|
||||||
|
SD=$($LSSCSI | $NAWK '/scsi_debug/ {print $6; exit}')
|
||||||
|
SDDEVICE=$($ECHO $SD | $NAWK -F / '{print $3}')
|
||||||
|
|
||||||
|
if [[ -z $SDDEVICE ]]; then
|
||||||
|
log_pass
|
||||||
|
fi
|
||||||
|
#offline disk
|
||||||
|
on_off_disk $SDDEVICE "offline"
|
||||||
|
block_device_wait
|
||||||
|
|
||||||
|
log_must $MODUNLOAD scsi_debug
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_pass
|
50
tests/zfs-tests/tests/functional/fault/fault.cfg
Normal file
50
tests/zfs-tests/tests/functional/fault/fault.cfg
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/bin/ksh -p
|
||||||
|
#
|
||||||
|
# CDDL HEADER START
|
||||||
|
#
|
||||||
|
# The contents of this file are subject to the terms of the
|
||||||
|
# Common Development and Distribution License (the "License").
|
||||||
|
# You may not use this file except in compliance with the License.
|
||||||
|
#
|
||||||
|
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
# or http://www.opensolaris.org/os/licensing.
|
||||||
|
# See the License for the specific language governing permissions
|
||||||
|
# and limitations under the License.
|
||||||
|
#
|
||||||
|
# When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
# If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
#
|
||||||
|
# CDDL HEADER END
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 by Intel Corporation. All rights reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
. $STF_SUITE/include/libtest.shlib
|
||||||
|
|
||||||
|
verify_runnable "global"
|
||||||
|
|
||||||
|
export DISK_ARRAY_NUM=$($ECHO ${DISKS} | $NAWK '{print NF}')
|
||||||
|
export DISKSARRAY=$DISKS
|
||||||
|
export FSIZE=10M
|
||||||
|
export MAXTIMEOUT=20
|
||||||
|
|
||||||
|
export DISK1=$($ECHO $DISKS | $NAWK '{print $1}')
|
||||||
|
export DISK2=$($ECHO $DISKS | $NAWK '{print $2}')
|
||||||
|
export DISK3=$($ECHO $DISKS | $NAWK '{print $3}')
|
||||||
|
|
||||||
|
export ZEDLET_DIR=/var/tmp/zed
|
||||||
|
|
||||||
|
if is_linux; then
|
||||||
|
set_slice_prefix
|
||||||
|
set_device_dir
|
||||||
|
devs_id[0]=$(get_persistent_disk_name $DISK1)
|
||||||
|
devs_id[1]=$(get_persistent_disk_name $DISK2)
|
||||||
|
devs_id[2]=$(get_persistent_disk_name $DISK3)
|
||||||
|
export devs_id
|
||||||
|
else
|
||||||
|
DEV_DSKDIR="/dev"
|
||||||
|
fi
|
85
tests/zfs-tests/tests/functional/fault/setup.ksh
Executable file
85
tests/zfs-tests/tests/functional/fault/setup.ksh
Executable file
@ -0,0 +1,85 @@
|
|||||||
|
#!/bin/ksh -p
|
||||||
|
#
|
||||||
|
# CDDL HEADER START
|
||||||
|
#
|
||||||
|
# The contents of this file are subject to the terms of the
|
||||||
|
# Common Development and Distribution License (the "License").
|
||||||
|
# You may not use this file except in compliance with the License.
|
||||||
|
#
|
||||||
|
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
# or http://www.opensolaris.org/os/licensing.
|
||||||
|
# See the License for the specific language governing permissions
|
||||||
|
# and limitations under the License.
|
||||||
|
#
|
||||||
|
# When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
# If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
# fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
# information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
#
|
||||||
|
# CDDL HEADER END
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 by Intel Corporation. All rights reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
. $STF_SUITE/include/libtest.shlib
|
||||||
|
. $STF_SUITE/tests/functional/fault/fault.cfg
|
||||||
|
|
||||||
|
typeset SDSIZE=256
|
||||||
|
typeset SDHOSTS=1
|
||||||
|
typeset SDTGTS=1
|
||||||
|
typeset SDLUNS=1
|
||||||
|
|
||||||
|
[[ -z $UDEVADM ]] && log_fail "Missing UDEVADM command"
|
||||||
|
[[ -z $NAWK ]] && log_fail "Missing NAWK command"
|
||||||
|
[[ -z $EGREP ]] && log_fail "Missing EGREP command"
|
||||||
|
[[ -z $LSSCSI ]] && log_fail "Missing LSSCSI command"
|
||||||
|
[[ -z $MODUNLOAD ]] && log_fail "Missing MODUNLOAD command"
|
||||||
|
[[ -z $PGREP ]] && log_fail "Missing PGREP command"
|
||||||
|
|
||||||
|
verify_runnable "global"
|
||||||
|
if [[ ! -d /var/tmp/zed ]]; then
|
||||||
|
log_must $MKDIR /var/tmp/zed
|
||||||
|
fi
|
||||||
|
|
||||||
|
modprobe -n scsi_debug
|
||||||
|
if (($? != 0)); then
|
||||||
|
log_unsupported "Platform does not have scsi_debug module"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify the ZED is not already running.
|
||||||
|
$PGREP -x zed > /dev/null
|
||||||
|
if (($? == 0)); then
|
||||||
|
log_fail "ZED already running"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_must $CP ${ZEDLETDIR}/all-syslog.sh $ZEDLET_DIR
|
||||||
|
|
||||||
|
log_note "Starting ZED"
|
||||||
|
#run ZED in the background and redirect foreground logging output to zedlog
|
||||||
|
log_must eval "$ZED -vF -d $ZEDLET_DIR -p $ZEDLET_DIR/zed.pid -s" \
|
||||||
|
"$ZEDLET_DIR/state 2>${ZEDLET_DIR}/zedlog &"
|
||||||
|
|
||||||
|
#if using loop devices, create a scsi_debug device to be used with
|
||||||
|
#auto-online test
|
||||||
|
if is_loop_device $DISK1; then
|
||||||
|
$LSMOD | $EGREP scsi_debug > /dev/zero
|
||||||
|
if (($? == 0)); then
|
||||||
|
log_fail "SCSI_DEBUG module already installed"
|
||||||
|
else
|
||||||
|
log_must $MODLOAD scsi_debug dev_size_mb=$SDSIZE \
|
||||||
|
add_host=$SDHOSTS num_tgts=$SDTGTS max_luns=$SDLUNS
|
||||||
|
block_device_wait
|
||||||
|
$LSSCSI | $EGREP scsi_debug > /dev/null
|
||||||
|
if (($? == 1)); then
|
||||||
|
log_fail "scsi_debug failed"
|
||||||
|
else
|
||||||
|
SDDEVICE=$($LSSCSI \
|
||||||
|
| $NAWK '/scsi_debug/ {print $6; exit}')
|
||||||
|
log_must $FORMAT -s $SDDEVICE mklabel gpt
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_pass
|
@ -20,6 +20,7 @@ export ETCDIR=${SRCDIR}/etc
|
|||||||
export TESTSDIR=${SRCDIR}/tests
|
export TESTSDIR=${SRCDIR}/tests
|
||||||
export RUNFILEDIR=${TESTSDIR}/runfiles
|
export RUNFILEDIR=${TESTSDIR}/runfiles
|
||||||
export UDEVRULEDIR=${BUILDDIR}/udev/rules.d
|
export UDEVRULEDIR=${BUILDDIR}/udev/rules.d
|
||||||
|
export ZEDLETDIR=${SRCDIR}/cmd/zed/zed.d
|
||||||
|
|
||||||
export ZDB=${CMDDIR}/zdb/zdb
|
export ZDB=${CMDDIR}/zdb/zdb
|
||||||
export ZFS=${CMDDIR}/zfs/zfs
|
export ZFS=${CMDDIR}/zfs/zfs
|
||||||
@ -32,6 +33,7 @@ export RAIDZ_TEST=${CMDDIR}/raidz_test/raidz_test
|
|||||||
export ARC_SUMMARY=${CMDDIR}/arc_summary/arc_summary.py
|
export ARC_SUMMARY=${CMDDIR}/arc_summary/arc_summary.py
|
||||||
export ARCSTAT=${CMDDIR}/arcstat/arcstat.py
|
export ARCSTAT=${CMDDIR}/arcstat/arcstat.py
|
||||||
export DBUFSTAT=${CMDDIR}/dbufstat/dbufstat.py
|
export DBUFSTAT=${CMDDIR}/dbufstat/dbufstat.py
|
||||||
|
export ZED=${CMDDIR}/zed/zed
|
||||||
|
|
||||||
export COMMON_SH=${SCRIPTDIR}/common.sh
|
export COMMON_SH=${SCRIPTDIR}/common.sh
|
||||||
export ZFS_SH=${SCRIPTDIR}/zfs.sh
|
export ZFS_SH=${SCRIPTDIR}/zfs.sh
|
||||||
|
Loading…
Reference in New Issue
Block a user