From df1e07e90956fbf915d9142e51e6cb0638c6bea1 Mon Sep 17 00:00:00 2001 From: GangCao Date: Thu, 16 Jun 2022 23:00:59 -0400 Subject: [PATCH] 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 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13061 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Dong Yi --- module/bdev/raid/bdev_raid.c | 18 ++++----- test/bdev/bdev_raid.sh | 75 ++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 9 deletions(-) diff --git a/module/bdev/raid/bdev_raid.c b/module/bdev/raid/bdev_raid.c index 3b5d53616..bf0e61c5a 100644 --- a/module/bdev/raid/bdev_raid.c +++ b/module/bdev/raid/bdev_raid.c @@ -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); + } } /* diff --git a/test/bdev/bdev_raid.sh b/test/bdev/bdev_raid.sh index a0a8f0f2d..f69083488 100755 --- a/test/bdev/bdev_raid.sh +++ b/test/bdev/bdev_raid.sh @@ -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