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:
parent
e450b8e728
commit
df1e07e909
@ -1420,18 +1420,18 @@ raid_bdev_remove_base_devices(struct raid_bdev_config *raid_cfg,
|
|||||||
* so cleanup should be done here itself.
|
* so cleanup should be done here itself.
|
||||||
*/
|
*/
|
||||||
raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -114,9 +114,84 @@ function raid_function_test() {
|
|||||||
return 0
|
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
|
trap 'on_error_exit;' ERR
|
||||||
|
|
||||||
raid_function_test raid0
|
raid_function_test raid0
|
||||||
raid_function_test concat
|
raid_function_test concat
|
||||||
|
raid_state_function_test raid0
|
||||||
|
raid_state_function_test concat
|
||||||
|
|
||||||
rm -f $tmp_file
|
rm -f $tmp_file
|
||||||
|
Loading…
Reference in New Issue
Block a user