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