summaryrefslogtreecommitdiff
path: root/test/shell/metadata-balance.sh
blob: 869297e28cdb8f0c7c3c18cd076b0609cb8f4791 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#!/bin/sh
# Copyright (C) 2008 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

. lib/inittest

test -e LOCAL_LVMPOLLD && skip

aux prepare_devs 6

echo Make sure we can ignore / un-ignore mdas on a per-PV basis
for pv_in_vg in 1 0; do
for mdacp in 1 2; do
	pvcreate --metadatacopies $mdacp "$dev1" "$dev2"
        pvcreate --metadatacopies 0 "$dev3"
	if [ $pv_in_vg = 1 ]; then
		vgcreate $vg "$dev1" "$dev2" "$dev3"
	fi
	pvchange --metadataignore y "$dev1"
	check pv_field "$dev1" pv_mda_count $mdacp
	check pv_field "$dev1" pv_mda_used_count 0
	check pv_field "$dev2" pv_mda_count $mdacp
	check pv_field "$dev2" pv_mda_used_count $mdacp
	if [ $pv_in_vg = 1 ]; then
		check vg_field $vg vg_mda_count $(($mdacp * 2))
		check vg_field $vg vg_mda_used_count $mdacp
		check vg_field $vg vg_mda_copies unmanaged
	fi
	pvchange --metadataignore n "$dev1"
	check pv_field "$dev1" pv_mda_count $mdacp
	check pv_field "$dev1" pv_mda_used_count $mdacp
	if [ $pv_in_vg = 1 ]; then
		check vg_field $vg vg_mda_count $(($mdacp * 2))
		check vg_field $vg vg_mda_used_count $(($mdacp * 2))
		check vg_field $vg vg_mda_copies unmanaged
		vgremove -f $vg
	fi
done
done

# Check if a PV has unignored (used) mdas, and if so, ignore
pvignore_ () {
	pv_mda_used_count=$(get pv_field "$1" pv_mda_used_count)
	if [ $pv_mda_used_count -ne 0 ]; then
	    pvchange --metadataignore y $1
	fi
}

# Check if a PV has ignored mdas, and if so, unignore (make used)
pvunignore_ () {
	pv_mda_count=$(get pv_field "$1" pv_mda_count)
	pv_mda_used_count=$(get pv_field "$1" pv_mda_used_count)
	if [ $pv_mda_count -gt $pv_mda_used_count ]; then
	    pvchange --metadataignore n $1
	fi
}

echo Test of vgmetadatacopies with vgcreate and vgchange
for mdacp in 1 2; do
	pvcreate --metadatacopies $mdacp "$dev1" "$dev2" "$dev4" "$dev5"
	check pv_field "$dev1" pv_mda_used_count $mdacp
	check pv_field "$dev2" pv_mda_used_count $mdacp
	check pv_field "$dev4" pv_mda_used_count $mdacp
	check pv_field "$dev5" pv_mda_used_count $mdacp
	pvcreate --metadatacopies 0 "$dev3"
	vgcreate $vg "$dev1" "$dev2" "$dev3"
	check vg_field $vg vg_mda_copies unmanaged
	echo ensure both --vgmetadatacopies and --metadatacopies accepted
	vgchange --metadatacopies $(($mdacp * 1)) $vg
	echo --vgmetadatacopies is persistent on disk
	echo --vgmetadatacopies affects underlying pv mda ignore
	check vg_field $vg vg_mda_copies $(($mdacp * 1))
	check vg_field $vg vg_mda_used_count $(($mdacp * 1))
	vgchange --vgmetadatacopies $(($mdacp * 2)) $vg
	check vg_field $vg vg_mda_copies $(($mdacp * 2))
	check vg_field $vg vg_mda_used_count $(($mdacp * 2))
	echo allow setting metadatacopies larger than number of PVs
	vgchange --vgmetadatacopies $(($mdacp * 5)) $vg
	check vg_field $vg vg_mda_copies $(($mdacp * 5))
	check vg_field $vg vg_mda_used_count $(($mdacp * 2))
	echo setting to 0 disables automatic balancing
	vgchange --vgmetadatacopies unmanaged $vg
	check vg_field $vg vg_mda_copies unmanaged
	vgremove -f $vg
	echo vgcreate succeeds even when creating a VG w/all ignored mdas
	pvchange --metadataignore y "$dev1" "$dev2"
	check pv_field "$dev1" pv_mda_count $mdacp
	check pv_field "$dev2" pv_mda_used_count 0
	vgcreate $vg "$dev1" "$dev2"
	check vg_field $vg vg_mda_copies unmanaged
	vgremove -f $vg
	echo vgcreate succeeds with a specific number of metadata copies
	vgcreate --vgmetadatacopies $(($mdacp * 2)) $vg "$dev1" "$dev2"
	check vg_field $vg vg_mda_copies $(($mdacp * 2))
	vgremove -f $vg
	vgcreate --vgmetadatacopies $(($mdacp * 1)) $vg "$dev1" "$dev2"
	check vg_field $vg vg_mda_copies $(($mdacp * 1))
	vgremove -f $vg
	echo vgcreate succeeds with a larger value than total metadatacopies
	vgcreate --vgmetadatacopies $(($mdacp * 5)) $vg "$dev1" "$dev2"
	check vg_field $vg vg_mda_copies $(($mdacp * 5))
	vgremove -f $vg
	echo vgcreate succeeds with --vgmetadatacopies unmanaged
	vgcreate --vgmetadatacopies unmanaged $vg "$dev1" "$dev2"
	check vg_field $vg vg_mda_copies unmanaged
	vgremove -f $vg
	pvunignore_ "$dev1"
	pvunignore_ "$dev2"
	pvunignore_ "$dev4"
	pvunignore_ "$dev5"
	echo vgcreate succeds with small value of --metadatacopies, ignores mdas
	vgcreate --vgmetadatacopies 1 $vg "$dev1" "$dev2" "$dev4" "$dev5"
	check vg_field $vg vg_mda_copies 1
	check vg_field $vg vg_mda_count $(($mdacp * 4))
	check vg_field $vg vg_mda_used_count 1
	echo Setting a larger value should trigger non-ignore of mdas
	vgchange --metadatacopies 3 $vg
	check vg_field $vg vg_mda_copies 3
	check vg_field $vg vg_mda_used_count 3
	echo Setting all should trigger unignore of all mdas
	vgchange --vgmetadatacopies all $vg
	check vg_field $vg vg_mda_count $(($mdacp * 4))
	check vg_field $vg vg_mda_copies unmanaged
	check vg_field $vg vg_mda_used_count $(($mdacp * 4))
	echo --vgmetadatacopies 0 should be unmanaged for vgchange and vgcreate
	vgchange --vgmetadatacopies 0 $vg
	check vg_field $vg vg_mda_copies unmanaged
	vgremove -f $vg
	vgcreate --vgmetadatacopies 0 $vg "$dev1" "$dev2" "$dev4" "$dev5"
	check vg_field $vg vg_mda_copies unmanaged
	vgremove -f $vg
done

echo Test vgextend / vgreduce with vgmetadatacopies
for mdacp in 1 2; do
	pvcreate --metadatacopies $mdacp "$dev1" "$dev2" "$dev4" "$dev5"
	pvcreate --metadatacopies 0 "$dev3"
	echo Set a large value of vgmetadatacopies
	vgcreate --vgmetadatacopies $(($mdacp * 5)) $vg "$dev1" "$dev2" "$dev3"
	check vg_field $vg vg_mda_copies $(($mdacp * 5))
	echo Ignore mdas on devices to be used for vgextend
	echo Large value of vgetadatacopies should automatically un-ignore mdas
	pvchange --metadataignore y "$dev4" "$dev5"
	check pv_field "$dev4" pv_mda_used_count 0
	vgextend $vg "$dev4" "$dev5"
	check pv_field "$dev4" pv_mda_used_count $mdacp
	check pv_field "$dev5" pv_mda_used_count $mdacp
	vgremove -f $vg
	echo Set a small value of vgmetadatacopies
	vgcreate --vgmetadatacopies $(($mdacp * 1)) $vg "$dev1" "$dev2" "$dev3"
	check vg_field $vg vg_mda_copies $(($mdacp * 1))
	echo Ignore mdas on devices to be used for vgextend
	echo Small value of vgetadatacopies should leave mdas as ignored
	pvchange --metadataignore y "$dev4" "$dev5"
	check pv_field "$dev4" pv_mda_used_count 0
	vgextend $vg "$dev4" "$dev5"
	check pv_field "$dev4" pv_mda_used_count 0
	check pv_field "$dev5" pv_mda_used_count 0
	echo vgreduce of ignored pv w/mda should not trigger any change to ignore bits
	vgreduce $vg "$dev4"
	check pv_field "$dev4" pv_mda_used_count 0
	check pv_field "$dev5" pv_mda_used_count 0
	echo vgreduce of un-ignored pv w/mda should trigger un-ignore on an mda
	vgreduce $vg "$dev1" "$dev2" "$dev3"
	check pv_field "$dev5" pv_mda_used_count $mdacp
	check vg_field $vg vg_mda_copies $(($mdacp * 1))
	pvunignore_ "$dev1"
	pvunignore_ "$dev2"
	echo setting vgmetadatacopies to unmanaged should allow vgextend to add w/out balancing
	vgchange --vgmetadatacopies unmanaged $vg
	vgextend $vg "$dev1" "$dev2"
	check vg_field $vg vg_mda_copies unmanaged
	check vg_field $vg vg_mda_count $(($mdacp * 3))
	check vg_field $vg vg_mda_used_count $((mdacp * 3))
	check pv_field "$dev1" pv_mda_used_count $mdacp
	check pv_field "$dev2" pv_mda_used_count $mdacp
	vgremove -f $vg
done

echo Test special situations, vgsplit, vgmerge, etc
for mdacp in 1 2; do
	pvcreate --metadatacopies $mdacp "$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
	vgcreate --vgmetadatacopies 2 $vg1 "$dev1" "$dev2" "$dev3"
	vgcreate --vgmetadatacopies $(($mdacp * 1)) $vg2 "$dev4" "$dev5"
	echo vgsplit/vgmerge preserves value of metadata copies
	check vg_field $vg1 vg_mda_copies 2
	check vg_field $vg2 vg_mda_copies $(($mdacp * 1))
	vgsplit $vg1 $vg2 "$dev1"
	check vg_field $vg2 vg_mda_copies $(($mdacp * 1))
	vgmerge $vg1 $vg2
	check vg_field $vg1 vg_mda_copies 2
	check vg_field $vg1 vg_mda_count $(($mdacp * 5))
	echo vgsplit into new vg sets proper value of vgmetadatacopies
	vgsplit --vgmetadatacopies $(($mdacp * 2)) $vg1 $vg2 "$dev1" "$dev2"
	check vg_field $vg2 vg_mda_copies $(($mdacp * 2))
	echo vgchange fails if given both vgmetadatacopies and metadatacopies
	not vgchange --vgmetadatacopies 5 --metadatacopies 7 $vg2
	vgremove -f $vg1 $vg2
done

echo Test combination of --vgmetadatacopies and pvchange --metadataignore
for mdacp in 1 2; do
	pvcreate --metadatacopies $mdacp "$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
	vgcreate --vgmetadatacopies $(($mdacp * 1)) $vg1 "$dev1" "$dev2"
	check vg_field $vg1 vg_mda_copies $(($mdacp * 1))
	check vg_field $vg1 vg_mda_used_count $(($mdacp * 1))
	pvignore_ "$dev3"
	echo Ensure vgextend of PVs with ignored MDAs does not add to vg_mda_used_count
	vgextend $vg1 "$dev3"
	check vg_field $vg1 vg_mda_used_count $(($mdacp * 1))
	echo Using pvchange to unignore should update vg_mda_used_count
	pvchange -f --metadataignore n "$dev3"
	check pv_field "$dev3" pv_mda_used_count $mdacp
	check vg_field $vg1 vg_mda_used_count $(($mdacp * 2))
	echo Set unmanaged on the vg should keep ignore bits the same during vgextend
	vgchange --vgmetadatacopies unmanaged $vg1
	check vg_field $vg1 vg_mda_used_count $(($mdacp * 2))
	pvunignore_ "$dev4"
	vgextend $vg1 "$dev4"
	check pv_field "$dev4" pv_mda_used_count $mdacp
	check vg_field $vg1 vg_mda_used_count $(($mdacp * 3))
	echo Using pvchange to ignore should update vg_mda_used_count
	pvchange -f --metadataignore y "$dev4"
	check pv_field "$dev4" pv_mda_used_count 0
	check vg_field $vg1 vg_mda_used_count $(($mdacp * 2))
	vgremove -f $vg1
done