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