xref: /spdk/test/bdev/bdev_raid.sh (revision 1e148debea22f8054d51cbda549a778bc8da1d78)
13d951cd3SXiaodong Liu#!/usr/bin/env bash
2eb53c232Spaul luse#  SPDX-License-Identifier: BSD-3-Clause
3eb53c232Spaul luse#  Copyright (C) 2019 Intel Corporation
4eb53c232Spaul luse#  All rights reserved.
5eb53c232Spaul luse#
63d951cd3SXiaodong Liutestdir=$(readlink -f $(dirname $0))
73d951cd3SXiaodong Liurootdir=$(readlink -f $testdir/../..)
85d6ea30dSArtur Paszkiewicztmp_dir=$SPDK_TEST_STORAGE/raidtest
95d6ea30dSArtur Paszkiewicztmp_file=$tmp_dir/raidrandtest
103d951cd3SXiaodong Liu
113d951cd3SXiaodong Liusource $rootdir/test/common/autotest_common.sh
123d951cd3SXiaodong Liusource $testdir/nbd_common.sh
133d951cd3SXiaodong Liu
14141bc565SArtur Paszkiewiczrpc_py=rpc_cmd
15eaebf841SKrzysztof Karas
163d951cd3SXiaodong Liufunction raid_unmap_data_verify() {
173d951cd3SXiaodong Liu	if hash blkdiscard; then
183d951cd3SXiaodong Liu		local nbd=$1
19074df1d8SPawel Kaminski		local blksize
20074df1d8SPawel Kaminski		blksize=$(lsblk -o LOG-SEC $nbd | grep -v LOG-SEC | cut -d ' ' -f 5)
213d951cd3SXiaodong Liu		local rw_blk_num=4096
223d951cd3SXiaodong Liu		local rw_len=$((blksize * rw_blk_num))
233d951cd3SXiaodong Liu		local unmap_blk_offs=(0 1028 321)
243d951cd3SXiaodong Liu		local unmap_blk_nums=(128 2035 456)
253d951cd3SXiaodong Liu		local unmap_off
263d951cd3SXiaodong Liu		local unmap_len
273d951cd3SXiaodong Liu
283d951cd3SXiaodong Liu		# data write
293d951cd3SXiaodong Liu		dd if=/dev/urandom of=$tmp_file bs=$blksize count=$rw_blk_num
303d951cd3SXiaodong Liu		dd if=$tmp_file of=$nbd bs=$blksize count=$rw_blk_num oflag=direct
313d951cd3SXiaodong Liu		blockdev --flushbufs $nbd
323d951cd3SXiaodong Liu
333d951cd3SXiaodong Liu		# confirm random data is written correctly in raid0 device
343d951cd3SXiaodong Liu		cmp -b -n $rw_len $tmp_file $nbd
353d951cd3SXiaodong Liu
363d951cd3SXiaodong Liu		for ((i = 0; i < ${#unmap_blk_offs[@]}; i++)); do
373d951cd3SXiaodong Liu			unmap_off=$((blksize * ${unmap_blk_offs[$i]}))
383d951cd3SXiaodong Liu			unmap_len=$((blksize * ${unmap_blk_nums[$i]}))
393d951cd3SXiaodong Liu
403d951cd3SXiaodong Liu			# data unmap on tmp_file
413d951cd3SXiaodong Liu			dd if=/dev/zero of=$tmp_file bs=$blksize seek=${unmap_blk_offs[$i]} count=${unmap_blk_nums[$i]} conv=notrunc
423d951cd3SXiaodong Liu
433d951cd3SXiaodong Liu			# data unmap on raid bdev
443d951cd3SXiaodong Liu			blkdiscard -o $unmap_off -l $unmap_len $nbd
453d951cd3SXiaodong Liu			blockdev --flushbufs $nbd
463d951cd3SXiaodong Liu
473d951cd3SXiaodong Liu			# data verify after unmap
483d951cd3SXiaodong Liu			cmp -b -n $rw_len $tmp_file $nbd
493d951cd3SXiaodong Liu		done
503d951cd3SXiaodong Liu	fi
513d951cd3SXiaodong Liu
523d951cd3SXiaodong Liu	return 0
533d951cd3SXiaodong Liu}
543d951cd3SXiaodong Liu
555d6ea30dSArtur Paszkiewiczfunction cleanup() {
565d6ea30dSArtur Paszkiewicz	if [ -n "$raid_pid" ] && ps -p $raid_pid > /dev/null; then
573d951cd3SXiaodong Liu		killprocess $raid_pid
583d951cd3SXiaodong Liu	fi
593d951cd3SXiaodong Liu
605d6ea30dSArtur Paszkiewicz	rm -rf "$tmp_dir"
613d951cd3SXiaodong Liu}
623d951cd3SXiaodong Liu
633d951cd3SXiaodong Liufunction raid_function_test() {
6464eebbd1Syupeng	local raid_level=$1
653d951cd3SXiaodong Liu	local nbd=/dev/nbd0
663d951cd3SXiaodong Liu	local raid_bdev
673d951cd3SXiaodong Liu
68141bc565SArtur Paszkiewicz	$rootdir/test/app/bdev_svc/bdev_svc -i 0 -L bdev_raid &
693d951cd3SXiaodong Liu	raid_pid=$!
703d951cd3SXiaodong Liu	echo "Process raid pid: $raid_pid"
71141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
723d951cd3SXiaodong Liu
733b3688f8SArtur Paszkiewicz	$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b Base_1
743b3688f8SArtur Paszkiewicz	$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b Base_2
753b3688f8SArtur Paszkiewicz	$rpc_py bdev_raid_create -z 64 -r $raid_level -b "'Base_1 Base_2'" -n raid
763b3688f8SArtur Paszkiewicz
77ec6d94b6SArtur Paszkiewicz	raid_bdev=$($rpc_py bdev_raid_get_bdevs online | jq -r '.[0]["name"] | select(.)')
783d951cd3SXiaodong Liu	if [ $raid_bdev = "" ]; then
793d951cd3SXiaodong Liu		echo "No raid0 device in SPDK app"
803d951cd3SXiaodong Liu		return 1
813d951cd3SXiaodong Liu	fi
823d951cd3SXiaodong Liu
83141bc565SArtur Paszkiewicz	nbd_start_disks $DEFAULT_RPC_ADDR $raid_bdev $nbd
84141bc565SArtur Paszkiewicz	count=$(nbd_get_count $DEFAULT_RPC_ADDR)
853d951cd3SXiaodong Liu	if [ $count -ne 1 ]; then
8639e8a95cSPawel Kaminski		return 1
873d951cd3SXiaodong Liu	fi
883d951cd3SXiaodong Liu
89141bc565SArtur Paszkiewicz	raid_unmap_data_verify $nbd
903d951cd3SXiaodong Liu
91141bc565SArtur Paszkiewicz	nbd_stop_disks $DEFAULT_RPC_ADDR $nbd
92141bc565SArtur Paszkiewicz	count=$(nbd_get_count $DEFAULT_RPC_ADDR)
933d951cd3SXiaodong Liu	if [ $count -ne 0 ]; then
9439e8a95cSPawel Kaminski		return 1
953d951cd3SXiaodong Liu	fi
963d951cd3SXiaodong Liu
973d951cd3SXiaodong Liu	killprocess $raid_pid
983d951cd3SXiaodong Liu
993d951cd3SXiaodong Liu	return 0
1003d951cd3SXiaodong Liu}
1013d951cd3SXiaodong Liu
102255d0786SArtur Paszkiewiczfunction verify_raid_bdev_state() {
103b2fc42ebSArtur Paszkiewicz	local raid_bdev_name=$1
104b2fc42ebSArtur Paszkiewicz	local expected_state=$2
105b2fc42ebSArtur Paszkiewicz	local raid_level=$3
106b2fc42ebSArtur Paszkiewicz	local strip_size=$4
107255d0786SArtur Paszkiewicz	local num_base_bdevs_operational=$5
108b2fc42ebSArtur Paszkiewicz	local raid_bdev_info
109b2fc42ebSArtur Paszkiewicz	local num_base_bdevs
110b2fc42ebSArtur Paszkiewicz	local num_base_bdevs_discovered
111b2fc42ebSArtur Paszkiewicz	local tmp
112b2fc42ebSArtur Paszkiewicz
113255d0786SArtur Paszkiewicz	raid_bdev_info=$($rpc_py bdev_raid_get_bdevs all | jq -r ".[] | select(.name == \"$raid_bdev_name\")")
114255d0786SArtur Paszkiewicz
115255d0786SArtur Paszkiewicz	xtrace_disable
116255d0786SArtur Paszkiewicz	if [ -z "$raid_bdev_info" ]; then
117255d0786SArtur Paszkiewicz		echo "No raid device \"$raid_bdev_name\" in SPDK app"
118b2fc42ebSArtur Paszkiewicz		return 1
119b2fc42ebSArtur Paszkiewicz	fi
120b2fc42ebSArtur Paszkiewicz
121b2fc42ebSArtur Paszkiewicz	raid_bdev_info=$($rpc_py bdev_raid_get_bdevs $expected_state | jq -r ".[] | select(.name == \"$raid_bdev_name\")")
122b2fc42ebSArtur Paszkiewicz	if [ -z "$raid_bdev_info" ]; then
123b2fc42ebSArtur Paszkiewicz		echo "$raid_bdev_name is not in $expected_state state"
124b2fc42ebSArtur Paszkiewicz		return 1
125b2fc42ebSArtur Paszkiewicz	fi
126b2fc42ebSArtur Paszkiewicz
127b2fc42ebSArtur Paszkiewicz	tmp=$(echo $raid_bdev_info | jq -r '.state')
128b2fc42ebSArtur Paszkiewicz	if [ "$tmp" != $expected_state ]; then
129b2fc42ebSArtur Paszkiewicz		echo "incorrect state: $tmp, expected: $expected_state"
130b2fc42ebSArtur Paszkiewicz		return 1
131b2fc42ebSArtur Paszkiewicz	fi
132b2fc42ebSArtur Paszkiewicz
133b2fc42ebSArtur Paszkiewicz	tmp=$(echo $raid_bdev_info | jq -r '.raid_level')
134b2fc42ebSArtur Paszkiewicz	if [ "$tmp" != $raid_level ]; then
135b2fc42ebSArtur Paszkiewicz		echo "incorrect level: $tmp, expected: $raid_level"
136b2fc42ebSArtur Paszkiewicz		return 1
137b2fc42ebSArtur Paszkiewicz	fi
138b2fc42ebSArtur Paszkiewicz
139b2fc42ebSArtur Paszkiewicz	tmp=$(echo $raid_bdev_info | jq -r '.strip_size_kb')
140b2fc42ebSArtur Paszkiewicz	if [ "$tmp" != $strip_size ]; then
141b2fc42ebSArtur Paszkiewicz		echo "incorrect strip size: $tmp, expected: $strip_size"
142b2fc42ebSArtur Paszkiewicz		return 1
143b2fc42ebSArtur Paszkiewicz	fi
144b2fc42ebSArtur Paszkiewicz
145c51db566SArtur Paszkiewicz	num_base_bdevs=$(echo $raid_bdev_info | jq -r '[.base_bdevs_list[]] | length')
146b2fc42ebSArtur Paszkiewicz	tmp=$(echo $raid_bdev_info | jq -r '.num_base_bdevs')
147b2fc42ebSArtur Paszkiewicz	if [ "$num_base_bdevs" != "$tmp" ]; then
148b2fc42ebSArtur Paszkiewicz		echo "incorrect num_base_bdevs: $tmp, expected: $num_base_bdevs"
149b2fc42ebSArtur Paszkiewicz		return 1
150b2fc42ebSArtur Paszkiewicz	fi
151b2fc42ebSArtur Paszkiewicz
152c51db566SArtur Paszkiewicz	num_base_bdevs_discovered=$(echo $raid_bdev_info | jq -r '[.base_bdevs_list[] | select(.is_configured)] | length')
153b2fc42ebSArtur Paszkiewicz	tmp=$(echo $raid_bdev_info | jq -r '.num_base_bdevs_discovered')
154b2fc42ebSArtur Paszkiewicz	if [ "$num_base_bdevs_discovered" != "$tmp" ]; then
155b2fc42ebSArtur Paszkiewicz		echo "incorrect num_base_bdevs_discovered: $tmp, expected: $num_base_bdevs_discovered"
156b2fc42ebSArtur Paszkiewicz		return 1
157b2fc42ebSArtur Paszkiewicz	fi
158255d0786SArtur Paszkiewicz
159255d0786SArtur Paszkiewicz	tmp=$(echo $raid_bdev_info | jq -r '.num_base_bdevs_operational')
160255d0786SArtur Paszkiewicz	if [ "$num_base_bdevs_operational" != "$tmp" ]; then
161255d0786SArtur Paszkiewicz		echo "incorrect num_base_bdevs_operational $tmp, expected: $num_base_bdevs_operational"
162255d0786SArtur Paszkiewicz		return 1
163255d0786SArtur Paszkiewicz	fi
164255d0786SArtur Paszkiewicz
165255d0786SArtur Paszkiewicz	xtrace_restore
166255d0786SArtur Paszkiewicz}
167b2fc42ebSArtur Paszkiewicz
1681c715097SArtur Paszkiewiczfunction verify_raid_bdev_process() {
1691c715097SArtur Paszkiewicz	local raid_bdev_name=$1
1701c715097SArtur Paszkiewicz	local process_type=$2
1711c715097SArtur Paszkiewicz	local target=$3
1721c715097SArtur Paszkiewicz	local raid_bdev_info
1731c715097SArtur Paszkiewicz
1741c715097SArtur Paszkiewicz	raid_bdev_info=$($rpc_py bdev_raid_get_bdevs all | jq -r ".[] | select(.name == \"$raid_bdev_name\")")
1751c715097SArtur Paszkiewicz
1761c715097SArtur Paszkiewicz	[[ $(jq -r '.process.type // "none"' <<< "$raid_bdev_info") == "$process_type" ]]
1771c715097SArtur Paszkiewicz	[[ $(jq -r '.process.target // "none"' <<< "$raid_bdev_info") == "$target" ]]
1781c715097SArtur Paszkiewicz}
1791c715097SArtur Paszkiewicz
180d18ccc61SArtur Paszkiewiczfunction verify_raid_bdev_properties() {
181d18ccc61SArtur Paszkiewicz	local raid_bdev_name=$1
182d18ccc61SArtur Paszkiewicz	local raid_bdev_info
183d18ccc61SArtur Paszkiewicz	local base_bdev_names
184d18ccc61SArtur Paszkiewicz	local name
18503f2331bSArtur Paszkiewicz	local cmp_raid_bdev cmp_base_bdev
186d18ccc61SArtur Paszkiewicz
187d18ccc61SArtur Paszkiewicz	raid_bdev_info=$($rpc_py bdev_get_bdevs -b $raid_bdev_name | jq '.[]')
188d18ccc61SArtur Paszkiewicz	base_bdev_names=$(jq -r '.driver_specific.raid.base_bdevs_list[] | select(.is_configured == true).name' <<< "$raid_bdev_info")
18903f2331bSArtur Paszkiewicz	cmp_raid_bdev=$(jq -r '[.block_size, .md_size, .md_interleave, .dif_type] | join(" ")' <<< "$raid_bdev_info")
190d18ccc61SArtur Paszkiewicz
191d18ccc61SArtur Paszkiewicz	for name in $base_bdev_names; do
19203f2331bSArtur Paszkiewicz		cmp_base_bdev=$($rpc_py bdev_get_bdevs -b $name | jq -r '.[] | [.block_size, .md_size, .md_interleave, .dif_type] | join(" ")')
19303f2331bSArtur Paszkiewicz		[[ "$cmp_raid_bdev" == "$cmp_base_bdev" ]]
194d18ccc61SArtur Paszkiewicz	done
195d18ccc61SArtur Paszkiewicz}
196d18ccc61SArtur Paszkiewicz
1975cb235ebSArtur Paszkiewiczfunction has_redundancy() {
1985cb235ebSArtur Paszkiewicz	case $1 in
1995cb235ebSArtur Paszkiewicz		"raid1" | "raid5f") return 0 ;;
2005cb235ebSArtur Paszkiewicz		*) return 1 ;;
2015cb235ebSArtur Paszkiewicz	esac
2025cb235ebSArtur Paszkiewicz}
2035cb235ebSArtur Paszkiewicz
204df1e07e9SGangCaofunction raid_state_function_test() {
205df1e07e9SGangCao	local raid_level=$1
2067dbff527SArtur Paszkiewicz	local num_base_bdevs=$2
2079222ff97SArtur Paszkiewicz	local superblock=$3
208df1e07e9SGangCao	local raid_bdev
2097dbff527SArtur Paszkiewicz	local base_bdevs=($(for ((i = 1; i <= num_base_bdevs; i++)); do echo BaseBdev$i; done))
210df1e07e9SGangCao	local raid_bdev_name="Existed_Raid"
211bc1bd85eSArtur Paszkiewicz	local strip_size
212bc1bd85eSArtur Paszkiewicz	local strip_size_create_arg
2139222ff97SArtur Paszkiewicz	local superblock_create_arg
214bc1bd85eSArtur Paszkiewicz
215bc1bd85eSArtur Paszkiewicz	if [ $raid_level != "raid1" ]; then
216bc1bd85eSArtur Paszkiewicz		strip_size=64
217bc1bd85eSArtur Paszkiewicz		strip_size_create_arg="-z $strip_size"
218bc1bd85eSArtur Paszkiewicz	else
219bc1bd85eSArtur Paszkiewicz		strip_size=0
220bc1bd85eSArtur Paszkiewicz	fi
221df1e07e9SGangCao
2229222ff97SArtur Paszkiewicz	if [ $superblock = true ]; then
2239222ff97SArtur Paszkiewicz		superblock_create_arg="-s"
2249222ff97SArtur Paszkiewicz	else
2259222ff97SArtur Paszkiewicz		superblock_create_arg=""
2269222ff97SArtur Paszkiewicz	fi
2279222ff97SArtur Paszkiewicz
228141bc565SArtur Paszkiewicz	$rootdir/test/app/bdev_svc/bdev_svc -i 0 -L bdev_raid &
229df1e07e9SGangCao	raid_pid=$!
230df1e07e9SGangCao	echo "Process raid pid: $raid_pid"
231141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
232df1e07e9SGangCao
233df1e07e9SGangCao	# Step1: create a RAID bdev with no base bdevs
234df1e07e9SGangCao	# Expect state: CONFIGURING
2353be45abbSJim Harris	$rpc_py bdev_raid_create $strip_size_create_arg $superblock_create_arg -r $raid_level -b "'${base_bdevs[*]}'" -n $raid_bdev_name
236255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
2378ffc55aeSArtur Paszkiewicz	$rpc_py bdev_raid_delete $raid_bdev_name
238df1e07e9SGangCao
239df1e07e9SGangCao	# Step2: create one base bdev and add to the RAID bdev
240df1e07e9SGangCao	# Expect state: CONFIGURING
2413be45abbSJim Harris	$rpc_py bdev_raid_create $strip_size_create_arg $superblock_create_arg -r $raid_level -b "'${base_bdevs[*]}'" -n $raid_bdev_name
242d18ccc61SArtur Paszkiewicz	$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b ${base_bdevs[0]}
2437dbff527SArtur Paszkiewicz	waitforbdev ${base_bdevs[0]}
244255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
2458ffc55aeSArtur Paszkiewicz	$rpc_py bdev_raid_delete $raid_bdev_name
246df1e07e9SGangCao
2477dbff527SArtur Paszkiewicz	# Step3: create remaining base bdevs and add to the RAID bdev
248df1e07e9SGangCao	# Expect state: ONLINE
2493be45abbSJim Harris	$rpc_py bdev_raid_create $strip_size_create_arg $superblock_create_arg -r $raid_level -b "'${base_bdevs[*]}'" -n $raid_bdev_name
2507dbff527SArtur Paszkiewicz	for ((i = 1; i < num_base_bdevs; i++)); do
251255d0786SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
252d18ccc61SArtur Paszkiewicz		$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b ${base_bdevs[$i]}
2537dbff527SArtur Paszkiewicz		waitforbdev ${base_bdevs[$i]}
2547dbff527SArtur Paszkiewicz	done
255255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs
256d18ccc61SArtur Paszkiewicz	verify_raid_bdev_properties $raid_bdev_name
257df1e07e9SGangCao
258df1e07e9SGangCao	# Step4: delete one base bdev from the RAID bdev
2597dbff527SArtur Paszkiewicz	$rpc_py bdev_malloc_delete ${base_bdevs[0]}
260bc1bd85eSArtur Paszkiewicz	local expected_state
2615cb235ebSArtur Paszkiewicz	if ! has_redundancy $raid_level; then
262bc1bd85eSArtur Paszkiewicz		expected_state="offline"
263bc1bd85eSArtur Paszkiewicz	else
264bc1bd85eSArtur Paszkiewicz		expected_state="online"
265bc1bd85eSArtur Paszkiewicz	fi
266255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name $expected_state $raid_level $strip_size $((num_base_bdevs - 1))
267df1e07e9SGangCao
2687dbff527SArtur Paszkiewicz	# Step5: delete remaining base bdevs from the RAID bdev
269dccdd1e5SArtur Paszkiewicz	# Expect state: removed from system
2707dbff527SArtur Paszkiewicz	for ((i = 1; i < num_base_bdevs; i++)); do
2717dbff527SArtur Paszkiewicz		raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[0]["name"]')
2727dbff527SArtur Paszkiewicz		if [ "$raid_bdev" != $raid_bdev_name ]; then
2737dbff527SArtur Paszkiewicz			echo "$raid_bdev_name removed before all base bdevs were deleted"
2747dbff527SArtur Paszkiewicz			return 1
2757dbff527SArtur Paszkiewicz		fi
2767dbff527SArtur Paszkiewicz		$rpc_py bdev_malloc_delete ${base_bdevs[$i]}
2777dbff527SArtur Paszkiewicz	done
278ec6d94b6SArtur Paszkiewicz	raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[0]["name"] | select(.)')
279dccdd1e5SArtur Paszkiewicz	if [ -n "$raid_bdev" ]; then
280dccdd1e5SArtur Paszkiewicz		echo "$raid_bdev_name is not removed"
281dccdd1e5SArtur Paszkiewicz		return 1
282dccdd1e5SArtur Paszkiewicz	fi
283df1e07e9SGangCao
2842a1b861bSArtur Paszkiewicz	if [ $num_base_bdevs -gt 2 ]; then
2852a1b861bSArtur Paszkiewicz		# Test removing and re-adding base bdevs when in CONFIGURING state
2862a1b861bSArtur Paszkiewicz		for ((i = 1; i < num_base_bdevs; i++)); do
2872a1b861bSArtur Paszkiewicz			$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b ${base_bdevs[$i]}
2882a1b861bSArtur Paszkiewicz			waitforbdev ${base_bdevs[$i]}
2892a1b861bSArtur Paszkiewicz		done
2903be45abbSJim Harris		$rpc_py bdev_raid_create $strip_size_create_arg $superblock_create_arg -r $raid_level -b "'${base_bdevs[*]}'" -n $raid_bdev_name
2912a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
2922a1b861bSArtur Paszkiewicz
2932a1b861bSArtur Paszkiewicz		$rpc_py bdev_raid_remove_base_bdev ${base_bdevs[1]}
2942a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
2952a1b861bSArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq '.[0].base_bdevs_list[1].is_configured') == "false" ]]
2962a1b861bSArtur Paszkiewicz
2972a1b861bSArtur Paszkiewicz		$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b ${base_bdevs[0]}
2982a1b861bSArtur Paszkiewicz		waitforbdev ${base_bdevs[0]}
2992a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
3002a1b861bSArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq '.[0].base_bdevs_list[0].is_configured') == "true" ]]
3012a1b861bSArtur Paszkiewicz
3022a1b861bSArtur Paszkiewicz		$rpc_py bdev_raid_remove_base_bdev ${base_bdevs[2]}
3032a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
3042a1b861bSArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq '.[0].base_bdevs_list[2].is_configured') == "false" ]]
3052a1b861bSArtur Paszkiewicz
3062a1b861bSArtur Paszkiewicz		$rpc_py bdev_raid_add_base_bdev $raid_bdev_name ${base_bdevs[2]}
3072a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
3082a1b861bSArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq '.[0].base_bdevs_list[2].is_configured') == "true" ]]
3092a1b861bSArtur Paszkiewicz
3102a1b861bSArtur Paszkiewicz		$rpc_py bdev_malloc_delete ${base_bdevs[0]}
3112a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
3122a1b861bSArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq '.[0].base_bdevs_list[0].is_configured') == "false" ]]
3132a1b861bSArtur Paszkiewicz
3142a1b861bSArtur Paszkiewicz		$rpc_py bdev_raid_add_base_bdev $raid_bdev_name ${base_bdevs[1]}
3152a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
3162a1b861bSArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq '.[0].base_bdevs_list[1].is_configured') == "true" ]]
3172a1b861bSArtur Paszkiewicz
3182a1b861bSArtur Paszkiewicz		$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b NewBaseBdev -u "$($rpc_py bdev_raid_get_bdevs all | jq -r '.[0].base_bdevs_list[0].uuid')"
3192a1b861bSArtur Paszkiewicz		waitforbdev NewBaseBdev
3202a1b861bSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs
3212a1b861bSArtur Paszkiewicz		verify_raid_bdev_properties $raid_bdev_name
3222a1b861bSArtur Paszkiewicz
3232a1b861bSArtur Paszkiewicz		$rpc_py bdev_raid_delete $raid_bdev_name
3242a1b861bSArtur Paszkiewicz	fi
3252a1b861bSArtur Paszkiewicz
326df1e07e9SGangCao	killprocess $raid_pid
327df1e07e9SGangCao
328df1e07e9SGangCao	return 0
329df1e07e9SGangCao}
330df1e07e9SGangCao
3313b9baa5fSLoïc Yavercovskifunction raid_resize_test() {
3323b9baa5fSLoïc Yavercovski	local raid_level=$1
33317e71c7dSArtur Paszkiewicz	local blksize=$base_blocklen
334c22b052bSShuhei Matsumoto	local bdev_size_mb=32
335c22b052bSShuhei Matsumoto	local new_bdev_size_mb=$((bdev_size_mb * 2))
336c22b052bSShuhei Matsumoto	local blkcnt
337c22b052bSShuhei Matsumoto	local raid_size_mb
338c22b052bSShuhei Matsumoto	local new_raid_size_mb
3393b9baa5fSLoïc Yavercovski	local expected_size
340c22b052bSShuhei Matsumoto
341141bc565SArtur Paszkiewicz	$rootdir/test/app/bdev_svc/bdev_svc -i 0 -L bdev_raid &
342c22b052bSShuhei Matsumoto	raid_pid=$!
343c22b052bSShuhei Matsumoto	echo "Process raid pid: $raid_pid"
344141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
345c22b052bSShuhei Matsumoto
346c22b052bSShuhei Matsumoto	$rpc_py bdev_null_create Base_1 $bdev_size_mb $blksize
347c22b052bSShuhei Matsumoto	$rpc_py bdev_null_create Base_2 $bdev_size_mb $blksize
348c22b052bSShuhei Matsumoto
3493b9baa5fSLoïc Yavercovski	if [ $raid_level -eq 0 ]; then
3503be45abbSJim Harris		$rpc_py bdev_raid_create -z 64 -r $raid_level -b "'Base_1 Base_2'" -n Raid
3513b9baa5fSLoïc Yavercovski	else
3523be45abbSJim Harris		$rpc_py bdev_raid_create -r $raid_level -b "'Base_1 Base_2'" -n Raid
3533b9baa5fSLoïc Yavercovski	fi
354c22b052bSShuhei Matsumoto
355c22b052bSShuhei Matsumoto	# Resize Base_1 first.
356c22b052bSShuhei Matsumoto	$rpc_py bdev_null_resize Base_1 $new_bdev_size_mb
357c22b052bSShuhei Matsumoto
358c22b052bSShuhei Matsumoto	# The size of Raid should not be changed.
359c22b052bSShuhei Matsumoto	blkcnt=$($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks')
360c22b052bSShuhei Matsumoto	raid_size_mb=$((blkcnt * blksize / 1048576))
3613b9baa5fSLoïc Yavercovski	if [ $raid_level -eq 0 ]; then
3623b9baa5fSLoïc Yavercovski		expected_size=$((bdev_size_mb * 2))
3633b9baa5fSLoïc Yavercovski	else
3643b9baa5fSLoïc Yavercovski		expected_size=$bdev_size_mb
3653b9baa5fSLoïc Yavercovski	fi
3663b9baa5fSLoïc Yavercovski	if [ $raid_size_mb != $expected_size ]; then
367c22b052bSShuhei Matsumoto		echo "resize failed"
368c22b052bSShuhei Matsumoto		return 1
369c22b052bSShuhei Matsumoto	fi
370c22b052bSShuhei Matsumoto
371c22b052bSShuhei Matsumoto	# Resize Base_2 next.
372c22b052bSShuhei Matsumoto	$rpc_py bdev_null_resize Base_2 $new_bdev_size_mb
373c22b052bSShuhei Matsumoto
374c22b052bSShuhei Matsumoto	# The size of Raid should be updated to the expected value.
375c22b052bSShuhei Matsumoto	blkcnt=$($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks')
376c22b052bSShuhei Matsumoto	raid_size_mb=$((blkcnt * blksize / 1048576))
3773b9baa5fSLoïc Yavercovski	if [ $raid_level -eq 0 ]; then
3783b9baa5fSLoïc Yavercovski		expected_size=$((new_bdev_size_mb * 2))
3793b9baa5fSLoïc Yavercovski	else
3803b9baa5fSLoïc Yavercovski		expected_size=$new_bdev_size_mb
3813b9baa5fSLoïc Yavercovski	fi
3823b9baa5fSLoïc Yavercovski	if [ $raid_size_mb != $expected_size ]; then
383c22b052bSShuhei Matsumoto		echo "resize failed"
384c22b052bSShuhei Matsumoto		return 1
385c22b052bSShuhei Matsumoto	fi
386c22b052bSShuhei Matsumoto
387c22b052bSShuhei Matsumoto	killprocess $raid_pid
388c22b052bSShuhei Matsumoto
389c22b052bSShuhei Matsumoto	return 0
390c22b052bSShuhei Matsumoto}
391c22b052bSShuhei Matsumoto
39277b8f7b6SArtur Paszkiewiczfunction raid_superblock_test() {
39377b8f7b6SArtur Paszkiewicz	local raid_level=$1
39477b8f7b6SArtur Paszkiewicz	local num_base_bdevs=$2
39577b8f7b6SArtur Paszkiewicz	local base_bdevs_malloc=()
39677b8f7b6SArtur Paszkiewicz	local base_bdevs_pt=()
39777b8f7b6SArtur Paszkiewicz	local base_bdevs_pt_uuid=()
39877b8f7b6SArtur Paszkiewicz	local raid_bdev_name="raid_bdev1"
39977b8f7b6SArtur Paszkiewicz	local strip_size
40077b8f7b6SArtur Paszkiewicz	local strip_size_create_arg
4018a6bb6a8SArtur Paszkiewicz	local raid_bdev_uuid
4028a6bb6a8SArtur Paszkiewicz	local raid_bdev
40377b8f7b6SArtur Paszkiewicz
40477b8f7b6SArtur Paszkiewicz	if [ $raid_level != "raid1" ]; then
40577b8f7b6SArtur Paszkiewicz		strip_size=64
40677b8f7b6SArtur Paszkiewicz		strip_size_create_arg="-z $strip_size"
40777b8f7b6SArtur Paszkiewicz	else
40877b8f7b6SArtur Paszkiewicz		strip_size=0
40977b8f7b6SArtur Paszkiewicz	fi
41077b8f7b6SArtur Paszkiewicz
411141bc565SArtur Paszkiewicz	"$rootdir/test/app/bdev_svc/bdev_svc" -L bdev_raid &
41277b8f7b6SArtur Paszkiewicz	raid_pid=$!
413141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
41477b8f7b6SArtur Paszkiewicz
41577b8f7b6SArtur Paszkiewicz	# Create base bdevs
41677b8f7b6SArtur Paszkiewicz	for ((i = 1; i <= num_base_bdevs; i++)); do
41777b8f7b6SArtur Paszkiewicz		local bdev_malloc="malloc$i"
41877b8f7b6SArtur Paszkiewicz		local bdev_pt="pt$i"
41977b8f7b6SArtur Paszkiewicz		local bdev_pt_uuid="00000000-0000-0000-0000-00000000000$i"
42077b8f7b6SArtur Paszkiewicz
42177b8f7b6SArtur Paszkiewicz		base_bdevs_malloc+=($bdev_malloc)
42277b8f7b6SArtur Paszkiewicz		base_bdevs_pt+=($bdev_pt)
42377b8f7b6SArtur Paszkiewicz		base_bdevs_pt_uuid+=($bdev_pt_uuid)
42477b8f7b6SArtur Paszkiewicz
425d18ccc61SArtur Paszkiewicz		$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b $bdev_malloc
42677b8f7b6SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b $bdev_malloc -p $bdev_pt -u $bdev_pt_uuid
42777b8f7b6SArtur Paszkiewicz	done
42877b8f7b6SArtur Paszkiewicz
42977b8f7b6SArtur Paszkiewicz	# Create RAID bdev with superblock
4303be45abbSJim Harris	$rpc_py bdev_raid_create $strip_size_create_arg -r $raid_level -b "'${base_bdevs_pt[*]}'" -n $raid_bdev_name -s
431255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs
432d18ccc61SArtur Paszkiewicz	verify_raid_bdev_properties $raid_bdev_name
43377b8f7b6SArtur Paszkiewicz
4348a6bb6a8SArtur Paszkiewicz	# Get RAID bdev's UUID
4358a6bb6a8SArtur Paszkiewicz	raid_bdev_uuid=$($rpc_py bdev_get_bdevs -b $raid_bdev_name | jq -r '.[] | .uuid')
4368a6bb6a8SArtur Paszkiewicz	if [ -z "$raid_bdev_uuid" ]; then
4378a6bb6a8SArtur Paszkiewicz		return 1
4388a6bb6a8SArtur Paszkiewicz	fi
4398a6bb6a8SArtur Paszkiewicz
4408a6bb6a8SArtur Paszkiewicz	# Stop the RAID bdev
4418a6bb6a8SArtur Paszkiewicz	$rpc_py bdev_raid_delete $raid_bdev_name
4428a6bb6a8SArtur Paszkiewicz	raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[]')
4438a6bb6a8SArtur Paszkiewicz	if [ -n "$raid_bdev" ]; then
4448a6bb6a8SArtur Paszkiewicz		return 1
4458a6bb6a8SArtur Paszkiewicz	fi
4468a6bb6a8SArtur Paszkiewicz
4478a6bb6a8SArtur Paszkiewicz	# Delete the passthru bdevs
4488a6bb6a8SArtur Paszkiewicz	for i in "${base_bdevs_pt[@]}"; do
4498a6bb6a8SArtur Paszkiewicz		$rpc_py bdev_passthru_delete $i
4508a6bb6a8SArtur Paszkiewicz	done
4518a6bb6a8SArtur Paszkiewicz	if [ "$($rpc_py bdev_get_bdevs | jq -r '[.[] | select(.product_name == "passthru")] | any')" == "true" ]; then
4528a6bb6a8SArtur Paszkiewicz		return 1
4538a6bb6a8SArtur Paszkiewicz	fi
4548a6bb6a8SArtur Paszkiewicz
4559222ff97SArtur Paszkiewicz	# Try to create new RAID bdev from malloc bdevs
4566eed119eSArtur Paszkiewicz	# Should fail due to superblock still present on base bdevs
4573be45abbSJim Harris	NOT $rpc_py bdev_raid_create $strip_size_create_arg -r $raid_level -b "'${base_bdevs_malloc[*]}'" -n $raid_bdev_name
4589222ff97SArtur Paszkiewicz
4599222ff97SArtur Paszkiewicz	raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[]')
4609222ff97SArtur Paszkiewicz	if [ -n "$raid_bdev" ]; then
4619222ff97SArtur Paszkiewicz		return 1
4629222ff97SArtur Paszkiewicz	fi
4639222ff97SArtur Paszkiewicz
4648a6bb6a8SArtur Paszkiewicz	# Re-add first base bdev
4658a6bb6a8SArtur Paszkiewicz	$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[0]} -p ${base_bdevs_pt[0]} -u ${base_bdevs_pt_uuid[0]}
4668a6bb6a8SArtur Paszkiewicz
4678a6bb6a8SArtur Paszkiewicz	# Check if the RAID bdev was assembled from superblock
468255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
4698a6bb6a8SArtur Paszkiewicz
4708a6bb6a8SArtur Paszkiewicz	if [ $num_base_bdevs -gt 2 ]; then
4718a6bb6a8SArtur Paszkiewicz		# Re-add the second base bdev and remove it again
4728a6bb6a8SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[1]} -p ${base_bdevs_pt[1]} -u ${base_bdevs_pt_uuid[1]}
4738a6bb6a8SArtur Paszkiewicz		$rpc_py bdev_passthru_delete ${base_bdevs_pt[1]}
4748a6bb6a8SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $num_base_bdevs
4758a6bb6a8SArtur Paszkiewicz	fi
4768a6bb6a8SArtur Paszkiewicz
4778a6bb6a8SArtur Paszkiewicz	# Re-add remaining base bdevs
4788a6bb6a8SArtur Paszkiewicz	for ((i = 1; i < num_base_bdevs; i++)); do
4798a6bb6a8SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[$i]} -p ${base_bdevs_pt[$i]} -u ${base_bdevs_pt_uuid[$i]}
4808a6bb6a8SArtur Paszkiewicz	done
4818a6bb6a8SArtur Paszkiewicz
4828a6bb6a8SArtur Paszkiewicz	# Check if the RAID bdev is in online state
483255d0786SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs
484d18ccc61SArtur Paszkiewicz	verify_raid_bdev_properties $raid_bdev_name
4858a6bb6a8SArtur Paszkiewicz
4868a6bb6a8SArtur Paszkiewicz	# Check if the RAID bdev has the same UUID as when first created
4878a6bb6a8SArtur Paszkiewicz	if [ "$($rpc_py bdev_get_bdevs -b $raid_bdev_name | jq -r '.[] | .uuid')" != "$raid_bdev_uuid" ]; then
4888a6bb6a8SArtur Paszkiewicz		return 1
4898a6bb6a8SArtur Paszkiewicz	fi
4908a6bb6a8SArtur Paszkiewicz
491255d0786SArtur Paszkiewicz	if has_redundancy $raid_level; then
492255d0786SArtur Paszkiewicz		# Delete one base bdev
493255d0786SArtur Paszkiewicz		$rpc_py bdev_passthru_delete ${base_bdevs_pt[0]}
494255d0786SArtur Paszkiewicz
495255d0786SArtur Paszkiewicz		# Check if the RAID bdev is in online state (degraded)
496255d0786SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs - 1))
497255d0786SArtur Paszkiewicz
498255d0786SArtur Paszkiewicz		# Stop the RAID bdev
499255d0786SArtur Paszkiewicz		$rpc_py bdev_raid_delete $raid_bdev_name
500255d0786SArtur Paszkiewicz		raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[]')
501255d0786SArtur Paszkiewicz		if [ -n "$raid_bdev" ]; then
502255d0786SArtur Paszkiewicz			return 1
503255d0786SArtur Paszkiewicz		fi
504255d0786SArtur Paszkiewicz
505255d0786SArtur Paszkiewicz		# Delete remaining base bdevs
506255d0786SArtur Paszkiewicz		for ((i = 1; i < num_base_bdevs; i++)); do
507255d0786SArtur Paszkiewicz			$rpc_py bdev_passthru_delete ${base_bdevs_pt[$i]}
508255d0786SArtur Paszkiewicz		done
509255d0786SArtur Paszkiewicz
510255d0786SArtur Paszkiewicz		# Re-add base bdevs from the second up to (not including) the last one
511255d0786SArtur Paszkiewicz		for ((i = 1; i < num_base_bdevs - 1; i++)); do
512255d0786SArtur Paszkiewicz			$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[$i]} -p ${base_bdevs_pt[$i]} -u ${base_bdevs_pt_uuid[$i]}
513255d0786SArtur Paszkiewicz
514255d0786SArtur Paszkiewicz			# Check if the RAID bdev is in configuring state
515255d0786SArtur Paszkiewicz			verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $((num_base_bdevs - 1))
516255d0786SArtur Paszkiewicz		done
517255d0786SArtur Paszkiewicz
518255d0786SArtur Paszkiewicz		# Re-add the last base bdev
519255d0786SArtur Paszkiewicz		i=$((num_base_bdevs - 1))
520255d0786SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[$i]} -p ${base_bdevs_pt[$i]} -u ${base_bdevs_pt_uuid[$i]}
521255d0786SArtur Paszkiewicz
522255d0786SArtur Paszkiewicz		# Check if the RAID bdev is in online state (degraded)
523255d0786SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs - 1))
524255d0786SArtur Paszkiewicz
525255d0786SArtur Paszkiewicz		# Stop the RAID bdev
526255d0786SArtur Paszkiewicz		$rpc_py bdev_raid_delete $raid_bdev_name
527255d0786SArtur Paszkiewicz		raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[]')
528255d0786SArtur Paszkiewicz		if [ -n "$raid_bdev" ]; then
529255d0786SArtur Paszkiewicz			return 1
530255d0786SArtur Paszkiewicz		fi
531255d0786SArtur Paszkiewicz
532f9cccaa8SArtur Paszkiewicz		if [ $num_base_bdevs -gt 2 ]; then
533f9cccaa8SArtur Paszkiewicz			# Delete the last base bdev
534f9cccaa8SArtur Paszkiewicz			i=$((num_base_bdevs - 1))
535f9cccaa8SArtur Paszkiewicz			$rpc_py bdev_passthru_delete ${base_bdevs_pt[$i]}
536f9cccaa8SArtur Paszkiewicz		fi
537f9cccaa8SArtur Paszkiewicz
538255d0786SArtur Paszkiewicz		# Re-add first base bdev
539255d0786SArtur Paszkiewicz		# This is the "failed" device and contains the "old" version of the superblock
540255d0786SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[0]} -p ${base_bdevs_pt[0]} -u ${base_bdevs_pt_uuid[0]}
541255d0786SArtur Paszkiewicz
542f9cccaa8SArtur Paszkiewicz		if [ $num_base_bdevs -gt 2 ]; then
543255d0786SArtur Paszkiewicz			# Check if the RAID bdev is in configuring state
544255d0786SArtur Paszkiewicz			# This should use the newer superblock version and have n-1 online base bdevs
545255d0786SArtur Paszkiewicz			verify_raid_bdev_state $raid_bdev_name "configuring" $raid_level $strip_size $((num_base_bdevs - 1))
546f9cccaa8SArtur Paszkiewicz			[[ $($rpc_py bdev_raid_get_bdevs configuring | jq -r '.[].base_bdevs_list[0].is_configured') == "false" ]]
547255d0786SArtur Paszkiewicz
548f9cccaa8SArtur Paszkiewicz			# Re-add the last base bdev
549255d0786SArtur Paszkiewicz			$rpc_py bdev_passthru_create -b ${base_bdevs_malloc[$i]} -p ${base_bdevs_pt[$i]} -u ${base_bdevs_pt_uuid[$i]}
550f9cccaa8SArtur Paszkiewicz		fi
551255d0786SArtur Paszkiewicz
552255d0786SArtur Paszkiewicz		# Check if the RAID bdev is in online state (degraded)
553f9cccaa8SArtur Paszkiewicz		# This should use the newer superblock version and have n-1 online base bdevs
554255d0786SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs - 1))
555f9cccaa8SArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs online | jq -r '.[].base_bdevs_list[0].is_configured') == "false" ]]
556255d0786SArtur Paszkiewicz
557255d0786SArtur Paszkiewicz		# Check if the RAID bdev has the same UUID as when first created
558255d0786SArtur Paszkiewicz		if [ "$($rpc_py bdev_get_bdevs -b $raid_bdev_name | jq -r '.[] | .uuid')" != "$raid_bdev_uuid" ]; then
559255d0786SArtur Paszkiewicz			return 1
560255d0786SArtur Paszkiewicz		fi
561255d0786SArtur Paszkiewicz	fi
562255d0786SArtur Paszkiewicz
56377b8f7b6SArtur Paszkiewicz	killprocess $raid_pid
56477b8f7b6SArtur Paszkiewicz
56577b8f7b6SArtur Paszkiewicz	return 0
56677b8f7b6SArtur Paszkiewicz}
56777b8f7b6SArtur Paszkiewicz
5681c715097SArtur Paszkiewiczfunction raid_rebuild_test() {
5691c715097SArtur Paszkiewicz	local raid_level=$1
5701c715097SArtur Paszkiewicz	local num_base_bdevs=$2
5711c715097SArtur Paszkiewicz	local superblock=$3
57236e1417eSArtur Paszkiewicz	local background_io=$4
573d18ccc61SArtur Paszkiewicz	local verify=$5
5741c715097SArtur Paszkiewicz	local base_bdevs=($(for ((i = 1; i <= num_base_bdevs; i++)); do echo BaseBdev$i; done))
5751c715097SArtur Paszkiewicz	local raid_bdev_name="raid_bdev1"
5761c715097SArtur Paszkiewicz	local strip_size
5771c715097SArtur Paszkiewicz	local create_arg
5781c715097SArtur Paszkiewicz	local raid_bdev_size
5791c715097SArtur Paszkiewicz	local data_offset
5801c715097SArtur Paszkiewicz
5811c715097SArtur Paszkiewicz	if [ $raid_level != "raid1" ]; then
58236e1417eSArtur Paszkiewicz		if [ $background_io = true ]; then
58336e1417eSArtur Paszkiewicz			echo "skipping rebuild test with io for level $raid_level"
58436e1417eSArtur Paszkiewicz			return 1
58536e1417eSArtur Paszkiewicz		fi
5861c715097SArtur Paszkiewicz		strip_size=64
5871c715097SArtur Paszkiewicz		create_arg+=" -z $strip_size"
5881c715097SArtur Paszkiewicz	else
5891c715097SArtur Paszkiewicz		strip_size=0
5901c715097SArtur Paszkiewicz	fi
5911c715097SArtur Paszkiewicz
5921c715097SArtur Paszkiewicz	if [ $superblock = true ]; then
5931c715097SArtur Paszkiewicz		create_arg+=" -s"
5941c715097SArtur Paszkiewicz	fi
5951c715097SArtur Paszkiewicz
596141bc565SArtur Paszkiewicz	"$rootdir/build/examples/bdevperf" -T $raid_bdev_name -t 60 -w randrw -M 50 -o 3M -q 2 -U -z -L bdev_raid &
5971c715097SArtur Paszkiewicz	raid_pid=$!
598141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
5991c715097SArtur Paszkiewicz
6001c715097SArtur Paszkiewicz	# Create base bdevs
60136e1417eSArtur Paszkiewicz	for bdev in "${base_bdevs[@]}"; do
602d18ccc61SArtur Paszkiewicz		$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b ${bdev}_malloc
60336e1417eSArtur Paszkiewicz		$rpc_py bdev_passthru_create -b ${bdev}_malloc -p $bdev
6041c715097SArtur Paszkiewicz	done
6051c715097SArtur Paszkiewicz
6061c715097SArtur Paszkiewicz	# Create spare bdev
607d18ccc61SArtur Paszkiewicz	$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b "spare_malloc"
6081c715097SArtur Paszkiewicz	$rpc_py bdev_delay_create -b "spare_malloc" -d "spare_delay" -r 0 -t 0 -w 100000 -n 100000
6091c715097SArtur Paszkiewicz	$rpc_py bdev_passthru_create -b "spare_delay" -p "spare"
6101c715097SArtur Paszkiewicz
6111c715097SArtur Paszkiewicz	# Create RAID bdev
6123be45abbSJim Harris	$rpc_py bdev_raid_create $create_arg -r $raid_level -b "'${base_bdevs[*]}'" -n $raid_bdev_name
6131c715097SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs
6141c715097SArtur Paszkiewicz
6151c715097SArtur Paszkiewicz	# Get RAID bdev's size
6161c715097SArtur Paszkiewicz	raid_bdev_size=$($rpc_py bdev_get_bdevs -b $raid_bdev_name | jq -r '.[].num_blocks')
6171c715097SArtur Paszkiewicz
6181c715097SArtur Paszkiewicz	# Get base bdev's data offset
6191c715097SArtur Paszkiewicz	data_offset=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[].base_bdevs_list[0].data_offset')
6201c715097SArtur Paszkiewicz
62136e1417eSArtur Paszkiewicz	if [ $background_io = true ]; then
62236e1417eSArtur Paszkiewicz		# Start user I/O
623141bc565SArtur Paszkiewicz		"$rootdir/examples/bdev/bdevperf/bdevperf.py" perform_tests &
624d18ccc61SArtur Paszkiewicz	elif [ $verify = true ]; then
625549d907bSArtur Paszkiewicz		local write_unit_size
626549d907bSArtur Paszkiewicz
6271c715097SArtur Paszkiewicz		# Write random data to the RAID bdev
628141bc565SArtur Paszkiewicz		nbd_start_disks $DEFAULT_RPC_ADDR $raid_bdev_name /dev/nbd0
629549d907bSArtur Paszkiewicz		if [ $raid_level = "raid5f" ]; then
630549d907bSArtur Paszkiewicz			write_unit_size=$((strip_size * 2 * (num_base_bdevs - 1)))
63117e71c7dSArtur Paszkiewicz			echo $((base_blocklen * write_unit_size / 1024)) > /sys/block/nbd0/queue/max_sectors_kb
632549d907bSArtur Paszkiewicz		else
633549d907bSArtur Paszkiewicz			write_unit_size=1
634549d907bSArtur Paszkiewicz		fi
63517e71c7dSArtur Paszkiewicz		dd if=/dev/urandom of=/dev/nbd0 bs=$((base_blocklen * write_unit_size)) count=$((raid_bdev_size / write_unit_size)) oflag=direct
636141bc565SArtur Paszkiewicz		nbd_stop_disks $DEFAULT_RPC_ADDR /dev/nbd0
63736e1417eSArtur Paszkiewicz	fi
6381c715097SArtur Paszkiewicz
6391c715097SArtur Paszkiewicz	# Remove one base bdev
6401c715097SArtur Paszkiewicz	$rpc_py bdev_raid_remove_base_bdev ${base_bdevs[0]}
6411c715097SArtur Paszkiewicz
6421c715097SArtur Paszkiewicz	# Check if the RAID bdev is in online state (degraded)
6431c715097SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs - 1))
6441c715097SArtur Paszkiewicz
6451c715097SArtur Paszkiewicz	# Add bdev for rebuild
6461c715097SArtur Paszkiewicz	$rpc_py bdev_raid_add_base_bdev $raid_bdev_name "spare"
6471c715097SArtur Paszkiewicz	sleep 1
6481c715097SArtur Paszkiewicz
6491c715097SArtur Paszkiewicz	# Check if rebuild started
6501c715097SArtur Paszkiewicz	verify_raid_bdev_process $raid_bdev_name "rebuild" "spare"
6511c715097SArtur Paszkiewicz
652d6fa87aeSArtur Paszkiewicz	# Remove the rebuild target bdev
653d6fa87aeSArtur Paszkiewicz	$rpc_py bdev_raid_remove_base_bdev "spare"
654d6fa87aeSArtur Paszkiewicz
655d6fa87aeSArtur Paszkiewicz	# Check if the RAID bdev is in online state (degraded)
656d6fa87aeSArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs - 1))
657d6fa87aeSArtur Paszkiewicz
658d6fa87aeSArtur Paszkiewicz	# Check if rebuild was stopped
659d6fa87aeSArtur Paszkiewicz	verify_raid_bdev_process $raid_bdev_name "none" "none"
660d6fa87aeSArtur Paszkiewicz
661d6fa87aeSArtur Paszkiewicz	# Again, start the rebuild
662d6fa87aeSArtur Paszkiewicz	$rpc_py bdev_raid_add_base_bdev $raid_bdev_name "spare"
663d6fa87aeSArtur Paszkiewicz	sleep 1
664d6fa87aeSArtur Paszkiewicz	verify_raid_bdev_process $raid_bdev_name "rebuild" "spare"
665d6fa87aeSArtur Paszkiewicz
6669d2b7b41SArtur Paszkiewicz	if [ $superblock = true ] && [ $with_io = false ]; then
6679d2b7b41SArtur Paszkiewicz		# Stop the RAID bdev
6689d2b7b41SArtur Paszkiewicz		$rpc_py bdev_raid_delete $raid_bdev_name
6699d2b7b41SArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq 'length') == 0 ]]
6709d2b7b41SArtur Paszkiewicz
6719d2b7b41SArtur Paszkiewicz		# Remove the passthru base bdevs, then re-add them to assemble the raid bdev again
6729d2b7b41SArtur Paszkiewicz		for ((i = 0; i < num_base_bdevs; i++)); do
6739d2b7b41SArtur Paszkiewicz			$rpc_py bdev_passthru_delete ${base_bdevs[$i]}
6749d2b7b41SArtur Paszkiewicz		done
6759d2b7b41SArtur Paszkiewicz		for ((i = 0; i < num_base_bdevs; i++)); do
6769d2b7b41SArtur Paszkiewicz			$rpc_py bdev_passthru_create -b ${base_bdevs[$i]}_malloc -p ${base_bdevs[$i]}
6779d2b7b41SArtur Paszkiewicz		done
6789d2b7b41SArtur Paszkiewicz
6799d2b7b41SArtur Paszkiewicz		# Check if the RAID bdev is in online state (degraded)
6809d2b7b41SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs - 1))
6819d2b7b41SArtur Paszkiewicz
6829d2b7b41SArtur Paszkiewicz		# Check if rebuild is not started
6839d2b7b41SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "none" "none"
6849d2b7b41SArtur Paszkiewicz
6859d2b7b41SArtur Paszkiewicz		# Again, start the rebuild
6869d2b7b41SArtur Paszkiewicz		$rpc_py bdev_raid_add_base_bdev $raid_bdev_name "spare"
6879d2b7b41SArtur Paszkiewicz		sleep 1
6889d2b7b41SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "rebuild" "spare"
6899d2b7b41SArtur Paszkiewicz	fi
6909d2b7b41SArtur Paszkiewicz
691d6fa87aeSArtur Paszkiewicz	local num_base_bdevs_operational=$num_base_bdevs
692d6fa87aeSArtur Paszkiewicz
693d6fa87aeSArtur Paszkiewicz	if [ $raid_level = "raid1" ] && [ $num_base_bdevs -gt 2 ]; then
694d6fa87aeSArtur Paszkiewicz		# Remove one more base bdev (not rebuild target)
695d6fa87aeSArtur Paszkiewicz		$rpc_py bdev_raid_remove_base_bdev ${base_bdevs[1]}
696d6fa87aeSArtur Paszkiewicz
697d6fa87aeSArtur Paszkiewicz		# Ignore this bdev later when comparing data
698d6fa87aeSArtur Paszkiewicz		base_bdevs[1]=""
699d6fa87aeSArtur Paszkiewicz		((num_base_bdevs_operational--))
700d6fa87aeSArtur Paszkiewicz
701d6fa87aeSArtur Paszkiewicz		# Check if rebuild is still running
702d6fa87aeSArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "rebuild" "spare"
703d6fa87aeSArtur Paszkiewicz	fi
704d6fa87aeSArtur Paszkiewicz
7051c715097SArtur Paszkiewicz	# Wait for rebuild to finish
7061c715097SArtur Paszkiewicz	local timeout=$((SECONDS + 30))
7071c715097SArtur Paszkiewicz	while ((SECONDS < timeout)); do
7081c715097SArtur Paszkiewicz		if ! verify_raid_bdev_process $raid_bdev_name "rebuild" "spare" > /dev/null; then
7091c715097SArtur Paszkiewicz			break
7101c715097SArtur Paszkiewicz		fi
7111c715097SArtur Paszkiewicz		sleep 1
7121c715097SArtur Paszkiewicz	done
7131c715097SArtur Paszkiewicz
7141c715097SArtur Paszkiewicz	# Check if rebuild is not running and the RAID bdev has the correct number of operational devices
7151c715097SArtur Paszkiewicz	verify_raid_bdev_process $raid_bdev_name "none" "none"
716d6fa87aeSArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs_operational
7171c715097SArtur Paszkiewicz
7181c715097SArtur Paszkiewicz	# Stop the RAID bdev
7191c715097SArtur Paszkiewicz	$rpc_py bdev_raid_delete $raid_bdev_name
7201c715097SArtur Paszkiewicz	[[ $($rpc_py bdev_raid_get_bdevs all | jq 'length') == 0 ]]
7211c715097SArtur Paszkiewicz
722d18ccc61SArtur Paszkiewicz	if [ $verify = true ]; then
72336e1417eSArtur Paszkiewicz		if [ $background_io = true ]; then
72436e1417eSArtur Paszkiewicz			# Compare data on the rebuilt and other base bdevs
725141bc565SArtur Paszkiewicz			nbd_start_disks $DEFAULT_RPC_ADDR "spare" "/dev/nbd0"
72636e1417eSArtur Paszkiewicz			for bdev in "${base_bdevs[@]:1}"; do
727d6fa87aeSArtur Paszkiewicz				if [ -z "$bdev" ]; then
728d6fa87aeSArtur Paszkiewicz					continue
729d6fa87aeSArtur Paszkiewicz				fi
730141bc565SArtur Paszkiewicz				nbd_start_disks $DEFAULT_RPC_ADDR $bdev "/dev/nbd1"
73117e71c7dSArtur Paszkiewicz				cmp -i $((data_offset * base_blocklen)) /dev/nbd0 /dev/nbd1
732141bc565SArtur Paszkiewicz				nbd_stop_disks $DEFAULT_RPC_ADDR "/dev/nbd1"
73336e1417eSArtur Paszkiewicz			done
734141bc565SArtur Paszkiewicz			nbd_stop_disks $DEFAULT_RPC_ADDR "/dev/nbd0"
73536e1417eSArtur Paszkiewicz		else
7361c715097SArtur Paszkiewicz			# Compare data on the removed and rebuilt base bdevs
737141bc565SArtur Paszkiewicz			nbd_start_disks $DEFAULT_RPC_ADDR "${base_bdevs[0]} spare" "/dev/nbd0 /dev/nbd1"
73817e71c7dSArtur Paszkiewicz			cmp -i $((data_offset * base_blocklen)) /dev/nbd0 /dev/nbd1
739141bc565SArtur Paszkiewicz			nbd_stop_disks $DEFAULT_RPC_ADDR "/dev/nbd0 /dev/nbd1"
74036e1417eSArtur Paszkiewicz		fi
741d18ccc61SArtur Paszkiewicz	fi
7421c715097SArtur Paszkiewicz
7431c715097SArtur Paszkiewicz	if [ $superblock = true ]; then
744f9cccaa8SArtur Paszkiewicz		# Remove then re-add a base bdev to assemble the raid bdev again
7451c715097SArtur Paszkiewicz		$rpc_py bdev_passthru_delete "spare"
7461c715097SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b "spare_delay" -p "spare"
7473be45abbSJim Harris		$rpc_py bdev_wait_for_examine
7481c715097SArtur Paszkiewicz
749d6fa87aeSArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs_operational
7501c715097SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "none" "none"
7511c715097SArtur Paszkiewicz		[[ $($rpc_py bdev_raid_get_bdevs all | jq -r '.[].base_bdevs_list[0].name') == "spare" ]]
752dafdb289SArtur Paszkiewicz
753dafdb289SArtur Paszkiewicz		# Remove and re-add a base bdev - rebuild should start automatically
754dafdb289SArtur Paszkiewicz		$rpc_py bdev_raid_remove_base_bdev "spare"
755dafdb289SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs_operational - 1))
756dafdb289SArtur Paszkiewicz		$rpc_py bdev_raid_add_base_bdev $raid_bdev_name "spare"
757dafdb289SArtur Paszkiewicz		sleep 1
758dafdb289SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "rebuild" "spare"
759dafdb289SArtur Paszkiewicz
760dafdb289SArtur Paszkiewicz		# Same as above but re-add through examine
761dafdb289SArtur Paszkiewicz		$rpc_py bdev_passthru_delete "spare"
762dafdb289SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs_operational - 1))
763dafdb289SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b "spare_delay" -p "spare"
764dafdb289SArtur Paszkiewicz		sleep 1
765dafdb289SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "rebuild" "spare"
766dafdb289SArtur Paszkiewicz
767dafdb289SArtur Paszkiewicz		# Stop the rebuild
768dafdb289SArtur Paszkiewicz		$rpc_py bdev_passthru_delete "spare"
769dafdb289SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs_operational - 1))
770dafdb289SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "none" "none"
771dafdb289SArtur Paszkiewicz
772dafdb289SArtur Paszkiewicz		# Re-adding a base bdev that was replaced (no longer is a member of the array) should not be allowed
773dafdb289SArtur Paszkiewicz		$rpc_py bdev_passthru_delete ${base_bdevs[0]}
774dafdb289SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b ${base_bdevs[0]}_malloc -p ${base_bdevs[0]}
775dafdb289SArtur Paszkiewicz		sleep 1
776dafdb289SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs_operational - 1))
777dafdb289SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "none" "none"
778dafdb289SArtur Paszkiewicz		NOT $rpc_py bdev_raid_add_base_bdev $raid_bdev_name ${base_bdevs[0]}
779dafdb289SArtur Paszkiewicz		sleep 1
780dafdb289SArtur Paszkiewicz		verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $((num_base_bdevs_operational - 1))
781dafdb289SArtur Paszkiewicz		verify_raid_bdev_process $raid_bdev_name "none" "none"
7821c715097SArtur Paszkiewicz	fi
7831c715097SArtur Paszkiewicz
7841c715097SArtur Paszkiewicz	killprocess $raid_pid
7851c715097SArtur Paszkiewicz
7861c715097SArtur Paszkiewicz	return 0
7871c715097SArtur Paszkiewicz}
7881c715097SArtur Paszkiewicz
7898b196864SArtur Paszkiewiczfunction raid_io_error_test() {
7908b196864SArtur Paszkiewicz	local raid_level=$1
7918b196864SArtur Paszkiewicz	local num_base_bdevs=$2
7928b196864SArtur Paszkiewicz	local error_io_type=$3
7938b196864SArtur Paszkiewicz	local base_bdevs=($(for ((i = 1; i <= num_base_bdevs; i++)); do echo BaseBdev$i; done))
7948b196864SArtur Paszkiewicz	local raid_bdev_name="raid_bdev1"
7958b196864SArtur Paszkiewicz	local strip_size
7968b196864SArtur Paszkiewicz	local create_arg
7978b196864SArtur Paszkiewicz	local bdevperf_log
7988b196864SArtur Paszkiewicz	local fail_per_s
7998b196864SArtur Paszkiewicz
8008b196864SArtur Paszkiewicz	if [ $raid_level != "raid1" ]; then
8018b196864SArtur Paszkiewicz		strip_size=64
8028b196864SArtur Paszkiewicz		create_arg+=" -z $strip_size"
8038b196864SArtur Paszkiewicz	else
8048b196864SArtur Paszkiewicz		strip_size=0
8058b196864SArtur Paszkiewicz	fi
8068b196864SArtur Paszkiewicz
8078b196864SArtur Paszkiewicz	bdevperf_log=$(mktemp -p "$tmp_dir")
8088b196864SArtur Paszkiewicz
809141bc565SArtur Paszkiewicz	"$rootdir/build/examples/bdevperf" -T $raid_bdev_name -t 60 -w randrw -M 50 -o 128k -q 1 -z -f -L bdev_raid > $bdevperf_log &
8108b196864SArtur Paszkiewicz	raid_pid=$!
811141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
8128b196864SArtur Paszkiewicz
8138b196864SArtur Paszkiewicz	# Create base bdevs
8148b196864SArtur Paszkiewicz	for bdev in "${base_bdevs[@]}"; do
8158b196864SArtur Paszkiewicz		$rpc_py bdev_malloc_create 32 $base_blocklen $base_malloc_params -b ${bdev}_malloc
8168b196864SArtur Paszkiewicz		$rpc_py bdev_error_create ${bdev}_malloc
8178b196864SArtur Paszkiewicz		$rpc_py bdev_passthru_create -b EE_${bdev}_malloc -p $bdev
8188b196864SArtur Paszkiewicz	done
8198b196864SArtur Paszkiewicz
8208b196864SArtur Paszkiewicz	# Create RAID bdev
8213be45abbSJim Harris	$rpc_py bdev_raid_create $create_arg -r $raid_level -b "'${base_bdevs[*]}'" -n $raid_bdev_name -s
8228b196864SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name "online" $raid_level $strip_size $num_base_bdevs
8238b196864SArtur Paszkiewicz
8248b196864SArtur Paszkiewicz	# Start user I/O
825141bc565SArtur Paszkiewicz	"$rootdir/examples/bdev/bdevperf/bdevperf.py" perform_tests &
8268b196864SArtur Paszkiewicz	sleep 1
8278b196864SArtur Paszkiewicz
8288b196864SArtur Paszkiewicz	# Inject an error
8298b196864SArtur Paszkiewicz	$rpc_py bdev_error_inject_error EE_${base_bdevs[0]}_malloc $error_io_type failure
8308b196864SArtur Paszkiewicz
8318b196864SArtur Paszkiewicz	local expected_num_base_bdevs
8328b196864SArtur Paszkiewicz	if [[ $raid_level = "raid1" && $error_io_type = "write" ]]; then
8338b196864SArtur Paszkiewicz		expected_num_base_bdevs=$((num_base_bdevs - 1))
8348b196864SArtur Paszkiewicz	else
8358b196864SArtur Paszkiewicz		expected_num_base_bdevs=$num_base_bdevs
8368b196864SArtur Paszkiewicz	fi
8378b196864SArtur Paszkiewicz	verify_raid_bdev_state $raid_bdev_name online $raid_level $strip_size $expected_num_base_bdevs
8388b196864SArtur Paszkiewicz
8398b196864SArtur Paszkiewicz	$rpc_py bdev_raid_delete $raid_bdev_name
8408b196864SArtur Paszkiewicz
8418b196864SArtur Paszkiewicz	killprocess $raid_pid
8428b196864SArtur Paszkiewicz
8438b196864SArtur Paszkiewicz	# Check I/O failures reported by bdevperf
8448b196864SArtur Paszkiewicz	# RAID levels with redundancy should handle the errors and not show any failures
8458b196864SArtur Paszkiewicz	fail_per_s=$(grep -v Job $bdevperf_log | grep $raid_bdev_name | awk '{print $6}')
8468b196864SArtur Paszkiewicz	if has_redundancy $raid_level; then
8478b196864SArtur Paszkiewicz		[[ "$fail_per_s" = "0.00" ]]
8488b196864SArtur Paszkiewicz	else
8498b196864SArtur Paszkiewicz		[[ "$fail_per_s" != "0.00" ]]
8508b196864SArtur Paszkiewicz	fi
8518b196864SArtur Paszkiewicz}
8528b196864SArtur Paszkiewicz
8538ee2672cSSebastian Brzezinkafunction raid_resize_superblock_test() {
8548ee2672cSSebastian Brzezinka	local raid_level=$1
8558ee2672cSSebastian Brzezinka
856141bc565SArtur Paszkiewicz	$rootdir/test/app/bdev_svc/bdev_svc -i 0 -L bdev_raid &
8578ee2672cSSebastian Brzezinka	raid_pid=$!
8588ee2672cSSebastian Brzezinka	echo "Process raid pid: $raid_pid"
859141bc565SArtur Paszkiewicz	waitforlisten $raid_pid
8608ee2672cSSebastian Brzezinka
8618ee2672cSSebastian Brzezinka	$rpc_py bdev_malloc_create -b malloc0 512 $base_blocklen
8628ee2672cSSebastian Brzezinka
8638ee2672cSSebastian Brzezinka	$rpc_py bdev_passthru_create -b malloc0 -p pt0
8648ee2672cSSebastian Brzezinka	$rpc_py bdev_lvol_create_lvstore pt0 lvs0
8658ee2672cSSebastian Brzezinka
8668ee2672cSSebastian Brzezinka	$rpc_py bdev_lvol_create -l lvs0 lvol0 64
8678ee2672cSSebastian Brzezinka	$rpc_py bdev_lvol_create -l lvs0 lvol1 64
8688ee2672cSSebastian Brzezinka
8698ee2672cSSebastian Brzezinka	case $raid_level in
8703be45abbSJim Harris		0) $rpc_py bdev_raid_create -n Raid -r $raid_level -z 64 -b "'lvs0/lvol0 lvs0/lvol1'" -s ;;
8713be45abbSJim Harris		1) $rpc_py bdev_raid_create -n Raid -r $raid_level -b "'lvs0/lvol0 lvs0/lvol1'" -s ;;
8728ee2672cSSebastian Brzezinka	esac
8738ee2672cSSebastian Brzezinka
8748ee2672cSSebastian Brzezinka	# Check size of base bdevs first
8758ee2672cSSebastian Brzezinka	(($(($($rpc_py bdev_get_bdevs -b lvs0/lvol0 | jq '.[].num_blocks') * 512 / 1048576)) == 64))
8768ee2672cSSebastian Brzezinka	(($(($($rpc_py bdev_get_bdevs -b lvs0/lvol1 | jq '.[].num_blocks') * 512 / 1048576)) == 64))
8778ee2672cSSebastian Brzezinka
8788ee2672cSSebastian Brzezinka	# Check size of Raid bdev before resize
8798ee2672cSSebastian Brzezinka	case $raid_level in
8808ee2672cSSebastian Brzezinka		0) (($($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks') == 245760)) ;;
8818ee2672cSSebastian Brzezinka		1) (($($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks') == 122880)) ;;
8828ee2672cSSebastian Brzezinka	esac
8838ee2672cSSebastian Brzezinka
8848ee2672cSSebastian Brzezinka	# Resize bdevs
8858ee2672cSSebastian Brzezinka	$rpc_py bdev_lvol_resize lvs0/lvol0 100
8868ee2672cSSebastian Brzezinka	$rpc_py bdev_lvol_resize lvs0/lvol1 100
8878ee2672cSSebastian Brzezinka
8888ee2672cSSebastian Brzezinka	# Bdevs should be resized
8898ee2672cSSebastian Brzezinka	(($(($($rpc_py bdev_get_bdevs -b lvs0/lvol0 | jq '.[].num_blocks') * 512 / 1048576)) == 100))
8908ee2672cSSebastian Brzezinka	(($(($($rpc_py bdev_get_bdevs -b lvs0/lvol1 | jq '.[].num_blocks') * 512 / 1048576)) == 100))
8918ee2672cSSebastian Brzezinka
8928ee2672cSSebastian Brzezinka	# Same with Raid bdevs
8938ee2672cSSebastian Brzezinka	case $raid_level in
8948ee2672cSSebastian Brzezinka		0) (($($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks') == 393216)) ;;
8958ee2672cSSebastian Brzezinka		1) (($($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks') == 196608)) ;;
8968ee2672cSSebastian Brzezinka	esac
8978ee2672cSSebastian Brzezinka
8988ee2672cSSebastian Brzezinka	$rpc_py bdev_passthru_delete pt0
8998ee2672cSSebastian Brzezinka	$rpc_py bdev_passthru_create -b malloc0 -p pt0
900*1e148debSKonrad Sztyber	$rpc_py bdev_wait_for_examine
9018ee2672cSSebastian Brzezinka
9028ee2672cSSebastian Brzezinka	# After the passthru bdev is re-created, the RAID bdev should start from
9038ee2672cSSebastian Brzezinka	# superblock and its size should be the same as after it was resized.
9048ee2672cSSebastian Brzezinka	case $raid_level in
9058ee2672cSSebastian Brzezinka		0) (($($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks') == 393216)) ;;
9068ee2672cSSebastian Brzezinka		1) (($($rpc_py bdev_get_bdevs -b Raid | jq '.[].num_blocks') == 196608)) ;;
9078ee2672cSSebastian Brzezinka	esac
9088ee2672cSSebastian Brzezinka
9098ee2672cSSebastian Brzezinka	killprocess $raid_pid
9108ee2672cSSebastian Brzezinka
9118ee2672cSSebastian Brzezinka	return 0
9128ee2672cSSebastian Brzezinka}
9138ee2672cSSebastian Brzezinka
9143cd7b237SSebastian Brzezinkafunction raid_resize_data_offset_test() {
9153cd7b237SSebastian Brzezinka
916e2a4d0eeSMichal Berger	$rootdir/test/app/bdev_svc/bdev_svc -i 0 -L bdev_raid &
9173cd7b237SSebastian Brzezinka	raid_pid=$!
9183cd7b237SSebastian Brzezinka	echo "Process raid pid: $raid_pid"
919e2a4d0eeSMichal Berger	waitforlisten $raid_pid
9203cd7b237SSebastian Brzezinka
9213cd7b237SSebastian Brzezinka	# Create three base bdevs with one null bdev to be replaced later
9223cd7b237SSebastian Brzezinka	$rpc_py bdev_malloc_create -b malloc0 64 $base_blocklen -o 16
9233cd7b237SSebastian Brzezinka	$rpc_py bdev_malloc_create -b malloc1 64 $base_blocklen -o 16
9243cd7b237SSebastian Brzezinka	$rpc_py bdev_null_create null0 64 $base_blocklen
9253cd7b237SSebastian Brzezinka
926e2a4d0eeSMichal Berger	$rpc_py bdev_raid_create -n Raid -r 1 -b "'malloc0 malloc1 null0'" -s
9273cd7b237SSebastian Brzezinka
9283cd7b237SSebastian Brzezinka	# Check data_offset
9293cd7b237SSebastian Brzezinka	(($($rpc_py bdev_raid_get_bdevs all | jq -r '.[].base_bdevs_list[2].data_offset') == 2048))
9303cd7b237SSebastian Brzezinka
9313cd7b237SSebastian Brzezinka	$rpc_py bdev_null_delete null0
9323cd7b237SSebastian Brzezinka
9333cd7b237SSebastian Brzezinka	# Now null bdev is replaced with malloc, and optimal_io_boundary is changed to force
9343cd7b237SSebastian Brzezinka	# recalculation
9353cd7b237SSebastian Brzezinka	$rpc_py bdev_malloc_create -b malloc2 512 $base_blocklen -o 30
9363cd7b237SSebastian Brzezinka	$rpc_py bdev_raid_add_base_bdev Raid malloc2
9373cd7b237SSebastian Brzezinka
9383cd7b237SSebastian Brzezinka	# Data offset is updated
9393cd7b237SSebastian Brzezinka	(($($rpc_py bdev_raid_get_bdevs all | jq -r '.[].base_bdevs_list[2].data_offset') == 2070))
9403cd7b237SSebastian Brzezinka
9413cd7b237SSebastian Brzezinka	killprocess $raid_pid
9423cd7b237SSebastian Brzezinka
9433cd7b237SSebastian Brzezinka	return 0
9443cd7b237SSebastian Brzezinka}
9453cd7b237SSebastian Brzezinka
9465d6ea30dSArtur Paszkiewiczmkdir -p "$tmp_dir"
9475d6ea30dSArtur Paszkiewicztrap 'cleanup; exit 1' EXIT
9483d951cd3SXiaodong Liu
94917e71c7dSArtur Paszkiewiczbase_blocklen=512
95017e71c7dSArtur Paszkiewicz
9513cd7b237SSebastian Brzezinkarun_test "raid1_resize_data_offset_test" raid_resize_data_offset_test
9523cd7b237SSebastian Brzezinka
9538ee2672cSSebastian Brzezinkarun_test "raid0_resize_superblock_test" raid_resize_superblock_test 0
9548ee2672cSSebastian Brzezinkarun_test "raid1_resize_superblock_test" raid_resize_superblock_test 1
9558ee2672cSSebastian Brzezinka
956b3c1a38bSArtur Paszkiewiczif [ $(uname -s) = Linux ] && modprobe -n nbd; then
9571c715097SArtur Paszkiewicz	has_nbd=true
958b3c1a38bSArtur Paszkiewicz	modprobe nbd
959b3c1a38bSArtur Paszkiewicz	run_test "raid_function_test_raid0" raid_function_test raid0
960b3c1a38bSArtur Paszkiewicz	run_test "raid_function_test_concat" raid_function_test concat
961b3c1a38bSArtur Paszkiewiczfi
962b3c1a38bSArtur Paszkiewicz
9633b9baa5fSLoïc Yavercovskirun_test "raid0_resize_test" raid_resize_test 0
9643b9baa5fSLoïc Yavercovskirun_test "raid1_resize_test" raid_resize_test 1
9653d951cd3SXiaodong Liu
9667dbff527SArtur Paszkiewiczfor n in {2..4}; do
9675cb235ebSArtur Paszkiewicz	for level in raid0 concat raid1; do
968b3c1a38bSArtur Paszkiewicz		run_test "raid_state_function_test" raid_state_function_test $level $n false
969b3c1a38bSArtur Paszkiewicz		run_test "raid_state_function_test_sb" raid_state_function_test $level $n true
970b3c1a38bSArtur Paszkiewicz		run_test "raid_superblock_test" raid_superblock_test $level $n
9718b196864SArtur Paszkiewicz		run_test "raid_read_error_test" raid_io_error_test $level $n read
9728b196864SArtur Paszkiewicz		run_test "raid_write_error_test" raid_io_error_test $level $n write
9737dbff527SArtur Paszkiewicz	done
9747dbff527SArtur Paszkiewiczdone
9757dbff527SArtur Paszkiewicz
9761c715097SArtur Paszkiewiczif [ "$has_nbd" = true ]; then
9771c715097SArtur Paszkiewicz	for n in 2 4; do
978d18ccc61SArtur Paszkiewicz		run_test "raid_rebuild_test" raid_rebuild_test raid1 $n false false true
979d18ccc61SArtur Paszkiewicz		run_test "raid_rebuild_test_sb" raid_rebuild_test raid1 $n true false true
980d18ccc61SArtur Paszkiewicz		run_test "raid_rebuild_test_io" raid_rebuild_test raid1 $n false true true
981d18ccc61SArtur Paszkiewicz		run_test "raid_rebuild_test_sb_io" raid_rebuild_test raid1 $n true true true
9821c715097SArtur Paszkiewicz	done
9831c715097SArtur Paszkiewiczfi
9841c715097SArtur Paszkiewicz
9855cb235ebSArtur Paszkiewiczfor n in {3..4}; do
986b3c1a38bSArtur Paszkiewicz	run_test "raid5f_state_function_test" raid_state_function_test raid5f $n false
987b3c1a38bSArtur Paszkiewicz	run_test "raid5f_state_function_test_sb" raid_state_function_test raid5f $n true
988b3c1a38bSArtur Paszkiewicz	run_test "raid5f_superblock_test" raid_superblock_test raid5f $n
989549d907bSArtur Paszkiewicz	if [ "$has_nbd" = true ]; then
990d18ccc61SArtur Paszkiewicz		run_test "raid5f_rebuild_test" raid_rebuild_test raid5f $n false false true
991d18ccc61SArtur Paszkiewicz		run_test "raid5f_rebuild_test_sb" raid_rebuild_test raid5f $n true false true
992549d907bSArtur Paszkiewicz	fi
9935cb235ebSArtur Paszkiewiczdone
9945cb235ebSArtur Paszkiewicz
99517e71c7dSArtur Paszkiewiczbase_blocklen=4096
99617e71c7dSArtur Paszkiewicz
99717e71c7dSArtur Paszkiewiczrun_test "raid_state_function_test_sb_4k" raid_state_function_test raid1 2 true
99817e71c7dSArtur Paszkiewiczrun_test "raid_superblock_test_4k" raid_superblock_test raid1 2
99917e71c7dSArtur Paszkiewiczif [ "$has_nbd" = true ]; then
1000d18ccc61SArtur Paszkiewicz	run_test "raid_rebuild_test_sb_4k" raid_rebuild_test raid1 2 true false true
100117e71c7dSArtur Paszkiewiczfi
100217e71c7dSArtur Paszkiewicz
1003d18ccc61SArtur Paszkiewiczbase_malloc_params="-m 32"
1004d18ccc61SArtur Paszkiewiczrun_test "raid_state_function_test_sb_md_separate" raid_state_function_test raid1 2 true
1005d18ccc61SArtur Paszkiewiczrun_test "raid_superblock_test_md_separate" raid_superblock_test raid1 2
1006d18ccc61SArtur Paszkiewiczif [ "$has_nbd" = true ]; then
1007d18ccc61SArtur Paszkiewicz	run_test "raid_rebuild_test_sb_md_separate" raid_rebuild_test raid1 2 true false true
1008d18ccc61SArtur Paszkiewiczfi
1009d18ccc61SArtur Paszkiewicz
1010d18ccc61SArtur Paszkiewiczbase_malloc_params="-m 32 -i"
1011d18ccc61SArtur Paszkiewiczrun_test "raid_state_function_test_sb_md_interleaved" raid_state_function_test raid1 2 true
1012d18ccc61SArtur Paszkiewiczrun_test "raid_superblock_test_md_interleaved" raid_superblock_test raid1 2
1013d18ccc61SArtur Paszkiewiczrun_test "raid_rebuild_test_sb_md_interleaved" raid_rebuild_test raid1 2 true false false
1014d18ccc61SArtur Paszkiewicz
10155d6ea30dSArtur Paszkiewicztrap - EXIT
10165d6ea30dSArtur Paszkiewiczcleanup
1017