xref: /spdk/test/lvol/tasting.sh (revision 06b537bfdb4393dea857e204b85d8df46a351d8a)
1#!/usr/bin/env bash
2
3testdir=$(readlink -f $(dirname $0))
4rootdir=$(readlink -f $testdir/../..)
5source $rootdir/test/common/autotest_common.sh
6source $rootdir/test/lvol/common.sh
7
8# Make sure lvol stores are automatically detected after base bdev detach and subsequent attach
9function test_tasting() {
10	# Create two aio bdevs
11	rpc_cmd bdev_aio_create $testdir/aio_bdev_0 aio_bdev0 "$AIO_BS"
12	rpc_cmd bdev_aio_create $testdir/aio_bdev_1 aio_bdev1 "$AIO_BS"
13	# Create a valid lvs
14	lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev0 lvs_test)
15	# Destroy lvol store
16	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid"
17	# Remove the lvol stores and make sure it's not being automatically detected after base
18	# bdev re-attach.
19	rpc_cmd bdev_aio_delete aio_bdev0
20	# Create aio bdev on the same file
21	rpc_cmd bdev_aio_create $testdir/aio_bdev_0 aio_bdev0 "$AIO_BS"
22	sleep 1
23	# Check if destroyed lvol store does not exist on aio bdev
24	rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false
25
26	# Create a valid lvs
27	lvs1_cluster_size=$((1 * 1024 * 1024))
28	lvs2_cluster_size=$((32 * 1024 * 1024))
29	lvs_uuid1=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev0 lvs_test1 -c $lvs1_cluster_size)
30	lvs_uuid2=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev1 lvs_test2 -c $lvs2_cluster_size)
31
32	# Create 5 lvols on first lvs
33	lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 10)))
34	lvol_size=$((lvol_size_mb * 1024 * 1024))
35
36	for i in $(seq 1 5); do
37		lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "lvol_test${i}" "$lvol_size_mb")
38		lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
39
40		[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
41		[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
42		[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test1/lvol_test${i}" ]
43		[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$AIO_BS" ]
44		[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / AIO_BS))" ]
45	done
46
47	# Create 5 lvols on second lvs
48	lvol2_size_mb=$(round_down $(((AIO_SIZE_MB - 16) / 5)) 32)
49	lvol2_size=$((lvol2_size_mb * 1024 * 1024))
50
51	for i in $(seq 1 5); do
52		lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid2" "lvol_test${i}" "$lvol2_size_mb")
53		lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
54
55		[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
56		[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
57		[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test2/lvol_test${i}" ]
58		[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$AIO_BS" ]
59		[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol2_size / AIO_BS))" ]
60	done
61
62	old_lvols=$(rpc_cmd bdev_get_bdevs | jq -r '[ .[] | select(.product_name == "Logical Volume") ]')
63	[ "$(jq length <<< "$old_lvols")" == "10" ]
64	old_lvs=$(rpc_cmd bdev_lvol_get_lvstores | jq .)
65
66	# Restart spdk app
67	killprocess $spdk_pid
68	$SPDK_BIN_DIR/spdk_tgt &
69	spdk_pid=$!
70	waitforlisten $spdk_pid
71
72	# Create aio bdevs
73	rpc_cmd bdev_aio_create $testdir/aio_bdev_0 aio_bdev0 "$AIO_BS"
74	rpc_cmd bdev_aio_create $testdir/aio_bdev_1 aio_bdev1 "$AIO_BS"
75	sleep 1
76
77	# Check tasting feature
78	new_lvols=$(rpc_cmd bdev_get_bdevs | jq -r '[ .[] | select(.product_name == "Logical Volume") ]')
79	[ "$(jq length <<< "$new_lvols")" == "10" ]
80	new_lvs=$(rpc_cmd bdev_lvol_get_lvstores | jq .)
81	if ! diff <(jq '. | sort' <<< "$old_lvs") <(jq '. | sort' <<< "$new_lvs"); then
82		echo "ERROR: old and loaded lvol store is not the same"
83		return 1
84	fi
85	if ! diff <(jq '. | sort' <<< "$old_lvols") <(jq '. | sort' <<< "$new_lvols"); then
86		echo "ERROR: old and loaded lvols are not the same"
87		return 1
88	fi
89
90	# Check if creation and deletion lvol bdevs on lvs is possible
91	for i in $(seq 6 10); do
92		lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "lvol_test${i}" "$lvol_size_mb")
93		lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
94
95		[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
96		[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
97		[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test1/lvol_test${i}" ]
98		[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$AIO_BS" ]
99		[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / AIO_BS))" ]
100	done
101
102	for i in $(seq 1 10); do
103		rpc_cmd bdev_lvol_delete "lvs_test1/lvol_test${i}"
104	done
105
106	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid1"
107
108	# Create an lvstore and 10 lvol on top to see if deletion of such struct works as it should.
109	lvs_uuid1=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev0 lvs_test1)
110	for i in $(seq 1 10); do
111		rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "lvol_test${i}" "$lvol_size_mb"
112	done
113
114	# Clean up
115	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid1"
116	rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid1" && false
117	rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid2"
118	rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid2" && false
119	rpc_cmd bdev_aio_delete aio_bdev0
120	rpc_cmd bdev_aio_delete aio_bdev1
121	check_leftover_devices
122}
123
124# Positive test for removing lvol store persistently
125function test_delete_lvol_store_persistent_positive() {
126	local aio0=$testdir/aio_bdev_0
127	local bdev_aio_name=${aio0##*/} bdev_block_size=4096
128	local lvstore_name=lvstore_test lvstore_uuid
129
130	rpc_cmd bdev_aio_create "$aio0" "$bdev_aio_name" "$bdev_block_size"
131
132	get_bdev_jq bdev_get_bdevs -b "$bdev_aio_name"
133	[[ ${jq_out["name"]} == "$bdev_aio_name" ]]
134	[[ ${jq_out["product_name"]} == "AIO disk" ]]
135	((jq_out["block_size"] == bdev_block_size))
136
137	lvstore_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$bdev_aio_name" "$lvstore_name")
138
139	get_lvs_jq bdev_lvol_get_lvstores -u "$lvstore_uuid"
140	[[ ${jq_out["uuid"]} == "$lvstore_uuid" ]]
141	[[ ${jq_out["name"]} == "$lvstore_name" ]]
142	[[ ${jq_out["base_bdev"]} == "$bdev_aio_name" ]]
143
144	rpc_cmd bdev_lvol_delete_lvstore -u "$lvstore_uuid"
145	rpc_cmd bdev_aio_delete "$bdev_aio_name"
146	# Create aio bdev on the same file
147	rpc_cmd bdev_aio_create "$aio0" "$bdev_aio_name" "$bdev_block_size"
148	# Wait 1 second to allow time for lvolstore tasting
149	sleep 1
150	# bdev_lvol_get_lvstores should not report any existsing lvol stores in configuration
151	# after deleting and adding NVMe bdev, thus check if destroyed lvol store does not exist
152	# on aio bdev anymore.
153	rpc_cmd bdev_lvol_get_lvstores -u "$lvstore_uuid" && false
154
155	# cleanup
156	rpc_cmd bdev_aio_delete "$bdev_aio_name"
157	check_leftover_devices
158}
159
160$SPDK_BIN_DIR/spdk_tgt &
161spdk_pid=$!
162trap 'killprocess "$spdk_pid"; rm -f $testdir/aio_bdev_0 $testdir/aio_bdev_1; exit 1' SIGINT SIGTERM EXIT
163waitforlisten $spdk_pid
164truncate -s "${AIO_SIZE_MB}M" $testdir/aio_bdev_0 $testdir/aio_bdev_1
165
166run_test "test_tasting" test_tasting
167run_test "test_delete_lvol_store_persistent_positive" test_delete_lvol_store_persistent_positive
168
169trap - SIGINT SIGTERM EXIT
170killprocess $spdk_pid
171rm -f $testdir/aio_bdev_0 $testdir/aio_bdev_1
172