From 8023513a30423a1b3944643466643dfcfc3a91c3 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 10 Aug 2010 10:30:13 -0700 Subject: [PATCH] Add zvol snapshot and clone tests Add two additional basic sanity tests to confirm zvol snapshots and clones work. The snapshot test is basically the same as the example provided in the wiki. The clone test goes one step father and clones the snapshot then modifies it to match the original modified volume. It them compares them to ensure everything was modified as expected. These are just meant to be sanity tests to catch obvious breakage before tagging a release. They are still not a substitute for a full regression test suite. --- scripts/zconfig.sh | 239 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 193 insertions(+), 46 deletions(-) diff --git a/scripts/zconfig.sh b/scripts/zconfig.sh index dc11b9ca60..ba3a8f701a 100755 --- a/scripts/zconfig.sh +++ b/scripts/zconfig.sh @@ -137,47 +137,6 @@ zconfig_test2() { } zconfig_test2 -# ZVOL sanity check -zconfig_test3() { - local POOL_NAME=tank - local ZVOL_NAME=fish - local FULL_NAME=${POOL_NAME}/${ZVOL_NAME} - local SRC_DIR=/bin/ - local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` - - echo -n "test 3 - zvol+ext3 sanity: " - - # Create a pool and volume. - ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 - ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 - ${ZFS} create -V 400M ${FULL_NAME} || fail 3 - - # Partition the volume, for a 400M volume there will be - # 812 cylinders, 16 heads, and 63 sectors per track. - zconfig_partition /dev/${FULL_NAME} 0 812 - - # Format the partition with ext3. - /sbin/mkfs.ext3 -q /dev/${FULL_NAME}1 || fail 5 - - # Mount the ext3 filesystem and copy some data to it. - mkdir -p /tmp/${ZVOL_NAME} || fail 6 - mount /dev/${FULL_NAME}1 /tmp/${ZVOL_NAME} || fail 7 - cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME} || fail 8 - - # Verify the copied files match the original files. - diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}${SRC_DIR} || fail 9 - - # Remove the files, umount, destroy the volume and pool. - rm -Rf /tmp/${ZVOL_NAME}${SRC_DIR}* || fail 10 - umount /tmp/${ZVOL_NAME} || fail 11 - ${ZFS} destroy ${FULL_NAME} || fail 12 - ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 13 - ${ZFS_SH} -u || fail 15 - - pass -} -zconfig_test3 - zconfig_zvol_device_stat() { local EXPECT=$1 local POOL_NAME=/dev/$2 @@ -216,7 +175,7 @@ zconfig_zvol_device_stat() { # zpool import/export device check # (1 volume, 2 partitions, 1 snapshot, 1 clone) -zconfig_test4() { +zconfig_test3() { local POOL_NAME=tank local ZVOL_NAME=volume local SNAP_NAME=snap @@ -226,7 +185,7 @@ zconfig_test4() { local FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME} local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` - echo -n "test 4 - zpool import/export device: " + echo -n "test 3 - zpool import/export device: " # Create a pool, volume, partition, snapshot, and clone. ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 @@ -262,13 +221,14 @@ zconfig_test4() { ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 13 ${ZFS_SH} -u || fail 14 + rm -f ${TMP_CACHE} || fail 15 pass } -zconfig_test4 +zconfig_test3 # zpool insmod/rmmod device check (1 volume, 1 snapshot, 1 clone) -zconfig_test5() { +zconfig_test4() { POOL_NAME=tank ZVOL_NAME=volume SNAP_NAME=snap @@ -278,7 +238,7 @@ zconfig_test5() { FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME} TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` - echo -n "test 5 - zpool insmod/rmmod device: " + echo -n "test 4 - zpool insmod/rmmod device: " # Create a pool, volume, snapshot, and clone ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 @@ -314,9 +274,196 @@ zconfig_test5() { ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} || fail 13 ${ZFS_SH} -u || fail 14 + rm -f ${TMP_CACHE} || fail 15 + + pass +} +zconfig_test4 + +# ZVOL volume sanity check +zconfig_test5() { + local POOL_NAME=tank + local ZVOL_NAME=fish + local FULL_NAME=${POOL_NAME}/${ZVOL_NAME} + local SRC_DIR=/bin/ + local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + + echo -n "test 5 - zvol+ext3 volume: " + + # Create a pool and volume. + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZFS} create -V 400M ${FULL_NAME} || fail 3 + + # Partition the volume, for a 400M volume there will be + # 812 cylinders, 16 heads, and 63 sectors per track. + zconfig_partition /dev/${FULL_NAME} 0 812 + + # Format the partition with ext3. + /sbin/mkfs.ext3 -q /dev/${FULL_NAME}1 || fail 5 + + # Mount the ext3 filesystem and copy some data to it. + mkdir -p /tmp/${ZVOL_NAME}1 || fail 6 + mount /dev/${FULL_NAME}1 /tmp/${ZVOL_NAME}1 || fail 7 + cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME}1 || fail 8 + sync + + # Verify the copied files match the original files. + diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}1${SRC_DIR} &>/dev/null || fail 9 + + # Remove the files, umount, destroy the volume and pool. + rm -Rf /tmp/${ZVOL_NAME}1${SRC_DIR}* || fail 10 + umount /tmp/${ZVOL_NAME}1 || fail 11 + rmdir /tmp/${ZVOL_NAME}1 || fail 12 + + ${ZFS} destroy ${FULL_NAME} || fail 13 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 14 + ${ZFS_SH} -u || fail 15 + rm -f ${TMP_CACHE} || fail 16 pass } zconfig_test5 +# ZVOL snapshot sanity check +zconfig_test6() { + local POOL_NAME=tank + local ZVOL_NAME=fish + local SNAP_NAME=pristine + local FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME} + local FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME} + local SRC_DIR=/bin/ + local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + + echo -n "test 6 - zvol+ext2 snapshot: " + + # Create a pool and volume. + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZFS} create -V 400M ${FULL_ZVOL_NAME} || fail 3 + + # Partition the volume, for a 400M volume there will be + # 812 cylinders, 16 heads, and 63 sectors per track. + zconfig_partition /dev/${FULL_ZVOL_NAME} 0 812 + + # Format the partition with ext2 (no journal). + /sbin/mkfs.ext2 -q /dev/${FULL_ZVOL_NAME}1 || fail 5 + + # Mount the ext3 filesystem and copy some data to it. + mkdir -p /tmp/${ZVOL_NAME}1 || fail 6 + mount /dev/${FULL_ZVOL_NAME}1 /tmp/${ZVOL_NAME}1 || fail 7 + + # Snapshot the pristine ext2 filesystem and mount it read-only. + ${ZFS} snapshot ${FULL_SNAP_NAME} && sleep 1 || fail 8 + mkdir -p /tmp/${SNAP_NAME}1 || fail 9 + mount /dev/${FULL_SNAP_NAME}1 /tmp/${SNAP_NAME}1 &>/dev/null || fail 10 + + # Copy to original volume + cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME}1 || fail 11 + sync + + # Verify the copied files match the original files, + # and the copied files do NOT appear in the snapshot. + diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}1${SRC_DIR} &>/dev/null || fail 12 + diff -ur ${SRC_DIR} /tmp/${SNAP_NAME}1${SRC_DIR} &>/dev/null && fail 13 + + # umount, destroy the snapshot, volume, and pool. + umount /tmp/${SNAP_NAME}1 || fail 14 + rmdir /tmp/${SNAP_NAME}1 || fail 15 + ${ZFS} destroy ${FULL_SNAP_NAME} || fail 16 + + umount /tmp/${ZVOL_NAME}1 || fail 17 + rmdir /tmp/${ZVOL_NAME}1 || fail 18 + ${ZFS} destroy ${FULL_ZVOL_NAME} || fail 19 + + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 20 + ${ZFS_SH} -u || fail 21 + rm -f ${TMP_CACHE} || fail 22 + + pass +} +zconfig_test6 + +# ZVOL clone sanity check +zconfig_test7() { + local POOL_NAME=tank + local ZVOL_NAME=fish + local SNAP_NAME=pristine + local CLONE_NAME=clone + local FULL_ZVOL_NAME=${POOL_NAME}/${ZVOL_NAME} + local FULL_SNAP_NAME=${POOL_NAME}/${ZVOL_NAME}@${SNAP_NAME} + local FULL_CLONE_NAME=${POOL_NAME}/${CLONE_NAME} + local SRC_DIR=/bin/ + local TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX` + + echo -n "test 7 - zvol+ext2 clone: " + + # Create a pool and volume. + ${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || fail 1 + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 || fail 2 + ${ZFS} create -V 400M ${FULL_ZVOL_NAME} || fail 3 + + # Partition the volume, for a 400M volume there will be + # 812 cylinders, 16 heads, and 63 sectors per track. + zconfig_partition /dev/${FULL_ZVOL_NAME} 0 812 + + # Format the partition with ext2 (no journal). + /sbin/mkfs.ext2 -q /dev/${FULL_ZVOL_NAME}1 || fail 5 + + # Mount the ext3 filesystem and copy some data to it. + mkdir -p /tmp/${ZVOL_NAME}1 || fail 6 + mount /dev/${FULL_ZVOL_NAME}1 /tmp/${ZVOL_NAME}1 || fail 7 + + # Snapshot the pristine ext2 filesystem and mount it read-only. + ${ZFS} snapshot ${FULL_SNAP_NAME} && sleep 1 || fail 8 + mkdir -p /tmp/${SNAP_NAME}1 || fail 9 + mount /dev/${FULL_SNAP_NAME}1 /tmp/${SNAP_NAME}1 &>/dev/null || fail 10 + + # Copy to original volume. + cp -RL ${SRC_DIR} /tmp/${ZVOL_NAME}1 || fail 11 + sync + + # Verify the copied files match the original files, + # and the copied files do NOT appear in the snapshot. + diff -ur ${SRC_DIR} /tmp/${ZVOL_NAME}1${SRC_DIR} &>/dev/null || fail 12 + diff -ur ${SRC_DIR} /tmp/${SNAP_NAME}1${SRC_DIR} &>/dev/null && fail 13 + + # Clone from the original pristine snapshot + ${ZFS} clone ${FULL_SNAP_NAME} ${FULL_CLONE_NAME} && sleep 1 || fail 14 + mkdir -p /tmp/${CLONE_NAME}1 || fail 15 + mount /dev/${FULL_CLONE_NAME}1 /tmp/${CLONE_NAME}1 || fail 16 + + # Verify the clone matches the pristine snapshot, + # and the files copied to the original volume are NOT there. + diff -ur /tmp/${SNAP_NAME}1 /tmp/${CLONE_NAME}1 &>/dev/null || fail 17 + diff -ur /tmp/${ZVOL_NAME}1 /tmp/${CLONE_NAME}1 &>/dev/null && fail 18 + + # Copy to cloned volume. + cp -RL ${SRC_DIR} /tmp/${CLONE_NAME}1 || fail 19 + sync + + # Verify the clone matches the modified original volume. + diff -ur /tmp/${ZVOL_NAME}1 /tmp/${CLONE_NAME}1 &>/dev/null || fail 20 + + # umount, destroy the snapshot, volume, and pool. + umount /tmp/${CLONE_NAME}1 || fail 21 + rmdir /tmp/${CLONE_NAME}1 || fail 22 + ${ZFS} destroy ${FULL_CLONE_NAME} || fail 23 + + umount /tmp/${SNAP_NAME}1 || fail 24 + rmdir /tmp/${SNAP_NAME}1 || fail 25 + ${ZFS} destroy ${FULL_SNAP_NAME} || fail 26 + + umount /tmp/${ZVOL_NAME}1 || fail 27 + rmdir /tmp/${ZVOL_NAME}1 || fail 28 + ${ZFS} destroy ${FULL_ZVOL_NAME} || fail 29 + + ${ZPOOL_CREATE_SH} -p ${POOL_NAME} -c lo-raidz2 -d || fail 30 + ${ZFS_SH} -u || fail 31 + rm -f ${TMP_CACHE} || fail 32 + + pass +} +zconfig_test7 + exit 0