xref: /spdk/test/bdev/bdev_raid.sh (revision 7506a7aa53d239f533af3bc768f0d2af55e735fe)
1#!/usr/bin/env bash
2
3testdir=$(readlink -f $(dirname $0))
4rootdir=$(readlink -f $testdir/../..)
5rpc_server=/var/tmp/spdk-raid.sock
6rpc_py="$rootdir/scripts/rpc.py -s $rpc_server"
7tmp_file=$SPDK_TEST_STORAGE/raidrandtest
8
9source $rootdir/test/common/autotest_common.sh
10source $testdir/nbd_common.sh
11
12function raid_unmap_data_verify() {
13	if hash blkdiscard; then
14		local nbd=$1
15		local rpc_server=$2
16		local blksize
17		blksize=$(lsblk -o LOG-SEC $nbd | grep -v LOG-SEC | cut -d ' ' -f 5)
18		local rw_blk_num=4096
19		local rw_len=$((blksize * rw_blk_num))
20		local unmap_blk_offs=(0 1028 321)
21		local unmap_blk_nums=(128 2035 456)
22		local unmap_off
23		local unmap_len
24
25		# data write
26		dd if=/dev/urandom of=$tmp_file bs=$blksize count=$rw_blk_num
27		dd if=$tmp_file of=$nbd bs=$blksize count=$rw_blk_num oflag=direct
28		blockdev --flushbufs $nbd
29
30		# confirm random data is written correctly in raid0 device
31		cmp -b -n $rw_len $tmp_file $nbd
32
33		for ((i = 0; i < ${#unmap_blk_offs[@]}; i++)); do
34			unmap_off=$((blksize * ${unmap_blk_offs[$i]}))
35			unmap_len=$((blksize * ${unmap_blk_nums[$i]}))
36
37			# data unmap on tmp_file
38			dd if=/dev/zero of=$tmp_file bs=$blksize seek=${unmap_blk_offs[$i]} count=${unmap_blk_nums[$i]} conv=notrunc
39
40			# data unmap on raid bdev
41			blkdiscard -o $unmap_off -l $unmap_len $nbd
42			blockdev --flushbufs $nbd
43
44			# data verify after unmap
45			cmp -b -n $rw_len $tmp_file $nbd
46		done
47	fi
48
49	return 0
50}
51
52function on_error_exit() {
53	if [ -n "$raid_pid" ]; then
54		killprocess $raid_pid
55	fi
56
57	rm -f $tmp_file
58	print_backtrace
59	exit 1
60}
61
62function configure_raid_bdev() {
63	local raid_level=$1
64	rm -rf $testdir/rpcs.txt
65
66	cat <<- EOL >> $testdir/rpcs.txt
67		bdev_malloc_create 32 512 -b Base_1
68		bdev_malloc_create 32 512 -b Base_2
69		bdev_raid_create -z 64 -r $raid_level -b "Base_1 Base_2" -n raid
70	EOL
71	$rpc_py < $testdir/rpcs.txt
72
73	rm -rf $testdir/rpcs.txt
74}
75
76function raid_function_test() {
77	local raid_level=$1
78	if [ $(uname -s) = Linux ] && modprobe -n nbd; then
79		local nbd=/dev/nbd0
80		local raid_bdev
81
82		modprobe nbd
83		$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -L bdev_raid &
84		raid_pid=$!
85		echo "Process raid pid: $raid_pid"
86		waitforlisten $raid_pid $rpc_server
87
88		configure_raid_bdev $raid_level
89		raid_bdev=$($rpc_py bdev_raid_get_bdevs online | cut -d ' ' -f 1)
90		if [ $raid_bdev = "" ]; then
91			echo "No raid0 device in SPDK app"
92			return 1
93		fi
94
95		nbd_start_disks $rpc_server $raid_bdev $nbd
96		count=$(nbd_get_count $rpc_server)
97		if [ $count -ne 1 ]; then
98			return 1
99		fi
100
101		raid_unmap_data_verify $nbd $rpc_server
102
103		nbd_stop_disks $rpc_server $nbd
104		count=$(nbd_get_count $rpc_server)
105		if [ $count -ne 0 ]; then
106			return 1
107		fi
108
109		killprocess $raid_pid
110	else
111		echo "skipping bdev raid tests."
112	fi
113
114	return 0
115}
116
117trap 'on_error_exit;' ERR
118
119raid_function_test raid0
120raid_function_test concat
121
122rm -f $tmp_file
123