xref: /spdk/test/bdev/bdev_raid.sh (revision 0ed85362c8132a2d1927757fbcade66b6660d26a)
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	rm -rf $testdir/rpcs.txt
64
65	cat <<- EOL >> $testdir/rpcs.txt
66		bdev_malloc_create 32 512 -b Base_1
67		bdev_malloc_create 32 512 -b Base_2
68		bdev_raid_create -z 64 -r 0 -b "Base_1 Base_2" -n raid0
69	EOL
70	$rpc_py < $testdir/rpcs.txt
71
72	rm -rf $testdir/rpcs.txt
73}
74
75function raid_function_test() {
76	if [ $(uname -s) = Linux ] && modprobe -n nbd; then
77		local nbd=/dev/nbd0
78		local raid_bdev
79
80		modprobe nbd
81		$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -L bdev_raid &
82		raid_pid=$!
83		echo "Process raid pid: $raid_pid"
84		waitforlisten $raid_pid $rpc_server
85
86		configure_raid_bdev
87		raid_bdev=$($rpc_py bdev_raid_get_bdevs online | cut -d ' ' -f 1)
88		if [ $raid_bdev = "" ]; then
89			echo "No raid0 device in SPDK app"
90			return 1
91		fi
92
93		nbd_start_disks $rpc_server $raid_bdev $nbd
94		count=$(nbd_get_count $rpc_server)
95		if [ $count -ne 1 ]; then
96			return 1
97		fi
98
99		raid_unmap_data_verify $nbd $rpc_server
100
101		nbd_stop_disks $rpc_server $nbd
102		count=$(nbd_get_count $rpc_server)
103		if [ $count -ne 0 ]; then
104			return 1
105		fi
106
107		killprocess $raid_pid
108	else
109		echo "skipping bdev raid tests."
110	fi
111
112	return 0
113}
114
115trap 'on_error_exit;' ERR
116
117raid_function_test
118
119rm -f $tmp_file
120