Imported Upstream version 2.02.79
[platform/upstream/device-mapper.git] / test / t-lvconvert-mirror.sh
1 #!/bin/sh
2 # Copyright (C) 2010 Red Hat, Inc. All rights reserved.
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
14 # convert from linear to 2-way mirror
15 aux prepare_vg 5
16 lvcreate -l2 -n $lv1 $vg $dev1
17 lvconvert -i1 -m+1 $vg/$lv1 $dev2 $dev3:0-1
18 check mirror $vg $lv1 $dev3
19
20 # convert from 2-way mirror to linear
21 aux prepare_vg 5
22 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
23 lvconvert -m-1 $vg/$lv1
24 check linear $vg $lv1
25 lvremove -ff $vg
26 # and now try removing a specific leg (bz453643)
27 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
28 lvconvert -m0 $vg/$lv1 $dev2
29 check lv_on $vg $lv1 $dev1
30 lvremove -ff $vg
31
32 # convert from disklog to corelog, active
33 aux prepare_vg 5
34 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
35 lvconvert -f --mirrorlog core $vg/$lv1
36 check mirror $vg $lv1 core
37 lvremove -ff $vg
38
39 # convert from corelog to disklog, active
40 aux prepare_vg 5
41 lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
42 lvconvert --mirrorlog disk $vg/$lv1 $dev3:0-1
43 check mirror $vg $lv1 $dev3
44 lvremove -ff $vg
45
46 # bz192865: lvconvert log of an inactive mirror lv
47 # convert from disklog to corelog, inactive
48 aux prepare_vg 5
49 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0-1
50 lvchange -an $vg/$lv1
51 echo y | lvconvert -f --mirrorlog core $vg/$lv1
52 check mirror $vg $lv1 core
53 lvremove -ff $vg
54
55 # convert from corelog to disklog, inactive
56 aux prepare_vg 5
57 lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
58 lvchange -an $vg/$lv1
59 lvconvert --mirrorlog disk $vg/$lv1 $dev3:0-1
60 check mirror $vg $lv1 $dev3
61 lvremove -ff $vg
62
63 # convert linear to 2-way mirror with 1 PV
64 aux prepare_vg 5
65 lvcreate -l2 -n $lv1 $vg $dev1
66 not lvconvert -m+1 --mirrorlog core $vg/$lv1 $dev1
67 lvremove -ff $vg
68
69 # Start w/ 3-way mirror
70 # Test pulling primary image before mirror in-sync (should fail)
71 # Test pulling primary image after mirror in-sync (should work)
72 # Test that the correct devices remain in the mirror
73 lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev4 $dev3:0
74 # FIXME:
75 #  This is somewhat timing dependent - sync /could/ finish before
76 #  we get a chance to have this command fail
77 should not lvconvert -m-1 $vg/$lv1 $dev1
78
79 lvconvert $vg/$lv1 # wait
80 lvconvert -m2 $vg/$lv1 $dev1 $dev2 $dev4 $dev3:0 # If the above "should" failed...
81
82 lvconvert -m-1 $vg/$lv1 $dev1
83 check mirror_images_on $lv1 $dev2 $dev4
84 lvconvert -m-1 $vg/$lv1 $dev2
85 check linear $vg $lv1
86 check lv_on $vg $lv1 $dev4
87
88 # No parallel lvconverts on a single LV please
89
90 aux prepare_vg 5
91 lvcreate -l5 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
92 check mirror $vg $lv1
93 check mirror_legs $vg $lv1 2
94 lvconvert -m+1 -b $vg/$lv1 $dev4
95
96 # Next convert should fail b/c we can't have 2 at once
97 should not lvconvert -m+1 $vg/$lv1 $dev5
98 lvconvert $vg/$lv1 # wait
99 lvconvert -m2 $vg/$lv1 # In case the above "should" actually failed
100
101 check mirror $vg $lv1 $dev3
102 check mirror_no_temporaries $vg $lv1
103 check mirror_legs $vg $lv1 3
104
105 # add 1 mirror to core log mirror, but
106 #  implicitly keep log as 'core'
107 aux prepare_vg 5
108 lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
109 lvconvert -m +1 -i1 $vg/$lv1
110
111 check mirror $vg $lv1 core
112 check mirror_no_temporaries $vg $lv1
113 check mirror_legs $vg $lv1 3
114
115 # remove 1 mirror from corelog'ed mirror; should retain 'core' log type
116 aux prepare_vg 5
117 lvcreate -l2 -m2 --corelog -n $lv1 $vg
118 lvconvert -m -1 -i1 $vg/$lv1
119
120 check mirror $vg $lv1 core
121 check mirror_no_temporaries $vg $lv1
122 check mirror_legs $vg $lv1 2
123
124 # add 1 mirror then add 1 more mirror during conversion
125 # FIXME this has been explicitly forbidden?
126 #aux prepare_vg 5
127 #lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
128 #lvconvert -m+1 -b $vg/$lv1 $dev4
129 #lvconvert -m+1 $vg/$lv1 $dev5
130 #
131 #check mirror $vg $lv1 $dev3
132 #check mirror_no_temporaries $vg $lv1
133 #check mirror_legs $vg $lv1 4
134
135 # Linear to mirror with mirrored log using --alloc anywhere
136 aux prepare_vg 5
137 lvcreate -l2 -n $lv1 $vg $dev1
138 lvconvert -m +1 --mirrorlog mirrored $vg/$lv1 $dev1 $dev2 --alloc anywhere
139 should check mirror $vg $lv1
140
141 # convert inactive mirror and start polling
142 aux prepare_vg 5
143 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
144 lvchange -an $vg/$lv1
145 lvconvert -m+1 $vg/$lv1 $dev4
146 lvchange -ay $vg/$lv1
147 lvconvert $vg/$lv1 # wait
148 check mirror $vg $lv1 $dev3
149 check mirror_no_temporaries $vg $lv1
150
151 # ---------------------------------------------------------------------
152 # removal during conversion
153
154 # "remove newly added mirror"
155 aux prepare_vg 5
156 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
157 lvconvert -m+1 -b $vg/$lv1 $dev4
158 lvconvert -m-1 $vg/$lv1 $dev4
159 lvconvert $vg/$lv1 # wait
160
161 check mirror $vg $lv1 $dev3
162 check mirror_no_temporaries $vg $lv1
163 check mirror_legs $vg $lv1 2
164
165 # "remove one of newly added mirrors"
166 aux prepare_vg 5
167 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
168 lvconvert -m+2 -b $vg/$lv1 $dev4 $dev5
169 lvconvert -m-1 $vg/$lv1 $dev4
170 lvconvert $vg/$lv1 # wait
171
172 check mirror $vg $lv1 $dev3
173 check mirror_no_temporaries $vg $lv1
174 check mirror_legs $vg $lv1 3
175
176 # "remove from original mirror (the original is still mirror)"
177 aux prepare_vg 5
178 lvcreate -l2 -m2 -n $lv1 $vg $dev1 $dev2 $dev5 $dev3:0
179 lvconvert -m+1 -b $vg/$lv1 $dev4 
180 lvconvert -m-1 $vg/$lv1 $dev2 
181 lvconvert $vg/$lv1 
182
183 check mirror $vg $lv1 $dev3
184 check mirror_no_temporaries $vg $lv1
185 check mirror_legs $vg $lv1 3
186
187 # "remove from original mirror (the original becomes linear)"
188 aux prepare_vg 5
189 lvcreate -l2 -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
190 lvconvert -m+1 -b $vg/$lv1 $dev4 
191 lvconvert -m-1 $vg/$lv1 $dev2 
192 lvconvert $vg/$lv1 
193
194 check mirror $vg $lv1 $dev3
195 check mirror_no_temporaries $vg $lv1
196 check mirror_legs $vg $lv1 2
197
198 # ---------------------------------------------------------------------
199
200 # "rhbz440405: lvconvert -m0 incorrectly fails if all PEs allocated"
201 aux prepare_vg 5
202 lvcreate -l`pvs --noheadings -ope_count $dev1` -m1 -n $lv1 $vg $dev1 $dev2 $dev3:0
203 while [ `lvs --noheadings -o copy_percent $vg/$lv1` != "100.00" ]; do sleep 1; done
204 lvconvert -m0 $vg/$lv1 $dev1
205 check linear $vg $lv1
206
207 # "rhbz264241: lvm mirror doesn't lose it's "M" --nosync attribute after being down and the up converted"
208 aux prepare_vg 5
209 lvcreate -l2 -m1 -n$lv1 --nosync $vg 
210 lvconvert -m0 $vg/$lv1
211 lvconvert -m1 $vg/$lv1
212 lvs --noheadings -o attr $vg/$lv1 | grep '^ *m'
213
214 # lvconvert from linear (on multiple PVs) to mirror
215 aux prepare_vg 5
216 lvcreate -l 8 -n $lv1 $vg $dev1:0-3 $dev2:0-3
217 lvconvert -m1 $vg/$lv1
218
219 should check mirror $vg $lv1
220 check mirror_legs $vg $lv1 2
221
222 # BZ 463272: disk log mirror convert option is lost if downconvert option is also given
223 aux prepare_vg 5
224 lvcreate -l1 -m2 --corelog -n $lv1 $vg $dev1 $dev2 $dev3
225 while [ `lvs --noheadings -o copy_percent $vg/$lv1` != "100.00" ]; do sleep 1; done
226 lvconvert -m1 --mirrorlog disk $vg/$lv1
227 check mirror $vg $lv1
228 not check mirror $vg $lv1 core
229
230 # ---
231 # add mirror and disk log
232
233 # "add 1 mirror and disk log" 
234 aux prepare_vg 5
235 lvcreate -l2 -m1 --mirrorlog core -n $lv1 $vg $dev1 $dev2
236
237 # FIXME on next line, specifying $dev3:0 $dev4 (i.e log device first) fails (!)
238 lvconvert -m+1 --mirrorlog disk -i1 $vg/$lv1 $dev4 $dev3:0
239
240 check mirror $vg $lv1 $dev3
241 check mirror_no_temporaries $vg $lv1
242 check mirror_legs $vg $lv1 3