Spdk/test/lvol/tasting.sh
paul luse eb53c23236 add (c) and SPDX header to bash files as needed
per Intel policy to include file commit date using git cmd
below.  The policy does not apply to non-Intel (C) notices.

git log --follow -C90% --format=%ad --date default <file> | tail -1

and then pull just the year from the result.

Intel copyrights were not added to files where Intel either had
no contribution ot the contribution lacked substance (ie license
header updates, formatting changes, etc)

For intel copyrights added, --follow and -C95% were used.

Signed-off-by: paul luse <paul.e.luse@intel.com>
Change-Id: I2ef86976095b88a9bf5b1003e59f3943cd6bbe4c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15209
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Krzysztof Karas <krzysztof.karas@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2022-11-29 08:27:51 +00:00

175 lines
6.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2019 Intel Corporation
# All rights reserved.
#
testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../..)
source $rootdir/test/common/autotest_common.sh
source $rootdir/test/lvol/common.sh
# Make sure lvol stores are automatically detected after base bdev detach and subsequent attach
function test_tasting() {
# Create two aio bdevs
rpc_cmd bdev_aio_create $testdir/aio_bdev_0 aio_bdev0 "$AIO_BS"
rpc_cmd bdev_aio_create $testdir/aio_bdev_1 aio_bdev1 "$AIO_BS"
# Create a valid lvs
lvs_uuid=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev0 lvs_test)
# Destroy lvol store
rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid"
# Remove the lvol stores and make sure it's not being automatically detected after base
# bdev re-attach.
rpc_cmd bdev_aio_delete aio_bdev0
# Create aio bdev on the same file
rpc_cmd bdev_aio_create $testdir/aio_bdev_0 aio_bdev0 "$AIO_BS"
sleep 1
# Check if destroyed lvol store does not exist on aio bdev
rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid" && false
# Create a valid lvs
lvs1_cluster_size=$((1 * 1024 * 1024))
lvs2_cluster_size=$((32 * 1024 * 1024))
lvs_uuid1=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev0 lvs_test1 -c $lvs1_cluster_size)
lvs_uuid2=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev1 lvs_test2 -c $lvs2_cluster_size)
# Create 5 lvols on first lvs
lvol_size_mb=$(round_down $((LVS_DEFAULT_CAPACITY_MB / 10)))
lvol_size=$((lvol_size_mb * 1024 * 1024))
for i in $(seq 1 5); do
lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "lvol_test${i}" "$lvol_size_mb")
lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test1/lvol_test${i}" ]
[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$AIO_BS" ]
[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / AIO_BS))" ]
done
# Create 5 lvols on second lvs
lvol2_size_mb=$(round_down $(((AIO_SIZE_MB - 16) / 5)) 32)
lvol2_size=$((lvol2_size_mb * 1024 * 1024))
for i in $(seq 1 5); do
lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid2" "lvol_test${i}" "$lvol2_size_mb")
lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test2/lvol_test${i}" ]
[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$AIO_BS" ]
[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol2_size / AIO_BS))" ]
done
old_lvols=$(rpc_cmd bdev_get_bdevs | jq -r '[ .[] | select(.product_name == "Logical Volume") ]')
[ "$(jq length <<< "$old_lvols")" == "10" ]
old_lvs=$(rpc_cmd bdev_lvol_get_lvstores | jq .)
# Restart spdk app
killprocess $spdk_pid
$SPDK_BIN_DIR/spdk_tgt &
spdk_pid=$!
waitforlisten $spdk_pid
# Create aio bdevs
rpc_cmd bdev_aio_create $testdir/aio_bdev_0 aio_bdev0 "$AIO_BS"
rpc_cmd bdev_aio_create $testdir/aio_bdev_1 aio_bdev1 "$AIO_BS"
sleep 1
# Check tasting feature
new_lvols=$(rpc_cmd bdev_get_bdevs | jq -r '[ .[] | select(.product_name == "Logical Volume") ]')
[ "$(jq length <<< "$new_lvols")" == "10" ]
new_lvs=$(rpc_cmd bdev_lvol_get_lvstores | jq .)
if ! diff <(jq '. | sort' <<< "$old_lvs") <(jq '. | sort' <<< "$new_lvs"); then
echo "ERROR: old and loaded lvol store is not the same"
return 1
fi
if ! diff <(jq '. | sort' <<< "$old_lvols") <(jq '. | sort' <<< "$new_lvols"); then
echo "ERROR: old and loaded lvols are not the same"
return 1
fi
# Check if creation and deletion lvol bdevs on lvs is possible
for i in $(seq 6 10); do
lvol_uuid=$(rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "lvol_test${i}" "$lvol_size_mb")
lvol=$(rpc_cmd bdev_get_bdevs -b "$lvol_uuid")
[ "$(jq -r '.[0].name' <<< "$lvol")" = "$lvol_uuid" ]
[ "$(jq -r '.[0].uuid' <<< "$lvol")" = "$lvol_uuid" ]
[ "$(jq -r '.[0].aliases[0]' <<< "$lvol")" = "lvs_test1/lvol_test${i}" ]
[ "$(jq -r '.[0].block_size' <<< "$lvol")" = "$AIO_BS" ]
[ "$(jq -r '.[0].num_blocks' <<< "$lvol")" = "$((lvol_size / AIO_BS))" ]
done
for i in $(seq 1 10); do
rpc_cmd bdev_lvol_delete "lvs_test1/lvol_test${i}"
done
rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid1"
# Create an lvstore and 10 lvol on top to see if deletion of such struct works as it should.
lvs_uuid1=$(rpc_cmd bdev_lvol_create_lvstore aio_bdev0 lvs_test1)
for i in $(seq 1 10); do
rpc_cmd bdev_lvol_create -u "$lvs_uuid1" "lvol_test${i}" "$lvol_size_mb"
done
# Clean up
rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid1"
rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid1" && false
rpc_cmd bdev_lvol_delete_lvstore -u "$lvs_uuid2"
rpc_cmd bdev_lvol_get_lvstores -u "$lvs_uuid2" && false
rpc_cmd bdev_aio_delete aio_bdev0
rpc_cmd bdev_aio_delete aio_bdev1
check_leftover_devices
}
# Positive test for removing lvol store persistently
function test_delete_lvol_store_persistent_positive() {
local aio0=$testdir/aio_bdev_0
local bdev_aio_name=${aio0##*/} bdev_block_size=4096
local lvstore_name=lvstore_test lvstore_uuid
rpc_cmd bdev_aio_create "$aio0" "$bdev_aio_name" "$bdev_block_size"
get_bdev_jq bdev_get_bdevs -b "$bdev_aio_name"
[[ ${jq_out["name"]} == "$bdev_aio_name" ]]
[[ ${jq_out["product_name"]} == "AIO disk" ]]
((jq_out["block_size"] == bdev_block_size))
lvstore_uuid=$(rpc_cmd bdev_lvol_create_lvstore "$bdev_aio_name" "$lvstore_name")
get_lvs_jq bdev_lvol_get_lvstores -u "$lvstore_uuid"
[[ ${jq_out["uuid"]} == "$lvstore_uuid" ]]
[[ ${jq_out["name"]} == "$lvstore_name" ]]
[[ ${jq_out["base_bdev"]} == "$bdev_aio_name" ]]
rpc_cmd bdev_lvol_delete_lvstore -u "$lvstore_uuid"
rpc_cmd bdev_aio_delete "$bdev_aio_name"
# Create aio bdev on the same file
rpc_cmd bdev_aio_create "$aio0" "$bdev_aio_name" "$bdev_block_size"
# Wait 1 second to allow time for lvolstore tasting
sleep 1
# bdev_lvol_get_lvstores should not report any existing lvol stores in configuration
# after deleting and adding NVMe bdev, thus check if destroyed lvol store does not exist
# on aio bdev anymore.
rpc_cmd bdev_lvol_get_lvstores -u "$lvstore_uuid" && false
# cleanup
rpc_cmd bdev_aio_delete "$bdev_aio_name"
check_leftover_devices
}
$SPDK_BIN_DIR/spdk_tgt &
spdk_pid=$!
trap 'killprocess "$spdk_pid"; rm -f $testdir/aio_bdev_0 $testdir/aio_bdev_1; exit 1' SIGINT SIGTERM EXIT
waitforlisten $spdk_pid
truncate -s "${AIO_SIZE_MB}M" $testdir/aio_bdev_0 $testdir/aio_bdev_1
run_test "test_tasting" test_tasting
run_test "test_delete_lvol_store_persistent_positive" test_delete_lvol_store_persistent_positive
trap - SIGINT SIGTERM EXIT
killprocess $spdk_pid
rm -f $testdir/aio_bdev_0 $testdir/aio_bdev_1