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