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