xref: /freebsd/tools/test/stress2/misc/graid1_11.sh (revision 612d42e5dc7608d7cdaa12c95b70fe9aff809b0a)
1*612d42e5SPeter Holm#!/bin/sh
2*612d42e5SPeter Holm
3*612d42e5SPeter Holm# g_mirror: don't fail reads while losing next-to-last disk
4*612d42e5SPeter Holm
5*612d42e5SPeter Holm# Fixed by https://cgit.FreeBSD.org/src/commit/?id=5d5f44623eb3d121d528060d131ee5d6bcd63489
6*612d42e5SPeter Holm# Test scenario by: Andriy Gapon <avg@FreeBSD.org>
7*612d42e5SPeter Holm
8*612d42e5SPeter Holmset -u
9*612d42e5SPeter Holm
10*612d42e5SPeter Holmcleanup()
11*612d42e5SPeter Holm{
12*612d42e5SPeter Holm	echo "cleanup" 2>&1
13*612d42e5SPeter Holm	gnop destroy -f ${dev1}.nop
14*612d42e5SPeter Holm	gnop destroy -f ${dev2}.nop
15*612d42e5SPeter Holm	gmirror destroy testmirror
16*612d42e5SPeter Holm	mdconfig -d -u ${dev2#md}
17*612d42e5SPeter Holm	mdconfig -d -u ${dev1#md}
18*612d42e5SPeter Holm}
19*612d42e5SPeter Holm
20*612d42e5SPeter Holmlist_descendants()
21*612d42e5SPeter Holm{
22*612d42e5SPeter Holm	local children
23*612d42e5SPeter Holm
24*612d42e5SPeter Holm	children=$(pgrep -P "$1")
25*612d42e5SPeter Holm	for pid in $children ; do
26*612d42e5SPeter Holm		list_descendants "$pid"
27*612d42e5SPeter Holm	done
28*612d42e5SPeter Holm	echo "$children"
29*612d42e5SPeter Holm}
30*612d42e5SPeter Holm
31*612d42e5SPeter Holm# Note that the size of gnop providers is smaller than the
32*612d42e5SPeter Holm# size of backing md-s to avoid gmirror auto-tasting.
33*612d42e5SPeter Holmfor i in 1 2; do
34*612d42e5SPeter Holm	eval dev$i=$(mdconfig -a -t swap -s 1024m)
35*612d42e5SPeter Holm	eval gnop create -d 8 -s 1000m \${dev$i}
36*612d42e5SPeter Holmdone
37*612d42e5SPeter Holm
38*612d42e5SPeter Holmtrap cleanup EXIT INT TERM QUIT
39*612d42e5SPeter Holm
40*612d42e5SPeter Holmgmirror load 2>/dev/null || true
41*612d42e5SPeter Holmgmirror label -b round-robin -F testmirror ${dev1}.nop ${dev2}.nop
42*612d42e5SPeter Holm
43*612d42e5SPeter Holm(
44*612d42e5SPeter Holm	#my_pid=$(exec sh -c 'echo "$PPID"')
45*612d42e5SPeter Holm
46*612d42e5SPeter Holm	sleep 100000 &
47*612d42e5SPeter Holm	sentry=$!
48*612d42e5SPeter Holm
49*612d42e5SPeter Holm	children=""
50*612d42e5SPeter Holm	for i in $(seq 8) ; do
51*612d42e5SPeter Holm		(
52*612d42e5SPeter Holm		while dd if=/dev/mirror/testmirror of=/dev/null > /dev/null ; ds=$? ; [ $ds -eq 0 ] ; do
53*612d42e5SPeter Holm			:
54*612d42e5SPeter Holm		done
55*612d42e5SPeter Holm		if [ $ds -lt 128 ] ; then
56*612d42e5SPeter Holm			# Not killed
57*612d42e5SPeter Holm			echo "dd exited with $ds" 1>&2
58*612d42e5SPeter Holm			kill $sentry 2>/dev/null
59*612d42e5SPeter Holm		fi
60*612d42e5SPeter Holm		) &
61*612d42e5SPeter Holm
62*612d42e5SPeter Holm		children="${children:+${children},}$!"
63*612d42e5SPeter Holm
64*612d42e5SPeter Holm		sleep 0.1
65*612d42e5SPeter Holm	done
66*612d42e5SPeter Holm
67*612d42e5SPeter Holm	wait $sentry
68*612d42e5SPeter Holm	pkill -P ${children} -x dd
69*612d42e5SPeter Holm
70*612d42e5SPeter Holm	# Reap background children
71*612d42e5SPeter Holm	wait
72*612d42e5SPeter Holm) &
73*612d42e5SPeter Holmrunner=$!
74*612d42e5SPeter Holm
75*612d42e5SPeter Holm# Give dd-s some time to get running
76*612d42e5SPeter Holmsleep 2
77*612d42e5SPeter Holm
78*612d42e5SPeter Holm# Destroy one of the members
79*612d42e5SPeter Holmecho "destroying one member" 1>&2
80*612d42e5SPeter Holmgnop destroy -f ${dev1}.nop
81*612d42e5SPeter Holm
82*612d42e5SPeter Holmcount=0
83*612d42e5SPeter Holmwhile kill -0 $runner 2>/dev/null && [ $count -lt 5 ] ; do
84*612d42e5SPeter Holm	sleep 1
85*612d42e5SPeter Holm	count=$((count + 1))
86*612d42e5SPeter Holmdone
87*612d42e5SPeter Holm
88*612d42e5SPeter Holmif ! kill -0 $runner 2>/dev/null ; then
89*612d42e5SPeter Holm	echo "the test has self-terminated" 1>&2
90*612d42e5SPeter Holm	ret=1
91*612d42e5SPeter Holmelse
92*612d42e5SPeter Holm	echo "the test is stuck, killing..." 1>&2
93*612d42e5SPeter Holm	ret=0
94*612d42e5SPeter Holm	kill $(list_descendants $runner) 2>/dev/null
95*612d42e5SPeter Holmfi
96*612d42e5SPeter Holm
97*612d42e5SPeter Holm# Reap background processes
98*612d42e5SPeter Holmwait
99*612d42e5SPeter Holm
100*612d42e5SPeter Holm# Just in case
101*612d42e5SPeter Holmsleep 5
102*612d42e5SPeter Holm
103*612d42e5SPeter Holmexit $ret
104