diff options
author | Ned Bass <[email protected]> | 2010-10-18 11:07:20 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2010-10-22 12:41:57 -0700 |
commit | d4055aac3c4fdb6c1b5b1a7b73d20ff716e0a711 (patch) | |
tree | 261457364779062abd590f9f7f36ead40af925ea /scripts | |
parent | 4682b8c14efdeae26808195422a763b896fef037 (diff) |
Add zconfig test for adding and removing vdevs
This test performs a sanity check of the zpool add and remove commands. It
tests adding and removing both a cache disk and a log disk to and from a zpool.
Usage of both a shorthand device path and a full path is covered. The test
uses a scsi_debug device as the disk to be added and removed. This is done so
that zpool will see it as a whole disk and partition it, which it does not
currently done for loopback devices. We want to verify that the manipulation
done to whole disks paths to hide the parition information does not break the
add/remove interface.
Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/zconfig.sh | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/scripts/zconfig.sh b/scripts/zconfig.sh index 7a23d790e..674ec57fd 100755 --- a/scripts/zconfig.sh +++ b/scripts/zconfig.sh @@ -65,6 +65,16 @@ if [ ${CLEANUP} ]; then rm -f /tmp/zpool.cache.* fi +# Check if we need to skip the tests that require scsi_debug and lsscsi. +SCSI_DEBUG=0 +${INFOMOD} scsi_debug &>/dev/null && SCSI_DEBUG=1 +HAVE_LSSCSI=0 +test -f ${LSSCSI} && HAVE_LSSCSI=1 +if [ ${SCSI_DEBUG} -eq 0 ] || [ ${HAVE_LSSCSI} -eq 0 ]; then + echo "Skipping test 10 which requires the scsi_debug " \ + "module and the ${LSSCSI} utility" +fi + zconfig_partition() { local DEVICE=$1 local START=$2 @@ -566,5 +576,96 @@ test_9() { } run_test 9 "zpool events" +zconfig_add_vdev() { + local POOL_NAME=$1 + local TYPE=$2 + local DEVICE=$3 + local TMP_FILE1=`mktemp` + local TMP_FILE2=`mktemp` + local TMP_FILE3=`mktemp` + + BASE_DEVICE=`basename ${DEVICE}` + + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE1} + ${ZPOOL} add -f ${POOL_NAME} ${TYPE} ${DEVICE} 2>/dev/null || return 1 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} + diff ${TMP_FILE1} ${TMP_FILE2} > ${TMP_FILE3} + + [ `wc -l ${TMP_FILE3}|${AWK} '{print $1}'` -eq 3 ] || return 1 + + PARENT_VDEV=`tail -2 ${TMP_FILE3} | head -1 | ${AWK} '{print $NF}'` + case $TYPE in + cache) + [ "${PARENT_VDEV}" = "${TYPE}" ] || return 1 + ;; + log) + [ "${PARENT_VDEV}" = "logs" ] || return 1 + ;; + esac + + if ! tail -1 ${TMP_FILE3} | + egrep -q "^>[[:space:]]+${BASE_DEVICE}[[:space:]]+ONLINE" ; then + return 1 + fi + rm -f ${TMP_FILE1} ${TMP_FILE2} ${TMP_FILE3} + + return 0 +} + +# zpool add and remove sanity check +test_10() { + local POOL_NAME=tank + local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + local TMP_FILE1=`mktemp` + local TMP_FILE2=`mktemp` + + if [ ${SCSI_DEBUG} -eq 0 ] || [ ${HAVE_LSSCSI} -eq 0 ] ; then + skip + return + fi + + test `${LSMOD} | grep -c scsi_debug` -gt 0 && \ + (${RMMOD} scsi_debug || exit 1) + + /sbin/modprobe scsi_debug dev_size_mb=128 || + die "Error $? creating scsi_debug device" + udev_trigger + + SDDEVICE=`${LSSCSI}|${AWK} '/scsi_debug/ { print $6; exit }'` + BASE_SDDEVICE=`basename $SDDEVICE` + + # Create a pool + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE1} || fail 3 + + # Add and remove a cache vdev by full path + zconfig_add_vdev ${POOL_NAME} cache ${SDDEVICE} || fail 4 + ${ZPOOL} remove ${POOL_NAME} ${SDDEVICE} || fail 5 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 6 + cmp ${TMP_FILE1} ${TMP_FILE2} || fail 7 + + # Add and remove a cache vdev by shorthand path + zconfig_add_vdev ${POOL_NAME} cache ${BASE_SDDEVICE} || fail 8 + ${ZPOOL} remove ${POOL_NAME} ${BASE_SDDEVICE} || fail 9 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 10 + cmp ${TMP_FILE1} ${TMP_FILE2} || fail 11 + + # Add and remove a log vdev + zconfig_add_vdev ${POOL_NAME} log ${BASE_SDDEVICE} || fail 12 + ${ZPOOL} remove ${POOL_NAME} ${BASE_SDDEVICE} || fail 13 + ${ZPOOL} status ${POOL_NAME} >${TMP_FILE2} || fail 14 + cmp ${TMP_FILE1} ${TMP_FILE2} || fail 15 + + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 16 + ${ZFS_SH} -u || fail 17 + ${RMMOD} scsi_debug || fail 18 + + rm -f ${TMP_FILE1} ${TMP_FILE2} ${TMP_CACHE} || fail 19 + + pass +} +run_test 10 "zpool add/remove vdev" + exit 0 |