xref: /freebsd/tools/test/stress2/misc/graid1_3.sh (revision 61e21613)
1#!/bin/sh
2
3#
4# Copyright (c) 2017 Dell EMC Isilon
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28
29[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
30
31# Test scenario by Mark Johnston <markj@FreeBSD.org>
32
33# Page fault seen:
34# https://people.freebsd.org/~pho/stress/log/graid1_3.txt
35
36. ../default.cfg
37
38gmirror load > /dev/null 2>&1 && unload=1
39[ -c /dev/mirror/markj-mirror ] &&
40    { gmirror stop markj-mirror; gmirror destroy markj-mirror; }
41old=`sysctl -n kern.geom.mirror.debug`
42sysctl kern.geom.mirror.debug=-1 | grep -q -- -1 ||
43    sysctl kern.geom.mirror.debug=$old > /dev/null
44u1=$mdstart
45u2=$((mdstart + 1))
46size=$((5 * 1024  * 1024))
47for u in $u1 $u2; do
48	dd if=/dev/zero of=/tmp/graid1_2_di$u bs=$size count=1 \
49	    status=none
50	[ -c /dev/md$u ] && mdconfig -d -u $u
51	mdconfig -a -t vnode -f /tmp/graid1_2_di$u -u $u
52done
53set -e
54
55(
56gpart create -s GPT md$u1
57gpart create -s GPT md$u2
58gpart add -t freebsd-ufs -s 1M md$u1
59gpart add -t freebsd-ufs -s 1M md$u2
60) > /dev/null
61
62gmirror label markj-mirror md${u1}p1
63set +e
64
65while true; do
66	gmirror label markj-mirror md${u1}p1
67	gmirror destroy markj-mirror
68done 2>/dev/null &
69pid1=$!
70while true; do
71	gmirror insert markj-mirror md${u2}p1
72	gmirror remove markj-mirror md${u2}p1
73done 2>/dev/null &
74pid2=$!
75
76for i in `jot 60`; do
77	gmirror list markj-mirror
78	sleep 1
79done > /dev/null 2>&1
80sleep 60
81
82kill $pid1 $pid2
83wait
84sleep 1
85
86gmirror remove markj-mirror md${u2}p1 > /dev/null 2>&1
87gmirror destroy markj-mirror > /dev/null 2>&1
88
89mdconfig -d -u $u1 || exit 1
90mdconfig -d -u $u2 || exit 1
91rm -f /tmp/graid1_2_di*
92[ $unload ] && gmirror unload
93exit 0
94