From b8c84b1a39afc69a2a34d092b93d73617fe510ed Mon Sep 17 00:00:00 2001 From: Karol Latecki Date: Fri, 12 Jul 2019 10:30:34 +0200 Subject: [PATCH] bdev/error: add more descriptive rpc error messages Improve error messages where possible. Change-Id: Ieaae6f2477d4a9f636cc861afbe5d80b3c74a46c Signed-off-by: Karol Latecki Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/461562 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Darek Stojaczyk Reviewed-by: Vitaliy Mysak --- lib/bdev/error/vbdev_error.c | 4 +- lib/bdev/error/vbdev_error_rpc.c | 68 +++++++++++++++----------------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/lib/bdev/error/vbdev_error.c b/lib/bdev/error/vbdev_error.c index 213e71c08..527439f77 100644 --- a/lib/bdev/error/vbdev_error.c +++ b/lib/bdev/error/vbdev_error.c @@ -108,7 +108,7 @@ spdk_vbdev_inject_error(char *name, uint32_t io_type, uint32_t error_type, uint3 if (!bdev) { SPDK_ERRLOG("Could not find ErrorInjection bdev %s\n", name); pthread_mutex_unlock(&g_vbdev_error_mutex); - return -1; + return -ENODEV; } TAILQ_FOREACH(part, &g_error_disks, tailq) { @@ -121,7 +121,7 @@ spdk_vbdev_inject_error(char *name, uint32_t io_type, uint32_t error_type, uint3 if (error_disk == NULL) { SPDK_ERRLOG("Could not find ErrorInjection bdev %s\n", name); pthread_mutex_unlock(&g_vbdev_error_mutex); - return -1; + return -ENODEV; } if (0xffffffff == io_type) { diff --git a/lib/bdev/error/vbdev_error_rpc.c b/lib/bdev/error/vbdev_error_rpc.c index 8d95fd093..b3694cffd 100644 --- a/lib/bdev/error/vbdev_error_rpc.c +++ b/lib/bdev/error/vbdev_error_rpc.c @@ -92,34 +92,32 @@ spdk_rpc_construct_error_bdev(struct spdk_jsonrpc_request *request, { struct rpc_construct_error_bdev req = {}; struct spdk_json_write_ctx *w; + int rc = 0; if (spdk_json_decode_object(params, rpc_construct_error_bdev_decoders, SPDK_COUNTOF(rpc_construct_error_bdev_decoders), &req)) { SPDK_ERRLOG("spdk_json_decode_object failed\n"); - goto invalid; + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + "spdk_json_decode_object failed"); + goto cleanup; } - if (spdk_vbdev_error_create(req.base_name)) { - SPDK_ERRLOG("Could not create ErrorInjection bdev %s\n", req.base_name); - goto invalid; + rc = spdk_vbdev_error_create(req.base_name); + if (rc) { + spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); + goto cleanup; } w = spdk_jsonrpc_begin_result(request); if (w == NULL) { - free_rpc_construct_error_bdev(&req); - return; + goto cleanup; } spdk_json_write_bool(w, true); spdk_jsonrpc_end_result(request, w); - free_rpc_construct_error_bdev(&req); - - return; - -invalid: - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); +cleanup: free_rpc_construct_error_bdev(&req); } SPDK_RPC_REGISTER("construct_error_bdev", spdk_rpc_construct_error_bdev, SPDK_RPC_RUNTIME) @@ -159,30 +157,25 @@ spdk_rpc_delete_error_bdev(struct spdk_jsonrpc_request *request, { struct rpc_delete_error req = {NULL}; struct spdk_bdev *vbdev; - int rc; if (spdk_json_decode_object(params, rpc_delete_error_decoders, SPDK_COUNTOF(rpc_delete_error_decoders), &req)) { - rc = -EINVAL; - goto invalid; + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + "spdk_json_decode_object failed"); + goto cleanup; } vbdev = spdk_bdev_get_by_name(req.name); if (vbdev == NULL) { - rc = -ENODEV; - goto invalid; + spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); + goto cleanup; } spdk_vbdev_error_delete(vbdev, _spdk_rpc_delete_error_bdev_cb, request); +cleanup: free_rpc_delete_error(&req); - - return; - -invalid: - free_rpc_delete_error(&req); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, spdk_strerror(-rc)); } SPDK_RPC_REGISTER("delete_error_bdev", spdk_rpc_delete_error_bdev, SPDK_RPC_RUNTIME) @@ -216,43 +209,46 @@ spdk_rpc_bdev_inject_error(struct spdk_jsonrpc_request *request, struct spdk_json_write_ctx *w; uint32_t io_type; uint32_t error_type; - int ret; + int rc = 0; if (spdk_json_decode_object(params, rpc_error_information_decoders, SPDK_COUNTOF(rpc_error_information_decoders), &req)) { SPDK_ERRLOG("spdk_json_decode_object failed\n"); - goto invalid; + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + "spdk_json_decode_object failed"); + goto cleanup; } io_type = spdk_rpc_error_bdev_io_type_parse(req.io_type); if (io_type == ERROR_BDEV_IO_TYPE_INVALID) { - goto invalid; + spdk_jsonrpc_send_error_response(request, -EINVAL, + "Unexpected io_type value"); + goto cleanup; } error_type = spdk_rpc_error_bdev_error_type_parse(req.error_type); if (error_type == ERROR_BDEV_ERROR_TYPE_INVALID) { - goto invalid; + spdk_jsonrpc_send_error_response(request, -EINVAL, + "Unexpected error_type value"); + goto cleanup; } - ret = spdk_vbdev_inject_error(req.name, io_type, error_type, req.num); - if (ret) { - goto invalid; + rc = spdk_vbdev_inject_error(req.name, io_type, error_type, req.num); + if (rc) { + spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); + goto cleanup; } - free_rpc_error_information(&req); - w = spdk_jsonrpc_begin_result(request); if (w == NULL) { - return; + goto cleanup; } spdk_json_write_bool(w, true); spdk_jsonrpc_end_result(request, w); - return; -invalid: - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); +cleanup: free_rpc_error_information(&req); } SPDK_RPC_REGISTER("bdev_inject_error", spdk_rpc_bdev_inject_error, SPDK_RPC_RUNTIME)