summaryrefslogtreecommitdiff
path: root/test/shell/writecache-split.sh
blob: c68f29baab00fb5a0831f755da334679bf937379 (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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
#!/usr/bin/env bash

# Copyright (C) 2018 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

# Test single lv cache options

SKIP_WITH_LVMPOLLD=1

. lib/inittest

mkfs_mount_umount()
{
        lvt=$1

        mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lvt"
        mount "$DM_DEV_DIR/$vg/$lvt" "$mount_dir"
        cp pattern1 "$mount_dir/pattern1"
        dd if=/dev/zero of="$mount_dir/zeros2M" bs=1M count=32 conv=fdatasync
        umount "$mount_dir"
}

mount_umount()
{
        lvt=$1

        mount "$DM_DEV_DIR/$vg/$lvt" "$mount_dir"
        diff pattern1 "$mount_dir/pattern1"
        dd if="$mount_dir/zeros2M" of=/dev/null bs=1M count=32
        umount "$mount_dir"
}

aux have_writecache 1 0 0 || skip
which mkfs.xfs || skip

mount_dir="mnt"
mkdir -p "$mount_dir"

# generate random data
dd if=/dev/urandom of=pattern1 bs=512K count=1

aux prepare_devs 4 301

vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4"

lvcreate -n $lv1 -L 300 -an $vg "$dev1" "$dev4"
lvcreate -n $lv2 -l 4 -an $vg "$dev2"

#
# split while inactive
#

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

lvchange -ay $vg/$lv1
mkfs_mount_umount $lv1
lvchange -an $vg/$lv1

lvconvert --splitcache $vg/$lv1
lvs -o segtype $vg/$lv1 | grep linear
lvs -o segtype $vg/$lv2 | grep linear

lvchange -ay $vg/$lv1
mount_umount $lv1
lvchange -an $vg/$lv1

#
# split while active
#

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

lvchange -ay $vg/$lv1
mkfs_mount_umount $lv1

lvconvert --splitcache $vg/$lv1
lvs -o segtype $vg/$lv1 | grep linear
lvs -o segtype $vg/$lv2 | grep linear

mount_umount $lv1
lvchange -an $vg/$lv1

#
# split while cachevol is missing
#

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

lvchange -ay $vg/$lv1
mkfs_mount_umount $lv1
lvchange -an $vg/$lv1

aux disable_dev "$dev2"

lvs -a -o+lv_health_status $vg |tee out
grep $lv1 out | grep partial
grep $lv2 out | grep partial
check lv_attr_bit health $vg/$lv1 "p"

not lvconvert --splitcache $vg/$lv1
lvconvert --splitcache --force --yes $vg/$lv1

lvs -o segtype $vg/$lv1 | grep linear

aux enable_dev "$dev2"
lvs -o segtype $vg/$lv2 | grep linear

vgck --updatemetadata $vg
lvs $vg
vgchange -an $vg
vgextend --restoremissing $vg "$dev2"


#
# split while cachevol has 1 of 2 PVs
#

lvremove $vg/$lv2
lvcreate -n $lv2 -l 14 -an $vg "$dev2:0-10" "$dev3"

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

lvchange -ay $vg/$lv1
mkfs_mount_umount $lv1
lvchange -an $vg/$lv1

aux disable_dev "$dev3"

lvs -a -o+lv_health_status $vg |tee out
grep $lv1 out | grep partial
grep $lv2 out | grep partial
check lv_attr_bit health $vg/$lv1 "p"

not lvconvert --splitcache $vg/$lv1
lvconvert --splitcache --force --yes $vg/$lv1

lvs -o segtype $vg/$lv1 | grep linear

aux enable_dev "$dev3"
lvs -o segtype $vg/$lv2 | grep linear

vgck --updatemetadata $vg
lvs $vg
vgchange -an $vg
vgextend --restoremissing $vg "$dev3"

vgremove -ff $vg

#
# split while cachevol is damaged
#

vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4"

lvcreate -n $lv1 -L 300 -an $vg "$dev1" "$dev4"
lvcreate -n $lv2 -l 4 -an $vg "$dev2"

lvchange -ay $vg/$lv1

mkfs_mount_umount $lv1

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
diff pattern1 "$mount_dir/pattern1"
cp pattern1 "$mount_dir/pattern2"
umount "$mount_dir"
lvchange -an $vg/$lv1

dd if=/dev/zero of="$dev2" seek=1 bs=1M count=16

lvconvert --splitcache --force --yes $vg/$lv1

lvchange -ay $vg/$lv1

mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
diff pattern1 "$mount_dir/pattern1"
umount "$mount_dir"
lvchange -an $vg/$lv1

vgremove -ff $vg

#
# splitcache when origin is raid
#

vgcreate $vg "$dev1" "$dev2" "$dev3" "$dev4"

lvcreate --type raid1 -m1 -L6 -n $lv1 -an $vg "$dev1" "$dev2"
lvcreate -L6 -n $lv2 -an $vg "$dev3"
lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1
lvchange -ay $vg/$lv1
lvchange -an $vg/$lv1
lvconvert --splitcache $vg/$lv1
lvs $vg/$lv1
lvs $vg/$lv2

vgremove -ff $vg

#
# vgsplit should not separate cachevol from main lv
#

vgcreate $vg "$dev1" "$dev2" "$dev3" "$dev4"
lvcreate -L6 -n $lv1 -an $vg "$dev2"
lvcreate -L6 -n $lv2 -an $vg "$dev3"
lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1
fail vgsplit $vg $vg1 "$dev2"
fail vgsplit $vg $vg1 "$dev3"
lvremove $vg/$lv1
vgremove $vg

#
# uncache
#
vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4"

# while inactive

lvcreate -n $lv1 -L 300 -an $vg "$dev1" "$dev4"
lvcreate -n $lv2 -l 4 -an $vg "$dev2"

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

lvchange -ay $vg/$lv1
mkfs_mount_umount $lv1
lvchange -an $vg/$lv1

lvconvert --uncache $vg/$lv1
lvs -o segtype $vg/$lv1 | grep linear
not lvs $vg/$lv2

lvchange -ay $vg/$lv1
mount_umount $lv1
lvchange -an $vg/$lv1
lvremove -y $vg/$lv1

# while active

lvcreate -n $lv1 -L 300 -an $vg "$dev1" "$dev4"
lvcreate -n $lv2 -l 4 -an $vg "$dev2"

lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1

lvchange -ay $vg/$lv1
mkfs_mount_umount $lv1

lvconvert --uncache $vg/$lv1
lvs -o segtype $vg/$lv1 | grep linear
not lvs $vg/$lv2

lvchange -an $vg/$lv1
lvchange -ay $vg/$lv1
mount_umount $lv1
lvchange -an $vg/$lv1
lvremove -y $vg/$lv1

vgremove -ff $vg