Commit df1e07e9 authored by GangCao's avatar GangCao Committed by Tomasz Zawadzki
Browse files

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: default avatarGangCao <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: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarDong Yi <dongx.yi@intel.com>
parent e450b8e7
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -1420,19 +1420,19 @@ 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;
			}
		}
	}

	} else {
		raid_bdev_deconfigure(raid_bdev, cb_fn, cb_arg);
	}
}

/*
 * brief:
+75 −0
Original line number Diff line number Diff line
@@ -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