summaryrefslogtreecommitdiff
path: root/test/shell/lvconvert-raid-reshape.sh
blob: abea0ff100a6faab9e677f686ea84391128290a5 (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
#!/usr/bin/env bash

# Copyright (C) 2017 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, MA2110-1301 USA


SKIP_WITH_LVMPOLLD=1

LVM_SKIP_LARGE_TESTS=0

. lib/inittest

case "$(uname -r)" in
5.19*) skip "Skippen test that kills this kernel" ;;
esac

which mkfs.ext4 || skip
aux have_raid 1 14 0 || skip

test "$(aux total_mem)" -gt 1048576 || skip "Not enough RAM for this test"

if [ $LVM_SKIP_LARGE_TESTS -eq 0 ]
then
	aux prepare_pvs 65 9
else
	aux prepare_pvs 20 9
fi

get_devs

vgcreate $SHARED -s 1M "$vg" "${DEVICES[@]}"

function _lvcreate
{
	local level=$1
	local req_stripes=$2
	local stripes=$3
	local size=$4
	local vg=$5
	local lv=$6

	lvcreate -y -aey --type $level -i $req_stripes -L $size -n $lv $vg
	check lv_first_seg_field $vg/$lv segtype "$level"
	check lv_first_seg_field $vg/$lv datastripes $req_stripes
	check lv_first_seg_field $vg/$lv stripes $stripes
	mkfs.ext4 "$DM_DEV_DIR/$vg/$lv"
	fsck -fn "$DM_DEV_DIR/$vg/$lv"
}

function _lvconvert
{
	local req_level=$1
	local level=$2
	local data_stripes=$3
	local stripes=$4
	local vg=$5
	local lv=$6
	local region_size=${7-}
	local wait_and_check=1
	local R=""

	[ -n "$region_size" ] && R="-R $region_size"
	[ "${level:0:7}" = "striped" ] && wait_and_check=0
	[ "${level:0:5}" = "raid0" ] && wait_and_check=0

	lvconvert -y --ty $req_level $R $vg/$lv || return $?

	check lv_first_seg_field $vg/$lv segtype "$level"
	check lv_first_seg_field $vg/$lv data_stripes $data_stripes
	check lv_first_seg_field $vg/$lv stripes $stripes
	[ -n "$region_size" ] && check lv_field $vg/$lv regionsize $region_size
	if [ "$wait_and_check" -eq 1 ]
	then
		fsck -fn "$DM_DEV_DIR/$vg/$lv"
		aux wait_for_sync $vg $lv
	fi
	fsck -fn "$DM_DEV_DIR/$vg/$lv"
}

function _reshape_layout
{
	local type=$1
	shift
	local data_stripes=$1
	shift
	local stripes=$1
	shift
	local vg=$1
	shift
	local lv=$1
	shift
	local opts="$*"
	local ignore_a_chars=0

	[[ "$opts" =~ "--stripes" ]] && ignore_a_chars=1

	lvconvert -y --ty $type $opts $vg/$lv
	check lv_first_seg_field $vg/$lv segtype "$type"
	check lv_first_seg_field $vg/$lv data_stripes $data_stripes
	check lv_first_seg_field $vg/$lv stripes $stripes
	aux wait_for_sync $vg $lv $ignore_a_chars
	fsck -fn "$DM_DEV_DIR/$vg/$lv"
}

# Delay leg so that rebuilding status characters
#  can be read before resync finished too quick.
# aux delay_dev "$dev1" 1

#
# Start out with raid5(_ls)
#

# Create 3-way striped raid5 (4 legs total)
# _lvcreate raid5_ls 3 4 16M $vg $lv1
_lvcreate raid5_ls 3 4 16M $vg $lv1
check lv_first_seg_field $vg/$lv1 segtype "raid5_ls"
aux wait_for_sync $vg $lv1

# Reshape it to 256K stripe size
_reshape_layout raid5_ls 3 4 $vg $lv1 --stripesize 256K
check lv_first_seg_field $vg/$lv1 stripesize "256.00k"

# Convert raid5(_n) -> striped testing raid5_ls gets rejected
not _lvconvert striped striped 3 3 $vg $lv1 512k
_reshape_layout raid5_n 3 4 $vg $lv1
_lvconvert striped striped 3 3 $vg $lv1

# Convert striped -> raid5_n
_lvconvert raid5_n raid5_n 3 4 $vg $lv1 "" 1

# Convert raid5_n -> raid5_ls
_reshape_layout raid5_ls 3 4 $vg $lv1

# Convert raid5_ls to 5 stripes
_reshape_layout raid5_ls 5 6 $vg $lv1 --stripes 5

# Convert raid5_ls back to 3 stripes
_reshape_layout raid5_ls 3 6 $vg $lv1 --stripes 3 --force
_reshape_layout raid5_ls 3 4 $vg $lv1 --stripes 3

# Convert raid5_ls to 7 stripes
_reshape_layout raid5_ls 7 8 $vg $lv1 --stripes 7

# Convert raid5_ls to 9 stripes
_reshape_layout raid5_ls 9 10 $vg $lv1 --stripes 9

# Convert raid5_ls to 14 stripes
_reshape_layout raid5_ls 14 15 $vg $lv1 --stripes 14

if [ $LVM_SKIP_LARGE_TESTS -eq 0 ]
then
	# Convert raid5_ls to 63 stripes
	_reshape_layout raid5_ls 63 64 $vg $lv1 --stripes 63

	# Convert raid5_ls back to 27 stripes
	_reshape_layout raid5_ls 27 64 $vg $lv1 --stripes 27 --force
	_reshape_layout raid5_ls 27 28 $vg $lv1 --stripes 27

	# Convert raid5_ls back to 4 stripes checking
	# conversion to striped/raid* gets rejected
	# with existing LVs to be removed afer reshape
	_reshape_layout raid5_ls 4 28 $vg $lv1 --stripes 4 --force
else
	# Convert raid5_ls back to 4 stripes checking
	# conversion to striped/raid* gets rejected
	# with existing LVs to be removed afer reshape
	_reshape_layout raid5_ls 4 15 $vg $lv1 --stripes 4 --force
fi

# No we got the data reshaped and the freed SubLVs still present
# -> check takeover request gets rejected
not lvconvert --yes --type striped $vg/$lv1
not lvconvert --yes --type raid0 $vg/$lv1
not lvconvert --yes --type "$DM_DEV_DIR/raid0_meta $vg/$lv1"
not lvconvert --yes --type "$DM_DEV_DIR/raid6 $vg/$lv1"
# Remove the freed SubLVs
_reshape_layout raid5_ls 4 5 $vg $lv1 --stripes 4

# Convert raid5_ls back to 3 stripes
_reshape_layout raid5_ls 3 5 $vg $lv1 --stripes 3 --force
_reshape_layout raid5_ls 3 4 $vg $lv1 --stripes 3

# Convert raid5_ls -> raid5_rs
_reshape_layout raid5_rs 3 4 $vg $lv1

# Convert raid5_rs -> raid5_la
_reshape_layout raid5_la 3 4 $vg $lv1

# Convert raid5_la -> raid5_ra
_reshape_layout raid5_ra 3 4 $vg $lv1

# Convert raid5_ra -> raid6_ra_6
_lvconvert raid6_ra_6 raid6_ra_6 3 5 $vg $lv1 "4.00m" 1

# Convert raid5_la -> raid6(_zr)
_reshape_layout raid6 3 5 $vg $lv1

# Convert raid6(_zr) -> raid6_nc
_reshape_layout raid6_nc 3 5 $vg $lv1

# Convert raid6(_nc) -> raid6_nr
_reshape_layout raid6_nr 3 5 $vg $lv1

# Convert raid6_nr) -> raid6_rs_6
_reshape_layout raid6_rs_6 3 5 $vg $lv1

# Convert raid6_rs_6 to 5 stripes
_reshape_layout raid6_rs_6 5 7 $vg $lv1 --stripes 5

# Convert raid6_rs_6 to 4 stripes
_reshape_layout raid6_rs_6 4 7 $vg $lv1 --stripes 4 --force
_reshape_layout raid6_rs_6 4 6 $vg $lv1 --stripes 4
check lv_first_seg_field $vg/$lv1 stripesize "256.00k"

# Convert raid6_rs_6 to raid6_n_6
_reshape_layout raid6_n_6 4 6 $vg $lv1

# Convert raid6_n_6 -> striped
_lvconvert striped striped 4 4 $vg $lv1
check lv_first_seg_field $vg/$lv1 stripesize "256.00k"

# Convert striped -> raid10(_near)
_lvconvert raid10 raid10 4 8 $vg $lv1

# Convert raid10 to 10 stripes and 64K stripesize
# FIXME: change once we support odd numbers of raid10 stripes
not _reshape_layout raid10 4 9 $vg $lv1 --stripes 9 --stripesize 64K
_reshape_layout raid10 10 20 $vg $lv1 --stripes 10 --stripesize 64K
check lv_first_seg_field $vg/$lv1 stripesize "64.00k"

# Convert raid6_n_6 -> striped
_lvconvert striped striped 10 10 $vg $lv1
check lv_first_seg_field $vg/$lv1 stripesize "64.00k"

vgremove -ff $vg