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