summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2017-10-07 23:08:36 +0000
committerngie <ngie@FreeBSD.org>2017-10-07 23:08:36 +0000
commit69e2b054a0c102a23f780a27664753e0ff1bc048 (patch)
treef0b5156398390a73d96ebfda72fd188f79b5ddde /tests
parentf24f481feb165f26804daaf8263b427585f59d21 (diff)
downloadFreeBSD-src-69e2b054a0c102a23f780a27664753e0ff1bc048.zip
FreeBSD-src-69e2b054a0c102a23f780a27664753e0ff1bc048.tar.gz
MFC r317713:
r317713 (by markj): Add regression tests for r317712 and r306743.
Diffstat (limited to 'tests')
-rwxr-xr-xtests/sys/geom/class/mirror/8_test.sh53
-rwxr-xr-xtests/sys/geom/class/mirror/9_test.sh62
-rw-r--r--tests/sys/geom/class/mirror/Makefile2
3 files changed, 117 insertions, 0 deletions
diff --git a/tests/sys/geom/class/mirror/8_test.sh b/tests/sys/geom/class/mirror/8_test.sh
new file mode 100755
index 0000000..9eefc9d
--- /dev/null
+++ b/tests/sys/geom/class/mirror/8_test.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+# $FreeBSD$
+
+# Regression test for r317712.
+
+. `dirname $0`/conf.sh
+
+echo 1..1
+
+ddbs=2048
+m1=`mktemp $base.XXXXXX` || exit 1
+m2=`mktemp $base.XXXXXX` || exit 1
+
+dd if=/dev/zero of=$m1 bs=$ddbs count=1024 >/dev/null 2>&1
+dd if=/dev/zero of=$m2 bs=$ddbs count=1024 >/dev/null 2>&1
+
+us0=$(mdconfig -t vnode -f $m1) || exit 1
+us1=$(mdconfig -t vnode -f $m2) || exit 1
+
+gmirror label $name /dev/$us0 /dev/$us1 || exit 1
+devwait
+
+# Ensure that the mirrors are marked dirty, and then disconnect them.
+# We need to have the gmirror provider open when destroying the MDs since
+# gmirror will automatically mark the mirrors clean when the provider is closed.
+exec 9>/dev/mirror/$name
+dd if=/dev/zero bs=$ddbs count=1 >&9 2>/dev/null
+mdconfig -d -u ${us0#md} -o force || exit 1
+mdconfig -d -u ${us1#md} -o force || exit 1
+exec 9>&-
+
+dd if=/dev/random of=$m1 bs=$ddbs count=1 conv=notrunc >/dev/null 2>&1
+us0=$(attach_md -t vnode -f $m1) || exit 1
+devwait # This will take kern.geom.mirror.timeout seconds.
+
+# Re-attach the second mirror and wait for it to synchronize.
+us1=$(attach_md -t vnode -f $m2) || exit 1
+while [ $(gmirror status $name | grep ACTIVE | wc -l) -ne 2 ]; do
+ sleep 1
+done
+
+# Verify the two mirrors are identical. Destroy the gmirror first so that
+# the mirror metadata is wiped; otherwise the metadata blocks will fail
+# the comparison. It would be nice to do this with a "gmirror verify"
+# command instead.
+gmirror destroy $name
+if cmp -s ${m1} ${m2}; then
+ echo "ok 1"
+else
+ echo "not ok 1"
+fi
+
+rm -f $m1 $m2
diff --git a/tests/sys/geom/class/mirror/9_test.sh b/tests/sys/geom/class/mirror/9_test.sh
new file mode 100755
index 0000000..072499f
--- /dev/null
+++ b/tests/sys/geom/class/mirror/9_test.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+# $FreeBSD$
+
+# Regression test for r306743.
+
+. `dirname $0`/conf.sh
+
+echo 1..1
+
+ddbs=2048
+m1=`mktemp $base.XXXXXX` || exit 1
+m2=`mktemp $base.XXXXXX` || exit 1
+m3=`mktemp $base.XXXXXX` || exit 1
+
+dd if=/dev/zero of=$m1 bs=$ddbs count=1024 >/dev/null 2>&1
+dd if=/dev/zero of=$m2 bs=$ddbs count=1024 >/dev/null 2>&1
+dd if=/dev/zero of=$m3 bs=$ddbs count=1024 >/dev/null 2>&1
+
+us0=$(attach_md -t vnode -f $m1) || exit 1
+us1=$(attach_md -t vnode -f $m2) || exit 1
+us2=$(attach_md -t vnode -f $m3) || exit 1
+
+gmirror label $name /dev/$us0 /dev/$us1 || exit 1
+devwait
+
+# Break one of the mirrors by forcing a single metadata write error.
+# When dd closes the mirror provider, gmirror will attempt to mark the mirrors
+# clean, and will kick one of the mirrors out upon hitting the error.
+sysctl debug.fail_point.g_mirror_metadata_write='1*return(5)' || exit 1
+dd if=/dev/random of=/dev/mirror/$name bs=$ddbs count=1 >/dev/null 2>&1
+sysctl debug.fail_point.g_mirror_metadata_write='off' || exit 1
+
+# Replace the broken mirror, and then stop the gmirror.
+gmirror forget $name || exit 1
+gmirror insert $name /dev/$us2 || exit 1
+while [ $(gmirror status $name | grep ACTIVE | wc -l) -ne 2 ]; do
+ sleep 1
+done
+gmirror stop $name || exit 1
+
+# Restart the gmirror on the original two mirrors. One of them is broken,
+# so we should end up with a degraded gmirror.
+gmirror activate $name /dev/$us0 /dev/$us1 || exit 1
+devwait
+dd if=/dev/random of=/dev/mirror/$name bs=$ddbs count=1 >/dev/null 2>&1
+
+# Re-add the replacement mirror and verify the two mirrors are synchronized.
+# Destroy the gmirror first so that the mirror metadata is wiped; otherwise
+# the metadata blocks will fail the comparison. It would be nice to do this
+# with a "gmirror verify" command instead.
+gmirror activate $name /dev/$us2 || exit 1
+while [ $(gmirror status $name | grep ACTIVE | wc -l) -ne 2 ]; do
+ sleep 1
+done
+gmirror destroy $name || exit 1
+if cmp -s $m1 $m3; then
+ echo "ok 1"
+else
+ echo "not ok 1"
+fi
+
+rm -f $m1 $m2 $m3
diff --git a/tests/sys/geom/class/mirror/Makefile b/tests/sys/geom/class/mirror/Makefile
index 2665631..66f9249 100644
--- a/tests/sys/geom/class/mirror/Makefile
+++ b/tests/sys/geom/class/mirror/Makefile
@@ -11,6 +11,8 @@ TAP_TESTS_SH+= 4_test
TAP_TESTS_SH+= 5_test
TAP_TESTS_SH+= 6_test
TAP_TESTS_SH+= 7_test
+TAP_TESTS_SH+= 8_test
+TAP_TESTS_SH+= 9_test
${PACKAGE}FILES+= conf.sh
OpenPOWER on IntegriCloud