xref: /spdk/test/bdev/bdev_raid.sh (revision 1fc4165fe9bf8512483356ad8e6d27f793f2e3db)
1#!/usr/bin/env bash
2
3set -e
4
5testdir=$(readlink -f $(dirname $0))
6rootdir=$(readlink -f $testdir/../..)
7rpc_py="$rootdir/scripts/rpc.py"
8tmp_file=/tmp/raidrandtest
9
10source $rootdir/test/common/autotest_common.sh
11source $testdir/nbd_common.sh
12
13function raid_unmap_data_verify() {
14	if hash blkdiscard; then
15		local nbd=$1
16		local rpc_server=$2
17		local 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 [ ! -z $raid_pid ]; then
54		killprocess $raid_pid
55	fi
56
57	rm -f $testdir/bdev.conf
58	rm -f $tmp_file
59	print_backtrace
60	exit 1
61}
62
63function raid_function_test() {
64	if [ $(uname -s) = Linux ] && modprobe -n nbd; then
65		local rpc_server=/var/tmp/spdk-raid.sock
66		local conf=$1
67		local nbd=/dev/nbd0
68		local raid_bdev
69
70		if [ ! -e $conf ]; then
71			return 1
72		fi
73
74		modprobe nbd
75		$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -c ${conf} -L bdev_raid &
76		raid_pid=$!
77		echo "Process raid pid: $raid_pid"
78		waitforlisten $raid_pid $rpc_server
79
80		raid_bdev=$($rootdir/scripts/rpc.py -s $rpc_server get_raid_bdevs online | cut -d ' ' -f 1)
81		if [ $raid_bdev = "" ]; then
82			echo "No raid0 device in SPDK app"
83			return 1
84		fi
85
86		nbd_start_disks $rpc_server $raid_bdev $nbd
87		count=$(nbd_get_count $rpc_server)
88		if [ $count -ne 1 ]; then
89			return -1
90		fi
91
92		raid_unmap_data_verify $nbd $rpc_server
93
94		nbd_stop_disks $rpc_server $nbd
95		count=$(nbd_get_count $rpc_server)
96		if [ $count -ne 0 ]; then
97			return -1
98		fi
99
100		killprocess $raid_pid
101	fi
102
103	return 0
104}
105
106timing_enter bdev_raid
107trap 'on_error_exit;' ERR
108
109cp $testdir/bdev.conf.in $testdir/bdev.conf
110raid_function_test $testdir/bdev.conf
111
112rm -f $testdir/bdev.conf
113rm -f $tmp_file
114report_test_completion "bdev_raid"
115timing_exit bdev_raid
116