xref: /freebsd-src/tests/sys/geom/class/mirror/component_selection.sh (revision 96950419f15510287080c557174e0d8409f06956)
1af7dcae0SConrad Meyer
29583ab8aSOlivier CochardATF_TEST=true
39583ab8aSOlivier Cochardclass=mirror
49583ab8aSOlivier Cochard. $(atf_get_srcdir)/conf.sh
59583ab8aSOlivier Cochard
6af7dcae0SConrad Meyeratf_test_case run_latest_genid cleanup
7af7dcae0SConrad Meyerrun_latest_genid_head()
8af7dcae0SConrad Meyer{
9af7dcae0SConrad Meyer	atf_set "descr" \
10af7dcae0SConrad Meyer	    "Ensure that we properly select components (latest genid) during STARTING."
11af7dcae0SConrad Meyer	atf_set "require.user" "root"
12af7dcae0SConrad Meyer}
13af7dcae0SConrad Meyerrun_latest_genid_body()
14af7dcae0SConrad Meyer{
159583ab8aSOlivier Cochard	geom_atf_test_setup
169583ab8aSOlivier Cochard	if ! error_message=$(geom_load_class_if_needed nop); then
179583ab8aSOlivier Cochard		atf_skip "$error_message"
189583ab8aSOlivier Cochard	fi
19af7dcae0SConrad Meyer
20af7dcae0SConrad Meyer	f1=$(mktemp ${base}.XXXXXX)
21af7dcae0SConrad Meyer	f2=$(mktemp ${base}.XXXXXX)
22af7dcae0SConrad Meyer	f3=$(mktemp ${base}.XXXXXX)
23af7dcae0SConrad Meyer	rnd1=$(mktemp ${base}.XXXXXX)
24af7dcae0SConrad Meyer	rnd2=$(mktemp ${base}.XXXXXX)
25af7dcae0SConrad Meyer
26af7dcae0SConrad Meyer	atf_check truncate -s 2M $f1
27af7dcae0SConrad Meyer	atf_check truncate -s 2M $f2
28af7dcae0SConrad Meyer	atf_check truncate -s 2M $f3
29af7dcae0SConrad Meyer	dd if=/dev/urandom bs=512 count=1 of="$rnd1"
30af7dcae0SConrad Meyer	dd if=/dev/urandom bs=512 count=1 of="$rnd2"
31af7dcae0SConrad Meyer
32*96950419SGleb Smirnoff	attach_md md1 -t vnode -f ${f1}
33*96950419SGleb Smirnoff	attach_md md2 -t vnode -f ${f2}
34*96950419SGleb Smirnoff	attach_md md3 -t vnode -f ${f3}
35af7dcae0SConrad Meyer
36af7dcae0SConrad Meyer	# Use a gnop for md1 just for consistency; it's not used for anything.
37af7dcae0SConrad Meyer	atf_check gnop create $md1
38af7dcae0SConrad Meyer	atf_check gnop create $md2
39af7dcae0SConrad Meyer	atf_check gnop create $md3
40af7dcae0SConrad Meyer	# Hardcode component names so that the non-.nop device isn't tasted
41af7dcae0SConrad Meyer	# instead.
42af7dcae0SConrad Meyer	atf_check gmirror label -h $name ${md1}.nop
43af7dcae0SConrad Meyer	devwait
44af7dcae0SConrad Meyer
45af7dcae0SConrad Meyer	atf_check gmirror insert -h $name ${md2}.nop
46af7dcae0SConrad Meyer	atf_check gmirror insert -h $name ${md3}.nop
47af7dcae0SConrad Meyer	syncwait
48af7dcae0SConrad Meyer
49af7dcae0SConrad Meyer	# Fail mirror 3, writing known contents to mirror 1+2 block 1
50af7dcae0SConrad Meyer	atf_check -s exit:0 -e empty -o empty \
51af7dcae0SConrad Meyer	    gnop configure -w 100 ${md3}.nop
52af7dcae0SConrad Meyer	atf_check -s exit:0 dd if="$rnd1" bs=512 count=1 oseek=1 conv=notrunc \
53af7dcae0SConrad Meyer	    of=/dev/mirror/$name status=none
54af7dcae0SConrad Meyer
55af7dcae0SConrad Meyer	disconnectwait nop "${md3}.nop"
56af7dcae0SConrad Meyer
57af7dcae0SConrad Meyer	# Should have two mirrors remaining after md3 was evicted
58af7dcae0SConrad Meyer	atf_check [ $(gmirror status -s $name | wc -l) -eq 2 ]
59af7dcae0SConrad Meyer	atf_check -s exit:0 -o match:"DEGRADED  ${md1}.nop \(ACTIVE\)" \
60af7dcae0SConrad Meyer		gmirror status -s $name
61af7dcae0SConrad Meyer	atf_check -s exit:0 -o match:"DEGRADED  ${md2}.nop \(ACTIVE\)" \
62af7dcae0SConrad Meyer		gmirror status -s $name
63af7dcae0SConrad Meyer
64af7dcae0SConrad Meyer	# Repeat:
65af7dcae0SConrad Meyer	# Fail mirror 2, writing known contents to mirror 1 block 2
66af7dcae0SConrad Meyer	atf_check -s exit:0 -e empty -o empty \
67af7dcae0SConrad Meyer	    gnop configure -w 100 ${md2}.nop
68af7dcae0SConrad Meyer	atf_check -s exit:0 dd if="$rnd2" bs=512 count=2 oseek=1 conv=notrunc \
69af7dcae0SConrad Meyer	    of=/dev/mirror/$name status=none
70af7dcae0SConrad Meyer
71af7dcae0SConrad Meyer	disconnectwait nop "${md2}.nop"
72af7dcae0SConrad Meyer
73af7dcae0SConrad Meyer	# Should have one mirror remaining after md2 was evicted
74af7dcae0SConrad Meyer	atf_check [ $(gmirror status -s $name | wc -l) -eq 1 ]
75af7dcae0SConrad Meyer	atf_check -s exit:0 -o match:"DEGRADED  ${md1}.nop \(ACTIVE\)" \
76af7dcae0SConrad Meyer		gmirror status -s $name
77af7dcae0SConrad Meyer
78af7dcae0SConrad Meyer	# Stop the mirror and remove the pieces so gmirror can't see them.
79af7dcae0SConrad Meyer	atf_check gmirror stop $name
80af7dcae0SConrad Meyer	atf_check gnop destroy ${md1}.nop
81af7dcae0SConrad Meyer	atf_check gnop destroy ${md2}.nop
82af7dcae0SConrad Meyer	atf_check gnop destroy ${md3}.nop
83af7dcae0SConrad Meyer
84af7dcae0SConrad Meyer	# Rebuild; spin up "disk" with lowest genid
85af7dcae0SConrad Meyer	atf_check gnop create $md3
86af7dcae0SConrad Meyer	md3gen=$(gmirror dump /dev/${md3}.nop | grep genid | cut -d: -f2)
87af7dcae0SConrad Meyer	# Assert gmirror is referencing this component for now:
88af7dcae0SConrad Meyer	atf_check [ $(consumerrefs nop ${md3}.nop) = "r1w1e1" ]
89af7dcae0SConrad Meyer
90af7dcae0SConrad Meyer	# Adding newer genid should kick out old component
91af7dcae0SConrad Meyer	atf_check gnop create $md2
92af7dcae0SConrad Meyer	md2gen=$(gmirror dump /dev/${md2}.nop | grep genid | cut -d: -f2)
93af7dcae0SConrad Meyer	atf_check [ $md2gen -gt $md3gen ]
94af7dcae0SConrad Meyer
95af7dcae0SConrad Meyer	disconnectwait nop "${md3}.nop"
96af7dcae0SConrad Meyer
97af7dcae0SConrad Meyer	# Can't test this because 'status' doesn't exist until RUNNING:
98af7dcae0SConrad Meyer	#atf_check [ $(gmirror status -s $name | wc -l) -eq 1 ]
99af7dcae0SConrad Meyer	# But as a substitute, assert gmirror has dropped reference to staler
100af7dcae0SConrad Meyer	# component in favor of newer component:
101af7dcae0SConrad Meyer	atf_check [ $(consumerrefs nop ${md2}.nop) = "r1w1e1" ]
102af7dcae0SConrad Meyer
103af7dcae0SConrad Meyer	# ditto
104af7dcae0SConrad Meyer	atf_check gnop create $md1
105af7dcae0SConrad Meyer	md1gen=$(gmirror dump /dev/${md1}.nop | grep genid | cut -d: -f2)
106af7dcae0SConrad Meyer	atf_check [ $md1gen -gt $md2gen ]
107af7dcae0SConrad Meyer
108af7dcae0SConrad Meyer	disconnectwait nop "${md2}.nop"
109af7dcae0SConrad Meyer
110af7dcae0SConrad Meyer	# Assert gmirror has dropped reference to stale component in favor of
111af7dcae0SConrad Meyer	# newer component:
112af7dcae0SConrad Meyer	atf_check [ $(consumerrefs nop ${md1}.nop) = "r1w1e1" ]
113af7dcae0SConrad Meyer
114af7dcae0SConrad Meyer	# gmirror won't start the mirror automatically with only one component
115af7dcae0SConrad Meyer	# ($md0) of configured three, so this waits out the
116af7dcae0SConrad Meyer	# kern.geom.mirror.timeout:
117af7dcae0SConrad Meyer	devwait
118af7dcae0SConrad Meyer
119af7dcae0SConrad Meyer	atf_check [ $(gmirror status -s $name | wc -l) -eq 1 ]
120af7dcae0SConrad Meyer	atf_check -s exit:0 -o match:"DEGRADED  ${md1}.nop \(ACTIVE\)" \
121af7dcae0SConrad Meyer		gmirror status -s $name
122af7dcae0SConrad Meyer}
123af7dcae0SConrad Meyerrun_latest_genid_cleanup()
124af7dcae0SConrad Meyer{
125af7dcae0SConrad Meyer	. $(atf_get_srcdir)/conf.sh
126af7dcae0SConrad Meyer
127af7dcae0SConrad Meyer	if [ -f "$TEST_MDS_FILE" ]; then
128af7dcae0SConrad Meyer		while read test_md; do
129af7dcae0SConrad Meyer			echo "# Removing test gnop: ${test_md}.nop"
130af7dcae0SConrad Meyer			gnop destroy -f "${test_md}.nop" 2>/dev/null || :
131af7dcae0SConrad Meyer		done < "$TEST_MDS_FILE"
132af7dcae0SConrad Meyer	fi
133af7dcae0SConrad Meyer	gmirror_test_cleanup
134af7dcae0SConrad Meyer}
135af7dcae0SConrad Meyer
136af7dcae0SConrad Meyeratf_init_test_cases()
137af7dcae0SConrad Meyer{
138af7dcae0SConrad Meyer	atf_add_test_case run_latest_genid
139af7dcae0SConrad Meyer}
140