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