t-mirror-lvconvert.sh revision 1.1.1.1 1 1.1 haad # Copyright (C) 2008 Red Hat, Inc. All rights reserved.
2 1.1 haad # Copyright (C) 2007 NEC Corporation
3 1.1 haad #
4 1.1 haad # This copyrighted material is made available to anyone wishing to use,
5 1.1 haad # modify, copy, or redistribute it subject to the terms and conditions
6 1.1 haad # of the GNU General Public License v.2.
7 1.1 haad #
8 1.1 haad # You should have received a copy of the GNU General Public License
9 1.1 haad # along with this program; if not, write to the Free Software Foundation,
10 1.1 haad # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
11 1.1 haad
12 1.1 haad . ./test-utils.sh
13 1.1 haad
14 1.1 haad dmsetup_has_dm_devdir_support_ || exit 200
15 1.1 haad
16 1.1 haad mimages_are_redundant_ ()
17 1.1 haad {
18 1.1 haad local vg=$1
19 1.1 haad local lv=$vg/$2
20 1.1 haad local i
21 1.1 haad
22 1.1 haad rm -f out
23 1.1 haad for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do
24 1.1 haad lvs -a -odevices --noheadings $vg/$i | sed 's/([^)]*)//g; s/,/ /g' | \
25 1.1 haad sort | uniq >> out
26 1.1 haad done
27 1.1 haad
28 1.1 haad # if any duplication is found, it's not redundant
29 1.1 haad sort out | uniq -d | grep . && return 1
30 1.1 haad
31 1.1 haad return 0
32 1.1 haad }
33 1.1 haad
34 1.1 haad lv_is_contiguous_ ()
35 1.1 haad {
36 1.1 haad local lv=$1
37 1.1 haad
38 1.1 haad # if the lv has multiple segments, it's not contiguous
39 1.1 haad [ $(lvs -a --segments --noheadings $lv | wc -l) -ne 1 ] && return 1
40 1.1 haad
41 1.1 haad return 0
42 1.1 haad }
43 1.1 haad
44 1.1 haad mimages_are_contiguous_ ()
45 1.1 haad {
46 1.1 haad local vg=$1
47 1.1 haad local lv=$vg/$2
48 1.1 haad local i
49 1.1 haad
50 1.1 haad for i in $(lvs -odevices --noheadings $lv | sed 's/([^)]*)//g; s/,/ /g'); do
51 1.1 haad lv_is_contiguous_ $vg/$i || return 1
52 1.1 haad done
53 1.1 haad
54 1.1 haad return 0
55 1.1 haad }
56 1.1 haad
57 1.1 haad mirrorlog_is_on_()
58 1.1 haad {
59 1.1 haad local lv="$1"_mlog
60 1.1 haad shift 1
61 1.1 haad lvs -a -odevices --noheadings $lv | sed 's/,/\n/g' > out
62 1.1 haad for d in $*; do grep "$d(" out || return 1; done
63 1.1 haad for d in $*; do grep -v "$d(" out > out2 || true; mv out2 out; done
64 1.1 haad grep . out && return 1
65 1.1 haad return 0
66 1.1 haad }
67 1.1 haad
68 1.1 haad save_dev_sum_()
69 1.1 haad {
70 1.1 haad mkfs.ext3 $1 > /dev/null &&
71 1.1 haad md5sum $1 > md5.$(basename $1)
72 1.1 haad }
73 1.1 haad
74 1.1 haad check_dev_sum_()
75 1.1 haad {
76 1.1 haad md5sum $1 > md5.tmp && cmp md5.$(basename $1) md5.tmp
77 1.1 haad }
78 1.1 haad
79 1.1 haad check_mirror_count_()
80 1.1 haad {
81 1.1 haad local lv=$1
82 1.1 haad local mirrors=$2
83 1.1 haad [ "$mirrors" -eq "$(lvs --noheadings -ostripes $lv)" ]
84 1.1 haad }
85 1.1 haad
86 1.1 haad check_mirror_log_()
87 1.1 haad {
88 1.1 haad local lv=$1
89 1.1 haad local mlog=$(lvs --noheadings -omirror_log $lv | sed -e 's/ //g')
90 1.1 haad [ "$(basename $lv)_mlog" = "$mlog" ]
91 1.1 haad }
92 1.1 haad
93 1.1 haad wait_conversion_()
94 1.1 haad {
95 1.1 haad local lv=$1
96 1.1 haad while (lvs --noheadings -oattr "$lv" | grep -q '^ *c'); do sleep 1; done
97 1.1 haad }
98 1.1 haad
99 1.1 haad check_no_tmplvs_()
100 1.1 haad {
101 1.1 haad local lv=$1
102 1.1 haad lvs -a --noheadings -oname $(dirname $lv) > out
103 1.1 haad ! grep tmp out
104 1.1 haad }
105 1.1 haad
106 1.1 haad aux prepare_vg 5
107 1.1 haad
108 1.1 haad # ---------------------------------------------------------------------
109 1.1 haad # Common environment setup/cleanup for each sub testcases
110 1.1 haad
111 1.1 haad prepare_lvs_()
112 1.1 haad {
113 1.1 haad lvremove -ff $vg
114 1.1 haad if dmsetup table|grep $vg; then
115 1.1 haad echo "ERROR: lvremove did leave some some mappings in DM behind!"
116 1.1 haad return 1
117 1.1 haad fi
118 1.1 haad :
119 1.1 haad }
120 1.1 haad
121 1.1 haad check_and_cleanup_lvs_()
122 1.1 haad {
123 1.1 haad lvs -a -o+devices $vg
124 1.1 haad lvremove -ff $vg
125 1.1 haad if dmsetup table|grep $vg; then
126 1.1 haad echo "ERROR: lvremove did leave some some mappings in DM behind!"
127 1.1 haad return 1
128 1.1 haad fi
129 1.1 haad }
130 1.1 haad
131 1.1 haad prepare_lvs_
132 1.1 haad check_and_cleanup_lvs_
133 1.1 haad
134 1.1 haad # ---------------------------------------------------------------------
135 1.1 haad # mirrored LV tests
136 1.1 haad
137 1.1 haad # ---
138 1.1 haad # add mirror to mirror
139 1.1 haad
140 1.1 haad # add 1 mirror
141 1.1 haad prepare_lvs_
142 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
143 1.1 haad check_mirror_count_ $vg/$lv1 2
144 1.1 haad check_mirror_log_ $vg/$lv1
145 1.1 haad lvconvert -m+1 -i1 $vg/$lv1 $dev4
146 1.1 haad check_no_tmplvs_ $vg/$lv1
147 1.1 haad check_mirror_count_ $vg/$lv1 3
148 1.1 haad mimages_are_redundant_ $vg $lv1
149 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
150 1.1 haad check_and_cleanup_lvs_
151 1.1 haad
152 1.1 haad # add 2 mirrors
153 1.1 haad prepare_lvs_
154 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
155 1.1 haad check_mirror_count_ $vg/$lv1 2
156 1.1 haad check_mirror_log_ $vg/$lv1
157 1.1 haad lvconvert -m+2 -i1 $vg/$lv1 $dev4 $dev5
158 1.1 haad check_no_tmplvs_ $vg/$lv1
159 1.1 haad check_mirror_count_ $vg/$lv1 4
160 1.1 haad mimages_are_redundant_ $vg $lv1
161 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
162 1.1 haad check_and_cleanup_lvs_
163 1.1 haad
164 1.1 haad # add 1 mirror to core log mirror
165 1.1 haad prepare_lvs_
166 1.1 haad lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
167 1.1 haad check_mirror_count_ $vg/$lv1 2
168 1.1 haad not check_mirror_log_ $vg/$lv1
169 1.1 haad lvconvert -m+1 -i1 --mirrorlog core $vg/$lv1 $dev4
170 1.1 haad check_no_tmplvs_ $vg/$lv1
171 1.1 haad check_mirror_count_ $vg/$lv1 3
172 1.1 haad not check_mirror_log_ $vg/$lv1
173 1.1 haad mimages_are_redundant_ $vg $lv1
174 1.1 haad check_and_cleanup_lvs_
175 1.1 haad
176 1.1 haad # add 2 mirrors to core log mirror"
177 1.1 haad prepare_lvs_
178 1.1 haad lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
179 1.1 haad check_mirror_count_ $vg/$lv1 2
180 1.1 haad not check_mirror_log_ $vg/$lv1
181 1.1 haad lvconvert -m+2 -i1 --mirrorlog core $vg/$lv1 $dev4 $dev5
182 1.1 haad check_no_tmplvs_ $vg/$lv1
183 1.1 haad check_mirror_count_ $vg/$lv1 4
184 1.1 haad not check_mirror_log_ $vg/$lv1
185 1.1 haad mimages_are_redundant_ $vg $lv1
186 1.1 haad check_and_cleanup_lvs_
187 1.1 haad
188 1.1 haad # ---
189 1.1 haad # add to converting mirror
190 1.1 haad
191 1.1 haad # add 1 mirror then add 1 more mirror during conversion
192 1.1 haad prepare_lvs_
193 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
194 1.1 haad check_mirror_count_ $vg/$lv1 2
195 1.1 haad check_mirror_log_ $vg/$lv1
196 1.1 haad lvconvert -m+1 -b $vg/$lv1 $dev4
197 1.1 haad lvconvert -m+1 -i3 $vg/$lv1 $dev5
198 1.1 haad check_no_tmplvs_ $vg/$lv1
199 1.1 haad check_mirror_count_ $vg/$lv1 4
200 1.1 haad mimages_are_redundant_ $vg $lv1
201 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
202 1.1 haad check_and_cleanup_lvs_
203 1.1 haad
204 1.1 haad # ---
205 1.1 haad # add mirror and disk log
206 1.1 haad
207 1.1 haad # "add 1 mirror and disk log"
208 1.1 haad prepare_lvs_
209 1.1 haad lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
210 1.1 haad check_mirror_count_ $vg/$lv1 2
211 1.1 haad not check_mirror_log_ $vg/$lv1
212 1.1 haad lvconvert -m+1 --mirrorlog disk -i1 $vg/$lv1 $dev4 $dev3:0-1
213 1.1 haad check_no_tmplvs_ $vg/$lv1
214 1.1 haad check_mirror_count_ $vg/$lv1 3
215 1.1 haad check_mirror_log_ $vg/$lv1
216 1.1 haad mimages_are_redundant_ $vg $lv1
217 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
218 1.1 haad check_and_cleanup_lvs_
219 1.1 haad
220 1.1 haad # ---
221 1.1 haad # check polldaemon restarts
222 1.1 haad
223 1.1 haad # convert inactive mirror and start polling
224 1.1 haad prepare_lvs_
225 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
226 1.1 haad check_mirror_count_ $vg/$lv1 2
227 1.1 haad lvchange -an $vg/$lv1
228 1.1 haad lvconvert -m+1 $vg/$lv1 $dev4
229 1.1 haad lvchange -ay $vg/$lv1
230 1.1 haad wait_conversion_ $vg/$lv1
231 1.1 haad lvs -a
232 1.1 haad check_no_tmplvs_ $vg/$lv1
233 1.1 haad check_and_cleanup_lvs_
234 1.1 haad
235 1.1 haad # ---------------------------------------------------------------------
236 1.1 haad # removal during conversion
237 1.1 haad
238 1.1 haad # "remove newly added mirror"
239 1.1 haad prepare_lvs_
240 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
241 1.1 haad check_mirror_count_ $vg/$lv1 2
242 1.1 haad check_mirror_log_ $vg/$lv1
243 1.1 haad lvconvert -m+1 -b $vg/$lv1 $dev4
244 1.1 haad lvconvert -m-1 $vg/$lv1 $dev4
245 1.1 haad wait_conversion_ $vg/$lv1
246 1.1 haad check_no_tmplvs_ $vg/$lv1
247 1.1 haad check_mirror_count_ $vg/$lv1 2
248 1.1 haad mimages_are_redundant_ $vg $lv1
249 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
250 1.1 haad check_and_cleanup_lvs_
251 1.1 haad
252 1.1 haad # "remove one of newly added mirrors"
253 1.1 haad prepare_lvs_
254 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
255 1.1 haad check_mirror_count_ $vg/$lv1 2
256 1.1 haad check_mirror_log_ $vg/$lv1
257 1.1 haad lvconvert -m+2 -b $vg/$lv1 $dev4 $dev5
258 1.1 haad lvconvert -m-1 $vg/$lv1 $dev4
259 1.1 haad lvconvert -i1 $vg/$lv1
260 1.1 haad wait_conversion_ $vg/$lv1
261 1.1 haad check_no_tmplvs_ $vg/$lv1
262 1.1 haad check_mirror_count_ $vg/$lv1 3
263 1.1 haad mimages_are_redundant_ $vg $lv1
264 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
265 1.1 haad check_and_cleanup_lvs_
266 1.1 haad
267 1.1 haad # "remove from original mirror (the original is still mirror)"
268 1.1 haad prepare_lvs_
269 1.1 haad lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev5 $dev3:0-1
270 1.1 haad check_mirror_count_ $vg/$lv1 3
271 1.1 haad check_mirror_log_ $vg/$lv1
272 1.1 haad lvconvert -m+1 -b $vg/$lv1 $dev4
273 1.1 haad lvconvert -m-1 $vg/$lv1 $dev2
274 1.1 haad lvconvert -i1 $vg/$lv1
275 1.1 haad wait_conversion_ $vg/$lv1
276 1.1 haad check_no_tmplvs_ $vg/$lv1
277 1.1 haad check_mirror_count_ $vg/$lv1 3
278 1.1 haad mimages_are_redundant_ $vg $lv1
279 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
280 1.1 haad check_and_cleanup_lvs_
281 1.1 haad
282 1.1 haad # "remove from original mirror (the original becomes linear)"
283 1.1 haad prepare_lvs_
284 1.1 haad lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
285 1.1 haad check_mirror_count_ $vg/$lv1 2
286 1.1 haad check_mirror_log_ $vg/$lv1
287 1.1 haad lvconvert -m+1 -b $vg/$lv1 $dev4
288 1.1 haad lvconvert -m-1 $vg/$lv1 $dev2
289 1.1 haad lvconvert -i1 $vg/$lv1
290 1.1 haad wait_conversion_ $vg/$lv1
291 1.1 haad check_no_tmplvs_ $vg/$lv1
292 1.1 haad check_mirror_count_ $vg/$lv1 2
293 1.1 haad mimages_are_redundant_ $vg $lv1
294 1.1 haad mirrorlog_is_on_ $vg/$lv1 $dev3
295 1.1 haad check_and_cleanup_lvs_
296 1.1 haad
297 1.1 haad # ---------------------------------------------------------------------
298 1.1 haad
299 1.1 haad # "rhbz440405: lvconvert -m0 incorrectly fails if all PEs allocated"
300 1.1 haad prepare_lvs_
301 1.1 haad lvcreate -l`pvs --noheadings -ope_count $dev1` -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
302 1.1 haad check_mirror_count_ $vg/$lv1 2
303 1.1 haad check_mirror_log_ $vg/$lv1
304 1.1 haad lvconvert -m0 $vg/$lv1 $dev1
305 1.1 haad check_no_tmplvs_ $vg/$lv1
306 1.1 haad check_mirror_count_ $vg/$lv1 1
307 1.1 haad check_and_cleanup_lvs_
308 1.1 haad
309 1.1 haad # "rhbz264241: lvm mirror doesn't lose it's "M" --nosync attribute after being down and the up converted"
310 1.1 haad prepare_lvs_
311 1.1 haad lvcreate -l2 -m1 -n$lv1 --nosync $vg
312 1.1 haad lvconvert -m0 $vg/$lv1
313 1.1 haad lvconvert -m1 $vg/$lv1
314 1.1 haad lvs --noheadings -o attr $vg/$lv1 | grep '^ *m'
315 1.1 haad
316