summaryrefslogtreecommitdiff
path: root/test/shell/caching-snapshot.sh
blob: d73f4ad06d12a23e65f54575e871113d0d6b9f4a (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
#!/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 snapshot on cache|writecache

SKIP_WITH_LVMPOLLD=1

. lib/inittest

lvm segtypes 2>/dev/null | grep writecache$ >/dev/null || {
	skip 'Writecache is not built-in.'
}
aux have_cache 1 10 0 || skip
which mkfs.ext4 || skip

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

mount_dir_snap="mnt_snap"
mkdir -p "$mount_dir_snap"

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

aux prepare_devs 2 310

vgcreate $SHARED $vg "$dev1" "$dev2"

# creating a snapshot on top of a cache|writecache

test_snap_create() {
	# cache | writecache
	local convert_type=$1

	# --cachepool | --cachevol
	local convert_option=$2

	lvcreate -n $lv1 -L 300 -an $vg "$dev1"
	lvcreate -n fast -l 4 -an $vg "$dev2"
	lvconvert -y --type $convert_type $convert_option fast $vg/$lv1
	lvchange -ay $vg/$lv1
	mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
	mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
	cp pattern1 "$mount_dir/pattern1a"
	lvcreate -s -L 32 -n snap $vg/$lv1
	cp pattern1 "$mount_dir/pattern1b"
	mount "$DM_DEV_DIR/$vg/snap" "$mount_dir_snap"
	not ls "$mount_dir_snap/pattern1b"
	rm "$mount_dir/pattern1a"
	diff pattern1 "$mount_dir_snap/pattern1a"
	umount "$mount_dir_snap"
	lvconvert --splitcache $vg/$lv1
	umount "$mount_dir"
	lvchange -an $vg/$lv1
	lvchange -an $vg/fast
	lvremove $vg/snap
	lvremove $vg/$lv1
	lvremove $vg/fast
}

test_snap_create cache --cachepool
test_snap_create cache --cachevol
test_snap_create writecache --cachevol

# removing cache|writecache while snapshot exists

test_snap_remove() {
	# cache | writecache
	local convert_type=$1

	# --cachepool | --cachevol
	local convert_option=$2

	lvcreate -n $lv1 -L 300 -an $vg "$dev1"
	lvcreate -n fast -l 4 -an $vg "$dev2"
	lvconvert -y --type $convert_type $convert_option fast $vg/$lv1
	lvchange -ay $vg/$lv1
	mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
	mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
	cp pattern1 "$mount_dir/pattern1a"
	lvcreate -s -L 32 -n snap $vg/$lv1
	cp pattern1 "$mount_dir/pattern1b"
	lvconvert --splitcache $vg/$lv1
	mount "$DM_DEV_DIR/$vg/snap" "$mount_dir_snap"
	not ls "$mount_dir_snap/pattern1b"
	rm "$mount_dir/pattern1a"
	diff pattern1 "$mount_dir_snap/pattern1a"
	umount "$mount_dir_snap"
	umount "$mount_dir"
	lvchange -an $vg/$lv1
	lvchange -an $vg/fast
	lvremove $vg/snap
	lvremove $vg/$lv1
	lvremove $vg/fast
}

test_snap_remove cache --cachepool
test_snap_remove cache --cachevol
test_snap_remove writecache --cachevol

# adding cache|writecache to an LV that has a snapshot

test_caching_with_snap() {
	# cache | writecache
	local convert_type=$1

	# --cachepool | --cachevol
	local convert_option=$2

	lvcreate -n $lv1 -L 300 -an $vg "$dev1"
	lvcreate -n fast -l 4 -an $vg "$dev2"
	lvchange -ay $vg/$lv1
	mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
	mount "$DM_DEV_DIR/$vg/$lv1" "$mount_dir"
	cp pattern1 "$mount_dir/pattern1a"
	lvcreate -s -L 32 -n snap $vg/$lv1
	lvconvert -y --type $convert_type $convert_option fast $vg/$lv1
	cp pattern1 "$mount_dir/pattern1b"
	mount "$DM_DEV_DIR/$vg/snap" "$mount_dir_snap"
	not ls "$mount_dir_snap/pattern1b"
	mv "$mount_dir/pattern1a" "$mount_dir/pattern1c"
	diff pattern1 "$mount_dir_snap/pattern1a"
	lvconvert --splitcache $vg/$lv1
	diff pattern1 "$mount_dir/pattern1c"
	diff pattern1 "$mount_dir_snap/pattern1a"
	umount "$mount_dir_snap"
	umount "$mount_dir"
	lvchange -an $vg/$lv1
	lvchange -an $vg/fast
	lvremove $vg/snap
	lvremove $vg/$lv1
	lvremove $vg/fast
}

test_caching_with_snap cache --cachepool
test_caching_with_snap cache --cachevol
test_caching_with_snap writecache --cachevol

# adding cache|writecache to a snapshot is not allowed

lvcreate -n $lv1 -L 300 $vg "$dev1"
lvcreate -n fast -l 4 $vg "$dev2"
mkfs.ext4 "$DM_DEV_DIR/$vg/$lv1"
lvcreate -s -L 32 -n snap $vg/$lv1
not lvconvert -y --type writecache --cachevol fast $vg/snap
not lvconvert -y --type cache --cachevol fast $vg/snap
not lvconvert -y --type cache --cachepool fast $vg/snap
vgchange -an $vg
lvremove $vg/snap
lvremove $vg/$lv1
lvremove $vg/fast

vgremove -ff $vg