Bdev/RAID: cleanup the RAID config even there is no base bdev added

Fix issue: #2557

Related test also added.

Change-Id: I1fa8895cf9dd81c75e5b8b1092733e62be8abd32
Signed-off-by: GangCao <gang.cao@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13061
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: Dong Yi <dongx.yi@intel.com>
This commit is contained in:
GangCao 2022-06-16 23:00:59 -04:00 committed by Tomasz Zawadzki
parent e450b8e728
commit df1e07e909
2 changed files with 84 additions and 9 deletions

View File

@ -1420,18 +1420,18 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg,
* so cleanup should be done here itself.
*/
raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
if (raid_bdev->num_base_bdevs_discovered == 0) {
/* There is no base bdev for this raid, so free the raid device. */
raid_bdev_cleanup(raid_bdev);
if (cb_fn) {
cb_fn(cb_arg, 0);
}
return;
}
}
}
raid_bdev_deconfigure(raid_bdev, cb_fn, cb_arg);
if (raid_bdev->num_base_bdevs_discovered == 0) {
/* There is no base bdev for this raid, so free the raid device. */
raid_bdev_cleanup(raid_bdev);
if (cb_fn) {
cb_fn(cb_arg, 0);
}
} else {
raid_bdev_deconfigure(raid_bdev, cb_fn, cb_arg);
}
}
/*

View File

@ -114,9 +114,84 @@ function raid_function_test() {
return 0
}
function raid_state_function_test() {
local raid_level=$1
local raid_bdev
local base_bdev1="Non_Existed_Base_1"
local base_bdev2="Non_Existed_Base_2"
local raid_bdev_name="Existed_Raid"
$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -L bdev_raid &
raid_pid=$!
echo "Process raid pid: $raid_pid"
waitforlisten $raid_pid $rpc_server
# Step1: create a RAID bdev with no base bdevs
# Expect state: CONFIGURING
$rpc_py bdev_raid_create -z 64 -r $raid_level -b "$base_bdev1 $base_bdev2" -n $raid_bdev_name
raid_bdev=$($rpc_py bdev_raid_get_bdevs configuring | cut -d ' ' -f 1)
if [ $raid_bdev != $raid_bdev_name ]; then
echo "No raid device in SPDK app"
return 1
else
# Test: Delete the RAID bdev successfully
$rpc_py bdev_raid_delete $raid_bdev_name
fi
# Step2: create one base bdev and add to the RAID bdev
# Expect state: CONFIGURING
$rpc_py bdev_raid_create -z 64 -r $raid_level -b "$base_bdev1 $base_bdev2" -n $raid_bdev_name
$rpc_py bdev_malloc_create 32 512 -b $base_bdev1
waitforbdev $base_bdev1
raid_bdev=$($rpc_py bdev_raid_get_bdevs configuring | cut -d ' ' -f 1)
if [ $raid_bdev != $raid_bdev_name ]; then
echo "$raid_bdev_name is not in CONFIGURING state"
$rpc_py bdev_malloc_delete $base_bdev1
$rpc_py bdev_raid_delete $raid_bdev_name
return 1
else
# Test: Delete the RAID bdev successfully
$rpc_py bdev_raid_delete $raid_bdev_name
fi
# Step3: create another base bdev and add to the RAID bdev
# Expect state: ONLINE
$rpc_py bdev_raid_create -z 64 -r $raid_level -b "$base_bdev1 $base_bdev2" -n $raid_bdev_name
$rpc_py bdev_malloc_create 32 512 -b $base_bdev2
waitforbdev $base_bdev2
raid_bdev=$($rpc_py bdev_raid_get_bdevs online | cut -d ' ' -f 1)
if [ $raid_bdev != $raid_bdev_name ]; then
echo "$raid_bdev_name is not in ONLINE state"
$rpc_py bdev_malloc_delete $base_bdev1
$rpc_py bdev_malloc_delete $base_bdev2
$rpc_py bdev_raid_delete $raid_bdev_name
return 1
fi
# Step4: delete one base bdev from the RAID bdev
# Expect state: OFFLINE
$rpc_py bdev_malloc_delete $base_bdev2
raid_bdev=$($rpc_py bdev_raid_get_bdevs offline | cut -d ' ' -f 1)
if [ $raid_bdev != $raid_bdev_name ]; then
echo "$raid_bdev_name is not in OFFLINE state"
$rpc_py bdev_malloc_delete $base_bdev1
$rpc_py bdev_raid_delete $raid_bdev_name
return 1
fi
$rpc_py bdev_malloc_delete $base_bdev1
$rpc_py bdev_raid_delete $raid_bdev_name
killprocess $raid_pid
return 0
}
trap 'on_error_exit;' ERR
raid_function_test raid0
raid_function_test concat
raid_state_function_test raid0
raid_state_function_test concat
rm -f $tmp_file