From ec6d94b67409a852cb576cdcdb446ba028295041 Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Thu, 1 Sep 2022 15:47:57 +0200 Subject: [PATCH] module/raid: show raid_bdev details in bdev_raid_get_bdevs rpc Change-Id: I30a78b63c5ecc988e2a267d58716ea79f849789a Signed-off-by: Artur Paszkiewicz Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14508 Tested-by: SPDK CI Jenkins Reviewed-by: Krzysztof Karas Reviewed-by: Konrad Sztyber Reviewed-by: Aleksey Marchuk Reviewed-by: Shuhei Matsumoto Community-CI: Mellanox Build Bot --- CHANGELOG.md | 2 + doc/jsonrpc.md | 27 ++++++++- module/bdev/raid/bdev_raid.c | 40 ++++++++------ module/bdev/raid/bdev_raid.h | 1 + module/bdev/raid/bdev_raid_rpc.c | 5 +- python/spdk/rpc/bdev.py | 2 +- scripts/rpc.py | 6 +- test/bdev/bdev_raid.sh | 12 ++-- .../lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c | 55 +++++++++---------- 9 files changed, 93 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea3820587..2105e1998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,8 @@ names with this option to restrict allowed RPCs to only that list. Added spdk_rpc_set_allowlist to restrict allowed RPCs to the specified list. +Changed `bdev_raid_get_bdevs` RPC output format to include raid_bdev details. + ### bdevperf Promoted the application to example to match similar programs: fio_plugin and perf. diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 297e97596..3629ce45c 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -9496,7 +9496,7 @@ Example response: ### bdev_raid_get_bdevs {#rpc_bdev_raid_get_bdevs} -This is used to list all the raid bdev names based on the input category requested. Category should be one +This is used to list all the raid bdev details based on the input category requested. Category should be one of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether they are online or configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring' is the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is @@ -9531,7 +9531,30 @@ Example response: "jsonrpc": "2.0", "id": 1, "result": [ - "Raid0" + { + "name": "RaidBdev0", + "strip_size_kb": 128, + "state": "online", + "raid_level": "raid0", + "num_base_bdevs": 2, + "num_base_bdevs_discovered": 2, + "base_bdevs_list": [ + "malloc0", + "malloc1" + ] + }, + { + "name": "RaidBdev1", + "strip_size_kb": 128, + "state": "configuring", + "raid_level": "raid0", + "num_base_bdevs": 2, + "num_base_bdevs_discovered": 1, + "base_bdevs_list": [ + "malloc2", + null + ] + } ] } ~~~ diff --git a/module/bdev/raid/bdev_raid.c b/module/bdev/raid/bdev_raid.c index 28899da29..4c6da968d 100644 --- a/module/bdev/raid/bdev_raid.c +++ b/module/bdev/raid/bdev_raid.c @@ -604,27 +604,13 @@ raid_bdev_get_io_channel(void *ctxt) return spdk_get_io_channel(raid_bdev); } -/* - * brief: - * raid_bdev_dump_info_json is the function table pointer for raid bdev - * params: - * ctx - pointer to raid_bdev - * w - pointer to json context - * returns: - * 0 - success - * non zero - failure - */ -static int -raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) +void +raid_bdev_write_info_json(struct raid_bdev *raid_bdev, struct spdk_json_write_ctx *w) { - struct raid_bdev *raid_bdev = ctx; struct raid_base_bdev_info *base_info; - SPDK_DEBUGLOG(bdev_raid, "raid_bdev_dump_config_json\n"); assert(raid_bdev != NULL); - /* Dump the raid bdev configuration related information */ - spdk_json_write_named_object_begin(w, "raid"); spdk_json_write_named_uint32(w, "strip_size_kb", raid_bdev->strip_size_kb); spdk_json_write_named_string(w, "state", raid_bdev_state_to_str(raid_bdev->state)); spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->level)); @@ -640,6 +626,28 @@ raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) } } spdk_json_write_array_end(w); +} + +/* + * brief: + * raid_bdev_dump_info_json is the function table pointer for raid bdev + * params: + * ctx - pointer to raid_bdev + * w - pointer to json context + * returns: + * 0 - success + * non zero - failure + */ +static int +raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) +{ + struct raid_bdev *raid_bdev = ctx; + + SPDK_DEBUGLOG(bdev_raid, "raid_bdev_dump_config_json\n"); + + /* Dump the raid bdev configuration related information */ + spdk_json_write_named_object_begin(w, "raid"); + raid_bdev_write_info_json(raid_bdev, w); spdk_json_write_object_end(w); return 0; diff --git a/module/bdev/raid/bdev_raid.h b/module/bdev/raid/bdev_raid.h index 1a9bc6cbc..e765f7205 100644 --- a/module/bdev/raid/bdev_raid.h +++ b/module/bdev/raid/bdev_raid.h @@ -171,6 +171,7 @@ enum raid_level raid_bdev_str_to_level(const char *str); const char *raid_bdev_level_to_str(enum raid_level level); enum raid_bdev_state raid_bdev_str_to_state(const char *str); const char *raid_bdev_state_to_str(enum raid_bdev_state state); +void raid_bdev_write_info_json(struct raid_bdev *raid_bdev, struct spdk_json_write_ctx *w); /* * RAID module descriptor diff --git a/module/bdev/raid/bdev_raid_rpc.c b/module/bdev/raid/bdev_raid_rpc.c index a684a3b11..689618766 100644 --- a/module/bdev/raid/bdev_raid_rpc.c +++ b/module/bdev/raid/bdev_raid_rpc.c @@ -87,7 +87,10 @@ rpc_bdev_raid_get_bdevs(struct spdk_jsonrpc_request *request, /* Get raid bdev list based on the category requested */ TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) { if (raid_bdev->state == state || state == RAID_BDEV_STATE_MAX) { - spdk_json_write_string(w, raid_bdev->bdev.name); + spdk_json_write_object_begin(w); + spdk_json_write_named_string(w, "name", raid_bdev->bdev.name); + raid_bdev_write_info_json(raid_bdev, w); + spdk_json_write_object_end(w); } } spdk_json_write_array_end(w); diff --git a/python/spdk/rpc/bdev.py b/python/spdk/rpc/bdev.py index 22ffd8289..9878b71c0 100644 --- a/python/spdk/rpc/bdev.py +++ b/python/spdk/rpc/bdev.py @@ -374,7 +374,7 @@ def bdev_raid_get_bdevs(client, category): category: any one of all or online or configuring or offline Returns: - List of raid bdev names + List of raid bdev details """ params = {'category': category} return client.call('bdev_raid_get_bdevs', params) diff --git a/scripts/rpc.py b/scripts/rpc.py index 40ffd0a56..812681f5e 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -2010,11 +2010,11 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse p.set_defaults(func=bdev_lvol_get_lvstores) def bdev_raid_get_bdevs(args): - print_array(rpc.bdev.bdev_raid_get_bdevs(args.client, - category=args.category)) + print_json(rpc.bdev.bdev_raid_get_bdevs(args.client, + category=args.category)) p = subparsers.add_parser('bdev_raid_get_bdevs', - help="""This is used to list all the raid bdev names based on the input category + help="""This is used to list all the raid bdev details based on the input category requested. Category should be one of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether they are online or configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring' is the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is not registered diff --git a/test/bdev/bdev_raid.sh b/test/bdev/bdev_raid.sh index 70723cca4..43ae2f19a 100755 --- a/test/bdev/bdev_raid.sh +++ b/test/bdev/bdev_raid.sh @@ -90,7 +90,7 @@ function raid_function_test() { waitforlisten $raid_pid $rpc_server configure_raid_bdev $raid_level - raid_bdev=$($rpc_py bdev_raid_get_bdevs online | cut -d ' ' -f 1) + raid_bdev=$($rpc_py bdev_raid_get_bdevs online | jq -r '.[0]["name"] | select(.)') if [ $raid_bdev = "" ]; then echo "No raid0 device in SPDK app" return 1 @@ -133,7 +133,7 @@ function raid_state_function_test() { # 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) + raid_bdev=$($rpc_py bdev_raid_get_bdevs configuring | jq -r '.[0]["name"]') if [ $raid_bdev != $raid_bdev_name ]; then echo "No raid device in SPDK app" return 1 @@ -147,7 +147,7 @@ function raid_state_function_test() { $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) + raid_bdev=$($rpc_py bdev_raid_get_bdevs configuring | jq -r '.[0]["name"]') if [ $raid_bdev != $raid_bdev_name ]; then echo "$raid_bdev_name is not in CONFIGURING state" $rpc_py bdev_malloc_delete $base_bdev1 @@ -163,7 +163,7 @@ function raid_state_function_test() { $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) + raid_bdev=$($rpc_py bdev_raid_get_bdevs online | jq -r '.[0]["name"]') if [ $raid_bdev != $raid_bdev_name ]; then echo "$raid_bdev_name is not in ONLINE state" $rpc_py bdev_malloc_delete $base_bdev1 @@ -175,7 +175,7 @@ function raid_state_function_test() { # 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) + raid_bdev=$($rpc_py bdev_raid_get_bdevs offline | jq -r '.[0]["name"]') if [ $raid_bdev != $raid_bdev_name ]; then echo "$raid_bdev_name is not in OFFLINE state" $rpc_py bdev_malloc_delete $base_bdev1 @@ -186,7 +186,7 @@ function raid_state_function_test() { # Step5: delete last base bdev from the RAID bdev # Expect state: removed from system $rpc_py bdev_malloc_delete $base_bdev1 - raid_bdev=$($rpc_py bdev_raid_get_bdevs all | cut -d ' ' -f 1) + raid_bdev=$($rpc_py bdev_raid_get_bdevs all | jq -r '.[0]["name"] | select(.)') if [ -n "$raid_bdev" ]; then echo "$raid_bdev_name is not removed" $rpc_py bdev_raid_delete $raid_bdev_name diff --git a/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c b/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c index c0f593a79..92eef707f 100644 --- a/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c +++ b/test/unit/lib/bdev/raid/bdev_raid.c/bdev_raid_ut.c @@ -101,6 +101,7 @@ DEFINE_STUB(spdk_json_write_name, int, (struct spdk_json_write_ctx *w, const cha DEFINE_STUB(spdk_json_write_object_begin, int, (struct spdk_json_write_ctx *w), 0); DEFINE_STUB(spdk_json_write_named_object_begin, int, (struct spdk_json_write_ctx *w, const char *name), 0); +DEFINE_STUB(spdk_json_write_string, int, (struct spdk_json_write_ctx *w, const char *val), 0); DEFINE_STUB(spdk_json_write_object_end, int, (struct spdk_json_write_ctx *w), 0); DEFINE_STUB(spdk_json_write_array_begin, int, (struct spdk_json_write_ctx *w), 0); DEFINE_STUB(spdk_json_write_array_end, int, (struct spdk_json_write_ctx *w), 0); @@ -391,19 +392,21 @@ spdk_sprintf_alloc(const char *format, ...) int spdk_json_write_named_uint32(struct spdk_json_write_ctx *w, const char *name, uint32_t val) { - struct rpc_bdev_raid_create *req = g_rpc_req; - if (strcmp(name, "strip_size_kb") == 0) { - CU_ASSERT(req->strip_size_kb == val); - } else if (strcmp(name, "blocklen_shift") == 0) { - CU_ASSERT(spdk_u32log2(g_block_len) == val); - } else if (strcmp(name, "num_base_bdevs") == 0) { - CU_ASSERT(req->base_bdevs.num_base_bdevs == val); - } else if (strcmp(name, "state") == 0) { - CU_ASSERT(val == RAID_BDEV_STATE_ONLINE); - } else if (strcmp(name, "destruct_called") == 0) { - CU_ASSERT(val == 0); - } else if (strcmp(name, "num_base_bdevs_discovered") == 0) { - CU_ASSERT(req->base_bdevs.num_base_bdevs == val); + if (!g_test_multi_raids) { + struct rpc_bdev_raid_create *req = g_rpc_req; + if (strcmp(name, "strip_size_kb") == 0) { + CU_ASSERT(req->strip_size_kb == val); + } else if (strcmp(name, "blocklen_shift") == 0) { + CU_ASSERT(spdk_u32log2(g_block_len) == val); + } else if (strcmp(name, "num_base_bdevs") == 0) { + CU_ASSERT(req->base_bdevs.num_base_bdevs == val); + } else if (strcmp(name, "state") == 0) { + CU_ASSERT(val == RAID_BDEV_STATE_ONLINE); + } else if (strcmp(name, "destruct_called") == 0) { + CU_ASSERT(val == 0); + } else if (strcmp(name, "num_base_bdevs_discovered") == 0) { + CU_ASSERT(req->base_bdevs.num_base_bdevs == val); + } } return 0; } @@ -411,9 +414,17 @@ spdk_json_write_named_uint32(struct spdk_json_write_ctx *w, const char *name, ui int spdk_json_write_named_string(struct spdk_json_write_ctx *w, const char *name, const char *val) { - struct rpc_bdev_raid_create *req = g_rpc_req; - if (strcmp(name, "raid_level") == 0) { - CU_ASSERT(strcmp(val, raid_bdev_level_to_str(req->level)) == 0); + if (g_test_multi_raids) { + if (strcmp(name, "name") == 0) { + g_get_raids_output[g_get_raids_count] = strdup(val); + SPDK_CU_ASSERT_FATAL(g_get_raids_output[g_get_raids_count] != NULL); + g_get_raids_count++; + } + } else { + struct rpc_bdev_raid_create *req = g_rpc_req; + if (strcmp(name, "raid_level") == 0) { + CU_ASSERT(strcmp(val, raid_bdev_level_to_str(req->level)) == 0); + } } return 0; } @@ -518,18 +529,6 @@ spdk_jsonrpc_begin_result(struct spdk_jsonrpc_request *request) return (void *)1; } -int -spdk_json_write_string(struct spdk_json_write_ctx *w, const char *val) -{ - if (g_test_multi_raids) { - g_get_raids_output[g_get_raids_count] = strdup(val); - SPDK_CU_ASSERT_FATAL(g_get_raids_output[g_get_raids_count] != NULL); - g_get_raids_count++; - } - - return 0; -} - void spdk_jsonrpc_send_error_response(struct spdk_jsonrpc_request *request, int error_code, const char *msg)