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
|