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