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