bdev/delay: add uuid option

This patch aligns delay bdev with other bdev modules
that allow passing specific uuid during their creation.
See malloc or null bdev modules.

Change-Id: Icc5e816dd42b2e55e8d57712f2d4f125e486fdab
Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16840
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Tomasz Zawadzki 2023-02-16 16:34:01 +01:00
parent 1afb1effc4
commit 2f08dc7f7f
5 changed files with 43 additions and 5 deletions

View File

@ -39,6 +39,7 @@ SPDK_BDEV_MODULE_REGISTER(delay, &delay_if)
struct bdev_association { struct bdev_association {
char *vbdev_name; char *vbdev_name;
char *bdev_name; char *bdev_name;
struct spdk_uuid uuid;
uint64_t avg_read_latency; uint64_t avg_read_latency;
uint64_t p99_read_latency; uint64_t p99_read_latency;
uint64_t avg_write_latency; uint64_t avg_write_latency;
@ -502,8 +503,15 @@ vbdev_delay_get_io_channel(void *ctx)
static void static void
_delay_write_conf_values(struct vbdev_delay *delay_node, struct spdk_json_write_ctx *w) _delay_write_conf_values(struct vbdev_delay *delay_node, struct spdk_json_write_ctx *w)
{ {
struct spdk_uuid *uuid = &delay_node->delay_bdev.uuid;
char uuid_str[SPDK_UUID_STRING_LEN];
spdk_json_write_named_string(w, "name", spdk_bdev_get_name(&delay_node->delay_bdev)); spdk_json_write_named_string(w, "name", spdk_bdev_get_name(&delay_node->delay_bdev));
spdk_json_write_named_string(w, "base_bdev_name", spdk_bdev_get_name(delay_node->base_bdev)); spdk_json_write_named_string(w, "base_bdev_name", spdk_bdev_get_name(delay_node->base_bdev));
if (!spdk_mem_all_zero(uuid, sizeof(uuid))) {
spdk_uuid_fmt_lower(uuid_str, sizeof(uuid_str), uuid);
spdk_json_write_named_string(w, "uuid", uuid_str);
}
spdk_json_write_named_int64(w, "avg_read_latency", spdk_json_write_named_int64(w, "avg_read_latency",
delay_node->average_read_latency_ticks * SPDK_SEC_TO_USEC / spdk_get_ticks_hz()); delay_node->average_read_latency_ticks * SPDK_SEC_TO_USEC / spdk_get_ticks_hz());
spdk_json_write_named_int64(w, "p99_read_latency", spdk_json_write_named_int64(w, "p99_read_latency",
@ -585,6 +593,7 @@ delay_bdev_ch_destroy_cb(void *io_device, void *ctx_buf)
* on the global list. */ * on the global list. */
static int static int
vbdev_delay_insert_association(const char *bdev_name, const char *vbdev_name, vbdev_delay_insert_association(const char *bdev_name, const char *vbdev_name,
struct spdk_uuid *uuid,
uint64_t avg_read_latency, uint64_t p99_read_latency, uint64_t avg_read_latency, uint64_t p99_read_latency,
uint64_t avg_write_latency, uint64_t p99_write_latency) uint64_t avg_write_latency, uint64_t p99_write_latency)
{ {
@ -623,6 +632,10 @@ vbdev_delay_insert_association(const char *bdev_name, const char *vbdev_name,
assoc->avg_write_latency = avg_write_latency; assoc->avg_write_latency = avg_write_latency;
assoc->p99_write_latency = p99_write_latency; assoc->p99_write_latency = p99_write_latency;
if (uuid) {
spdk_uuid_copy(&assoc->uuid, uuid);
}
TAILQ_INSERT_TAIL(&g_bdev_associations, assoc, link); TAILQ_INSERT_TAIL(&g_bdev_associations, assoc, link);
return 0; return 0;
@ -778,6 +791,8 @@ vbdev_delay_register(const char *bdev_name)
} }
delay_node->delay_bdev.product_name = "delay"; delay_node->delay_bdev.product_name = "delay";
spdk_uuid_copy(&delay_node->delay_bdev.uuid, &assoc->uuid);
/* The base bdev that we're attaching to. */ /* The base bdev that we're attaching to. */
rc = spdk_bdev_open_ext(bdev_name, true, vbdev_delay_base_bdev_event_cb, rc = spdk_bdev_open_ext(bdev_name, true, vbdev_delay_base_bdev_event_cb,
NULL, &delay_node->base_desc); NULL, &delay_node->base_desc);
@ -843,7 +858,8 @@ error_close:
} }
int int
create_delay_disk(const char *bdev_name, const char *vbdev_name, uint64_t avg_read_latency, create_delay_disk(const char *bdev_name, const char *vbdev_name, struct spdk_uuid *uuid,
uint64_t avg_read_latency,
uint64_t p99_read_latency, uint64_t avg_write_latency, uint64_t p99_write_latency) uint64_t p99_read_latency, uint64_t avg_write_latency, uint64_t p99_write_latency)
{ {
int rc = 0; int rc = 0;
@ -853,7 +869,7 @@ create_delay_disk(const char *bdev_name, const char *vbdev_name, uint64_t avg_re
return -EINVAL; return -EINVAL;
} }
rc = vbdev_delay_insert_association(bdev_name, vbdev_name, avg_read_latency, p99_read_latency, rc = vbdev_delay_insert_association(bdev_name, vbdev_name, uuid, avg_read_latency, p99_read_latency,
avg_write_latency, p99_write_latency); avg_write_latency, p99_write_latency);
if (rc) { if (rc) {
return rc; return rc;

View File

@ -24,13 +24,15 @@ enum delay_io_type {
* *
* \param bdev_name Bdev on which delay vbdev will be created. * \param bdev_name Bdev on which delay vbdev will be created.
* \param vbdev_name Name of the delay bdev. * \param vbdev_name Name of the delay bdev.
* \param uuid UUID of the delay bdev.
* \param avg_read_latency Desired typical read latency. * \param avg_read_latency Desired typical read latency.
* \param p99_read_latency Desired p99 read latency * \param p99_read_latency Desired p99 read latency
* \param avg_write_latency Desired typical write latency. * \param avg_write_latency Desired typical write latency.
* \param p99_write_latency Desired p99 write latency * \param p99_write_latency Desired p99 write latency
* \return 0 on success, other on failure. * \return 0 on success, other on failure.
*/ */
int create_delay_disk(const char *bdev_name, const char *vbdev_name, uint64_t avg_read_latency, int create_delay_disk(const char *bdev_name, const char *vbdev_name, struct spdk_uuid *uuid,
uint64_t avg_read_latency,
uint64_t p99_read_latency, uint64_t avg_write_latency, uint64_t p99_write_latency); uint64_t p99_read_latency, uint64_t avg_write_latency, uint64_t p99_write_latency);
/** /**

View File

@ -84,6 +84,7 @@ SPDK_RPC_REGISTER("bdev_delay_update_latency", rpc_bdev_delay_update_latency, SP
struct rpc_construct_delay { struct rpc_construct_delay {
char *base_bdev_name; char *base_bdev_name;
char *name; char *name;
char *uuid;
uint64_t avg_read_latency; uint64_t avg_read_latency;
uint64_t p99_read_latency; uint64_t p99_read_latency;
uint64_t avg_write_latency; uint64_t avg_write_latency;
@ -95,11 +96,13 @@ free_rpc_construct_delay(struct rpc_construct_delay *r)
{ {
free(r->base_bdev_name); free(r->base_bdev_name);
free(r->name); free(r->name);
free(r->uuid);
} }
static const struct spdk_json_object_decoder rpc_construct_delay_decoders[] = { static const struct spdk_json_object_decoder rpc_construct_delay_decoders[] = {
{"base_bdev_name", offsetof(struct rpc_construct_delay, base_bdev_name), spdk_json_decode_string}, {"base_bdev_name", offsetof(struct rpc_construct_delay, base_bdev_name), spdk_json_decode_string},
{"name", offsetof(struct rpc_construct_delay, name), spdk_json_decode_string}, {"name", offsetof(struct rpc_construct_delay, name), spdk_json_decode_string},
{"uuid", offsetof(struct rpc_construct_delay, uuid), spdk_json_decode_string, true},
{"avg_read_latency", offsetof(struct rpc_construct_delay, avg_read_latency), spdk_json_decode_uint64}, {"avg_read_latency", offsetof(struct rpc_construct_delay, avg_read_latency), spdk_json_decode_uint64},
{"p99_read_latency", offsetof(struct rpc_construct_delay, p99_read_latency), spdk_json_decode_uint64}, {"p99_read_latency", offsetof(struct rpc_construct_delay, p99_read_latency), spdk_json_decode_uint64},
{"avg_write_latency", offsetof(struct rpc_construct_delay, avg_write_latency), spdk_json_decode_uint64}, {"avg_write_latency", offsetof(struct rpc_construct_delay, avg_write_latency), spdk_json_decode_uint64},
@ -112,6 +115,8 @@ rpc_bdev_delay_create(struct spdk_jsonrpc_request *request,
{ {
struct rpc_construct_delay req = {NULL}; struct rpc_construct_delay req = {NULL};
struct spdk_json_write_ctx *w; struct spdk_json_write_ctx *w;
struct spdk_uuid *uuid = NULL;
struct spdk_uuid decoded_uuid;
int rc; int rc;
if (spdk_json_decode_object(params, rpc_construct_delay_decoders, if (spdk_json_decode_object(params, rpc_construct_delay_decoders,
@ -123,7 +128,17 @@ rpc_bdev_delay_create(struct spdk_jsonrpc_request *request,
goto cleanup; goto cleanup;
} }
rc = create_delay_disk(req.base_bdev_name, req.name, req.avg_read_latency, req.p99_read_latency, if (req.uuid) {
if (spdk_uuid_parse(&decoded_uuid, req.uuid)) {
spdk_jsonrpc_send_error_response(request, -EINVAL,
"Failed to parse bdev UUID");
goto cleanup;
}
uuid = &decoded_uuid;
}
rc = create_delay_disk(req.base_bdev_name, req.name, uuid, req.avg_read_latency,
req.p99_read_latency,
req.avg_write_latency, req.p99_write_latency); req.avg_write_latency, req.p99_write_latency);
if (rc != 0) { if (rc != 0) {
spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));

View File

@ -1162,7 +1162,7 @@ def bdev_error_create(client, base_name):
return client.call('bdev_error_create', params) return client.call('bdev_error_create', params)
def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency): def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency, uuid=None):
"""Construct a delay block device. """Construct a delay block device.
Args: Args:
@ -1172,6 +1172,7 @@ def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_l
p99_read_latency: complete 1% of read ops with this delay p99_read_latency: complete 1% of read ops with this delay
avg_write_latency: complete 99% of write ops with this delay avg_write_latency: complete 99% of write ops with this delay
p99_write_latency: complete 1% of write ops with this delay p99_write_latency: complete 1% of write ops with this delay
uuid: UUID of block device (optional)
Returns: Returns:
Name of created block device. Name of created block device.
@ -1184,6 +1185,8 @@ def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_l
'avg_write_latency': avg_write_latency, 'avg_write_latency': avg_write_latency,
'p99_write_latency': p99_write_latency, 'p99_write_latency': p99_write_latency,
} }
if uuid:
params['uuid'] = uuid
return client.call('bdev_delay_create', params) return client.call('bdev_delay_create', params)

View File

@ -1024,6 +1024,7 @@ if __name__ == "__main__":
print_json(rpc.bdev.bdev_delay_create(args.client, print_json(rpc.bdev.bdev_delay_create(args.client,
base_bdev_name=args.base_bdev_name, base_bdev_name=args.base_bdev_name,
name=args.name, name=args.name,
uuid=args.uuid,
avg_read_latency=args.avg_read_latency, avg_read_latency=args.avg_read_latency,
p99_read_latency=args.nine_nine_read_latency, p99_read_latency=args.nine_nine_read_latency,
avg_write_latency=args.avg_write_latency, avg_write_latency=args.avg_write_latency,
@ -1033,6 +1034,7 @@ if __name__ == "__main__":
help='Add a delay bdev on existing bdev') help='Add a delay bdev on existing bdev')
p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True) p.add_argument('-b', '--base-bdev-name', help="Name of the existing bdev", required=True)
p.add_argument('-d', '--name', help="Name of the delay bdev", required=True) p.add_argument('-d', '--name', help="Name of the delay bdev", required=True)
p.add_argument('-u', '--uuid', help='UUID of the bdev (optional)')
p.add_argument('-r', '--avg-read-latency', p.add_argument('-r', '--avg-read-latency',
help="Average latency to apply before completing read ops (in microseconds)", required=True, type=int) help="Average latency to apply before completing read ops (in microseconds)", required=True, type=int)
p.add_argument('-t', '--nine-nine-read-latency', p.add_argument('-t', '--nine-nine-read-latency',