From b8cc3fdb09783d582dfc7d3ad6cb6cd7b5bcd671 Mon Sep 17 00:00:00 2001 From: Willem Jan Withagen Date: Fri, 17 Aug 2018 16:46:32 +0200 Subject: [PATCH] test/rbd: Improve/update rbd-ggate * check if geom_gate can be loaded before doing the actual tests Otherwise continuing does not make sense. Major reason for this problem is due to mismatch between kernel and module versions. * After FreeBSD kernevel 1200078 ggate resizing is possible So set the flag that resizing can be tested * Only sudo commands that really need sudo rbd-ggate list is available in regular user mode * be a bit more verbose during testing and list the test purpose * list-mapped is an option in rbd-nbd, not (yet) in rbd-ggate Signed-off-by: Willem Jan Withagen --- qa/workunits/rbd/rbd-ggate.sh | 75 ++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/qa/workunits/rbd/rbd-ggate.sh b/qa/workunits/rbd/rbd-ggate.sh index 1c4e504a4d270..8e5ce3aaaf030 100755 --- a/qa/workunits/rbd/rbd-ggate.sh +++ b/qa/workunits/rbd/rbd-ggate.sh @@ -15,6 +15,10 @@ else exit 1 fi +if [ `uname -K` -ge 1200078 ] ; then + RBD_GGATE_RESIZE_SUPPORTED=1 +fi + _sudo() { local cmd @@ -32,6 +36,20 @@ _sudo() sudo -nE "${cmd}" "$@" } +check_geom_gate() +{ + # See if geom_date is load, or can be loaded. + # Otherwise the tests can not run + if ! kldstat -q -n geom_gate ; then + # See if we can load it + if ! _sudo kldload geom_gate ; then + echo Not able to load geom_gate + echo check /var/log/messages as to why + exit 1 + fi + fi +} + setup() { if [ -e CMakeCache.txt ]; then @@ -50,6 +68,7 @@ setup() fi _sudo echo test sudo + check_geom_gate trap cleanup INT TERM EXIT TEMPDIR=`mktemp -d` @@ -81,7 +100,7 @@ expect_false() setup -# exit status test +echo exit status test expect_false rbd-ggate expect_false rbd-ggate INVALIDCMD if [ `id -u` -ne 0 ] @@ -90,36 +109,36 @@ then fi expect_false _sudo rbd-ggate map INVALIDIMAGE -# map test using the first unused device +echo map test using the first unused device DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}` -_sudo rbd-ggate list | grep " ${DEV} *$" +rbd-ggate list | grep " ${DEV} *$" -# map test specifying the device +echo map test specifying the device expect_false _sudo rbd-ggate --device ${DEV} map ${POOL}/${IMAGE} dev1=${DEV} _sudo rbd-ggate unmap ${DEV} -_sudo rbd-ggate list | expect_false grep " ${DEV} *$" +rbd-ggate list | expect_false grep " ${DEV} *$" DEV= # XXX: race possible when the device is reused by other process DEV=`_sudo rbd-ggate --device ${dev1} map ${POOL}/${IMAGE}` [ "${DEV}" = "${dev1}" ] -_sudo rbd-ggate list | grep " ${DEV} *$" +rbd-ggate list | grep " ${DEV} *$" -# list format test +echo list format test expect_false _sudo rbd-ggate --format INVALID list -_sudo rbd-ggate --format json --pretty-format list -_sudo rbd-ggate --format xml list +rbd-ggate --format json --pretty-format list +rbd-ggate --format xml list -# read test +echo read test [ "`dd if=${DATA} bs=1M | md5`" = "`_sudo dd if=${DEV} bs=1M | md5`" ] -# write test +echo write test dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE} _sudo dd if=${DATA} of=${DEV} bs=1M _sudo sync [ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ] -# trim test +echo trim test provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` used=`rbd -p ${POOL} --format xml du ${IMAGE} | @@ -133,18 +152,20 @@ used=`rbd -p ${POOL} --format xml du ${IMAGE} | $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .` [ "${used}" -lt "${provisioned}" ] -# resize test +echo resize test devname=$(basename ${DEV}) size=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}') test -n "${size}" rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M rbd info ${POOL}/${IMAGE} if [ -z "$RBD_GGATE_RESIZE_SUPPORTED" ]; then - # XXX: ggate device resize is not supported by vanila kernel. - # rbd-ggate should terminate when detecting resize. - _sudo rbd-ggate list | expect_false grep " ${DEV} *$" + # when resizing is not supported: + # resizing the underlying image for a GEOM ggate will stop the + # ggate process servicing the device. So we can resize and test + # the disappearance of the device + rbd-ggate list | expect_false grep " ${DEV} *$" else - _sudo rbd-ggate list | grep " ${DEV} *$" + rbd-ggate list | grep " ${DEV} *$" size2=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}') test -n "${size2}" test ${size2} -eq $((size * 2)) @@ -163,19 +184,19 @@ else fi DEV= -# read-only option test +echo read-only option test DEV=`_sudo rbd-ggate map --read-only ${POOL}/${IMAGE}` devname=$(basename ${DEV}) -_sudo rbd-ggate list | grep " ${DEV} *$" +rbd-ggate list | grep " ${DEV} *$" access=$(geom gate list ${devname} | awk '$1 == "access:" {print $2}') test "${access}" = "read-only" _sudo dd if=${DEV} of=/dev/null bs=1M expect_false _sudo dd if=${DATA} of=${DEV} bs=1M _sudo rbd-ggate unmap ${DEV} -# exclusive option test +echo exclusive option test DEV=`_sudo rbd-ggate map --exclusive ${POOL}/${IMAGE}` -_sudo rbd-ggate list | grep " ${DEV} *$" +rbd-ggate list | grep " ${DEV} *$" _sudo dd if=${DATA} of=${DEV} bs=1M _sudo sync expect_false timeout 10 \ @@ -184,19 +205,19 @@ _sudo rbd-ggate unmap ${DEV} DEV= rbd bench -p ${POOL} ${IMAGE} --io-type=write --io-size=1024 --io-total=1024 -# unmap by image name test +echo unmap by image name test DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}` -_sudo rbd-ggate list | grep " ${DEV} *$" +rbd-ggate list | grep " ${DEV} *$" _sudo rbd-ggate unmap "${POOL}/${IMAGE}" -rbd-ggate list-mapped | expect_false grep " ${DEV} *$" +rbd-ggate list | expect_false grep " ${DEV} *$" DEV= -# map/unmap snap test +echo map/unmap snap test rbd snap create ${POOL}/${IMAGE}@snap DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}@snap` -_sudo rbd-ggate list | grep " ${DEV} *$" +rbd-ggate list | grep " ${DEV} *$" _sudo rbd-ggate unmap "${POOL}/${IMAGE}@snap" -rbd-ggate list-mapped | expect_false grep " ${DEV} *$" +rbd-ggate list | expect_false grep " ${DEV} *$" DEV= echo OK -- 2.39.5