bdev/raid: Add strip_size_kb rpc param for create

strip_size as an rpc param is now deprecated and can be removed
in a future release.  Either strip_size or strip_size_kb can be
used but only one of them or the rpc will fail.

Internally we maintain both fields because strip size always
comes in as KB but we convert it to blocks so having both elements
makes it clear for developers what they're looking at.

JSON output includes both strip_size and strip_size_kb.

Fixes #550

Change-Id: I5dc51e8af22eae3d56af8f8d37a564dbaae228fa
Signed-off-by: paul luse <paul.e.luse@intel.com>
Reviewed-on: https://review.gerrithub.io/c/437873
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
paul luse 2018-12-19 13:04:18 -05:00 committed by Jim Harris
parent 1a150069e1
commit 8a1acca65d
6 changed files with 60 additions and 16 deletions

View File

@ -2,6 +2,11 @@
## v19.04: (Upcoming Release)
### raid
Added new strip_size_kb rpc param on create to replace the more ambiguous
strip_size. The strip_size rpc param is deprecated.
## v19.01:
### ocf bdev

View File

@ -675,6 +675,7 @@ raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
/* Dump the raid bdev configuration related information */
spdk_json_write_named_object_begin(w, "raid");
spdk_json_write_named_uint32(w, "strip_size", raid_bdev->strip_size);
spdk_json_write_named_uint32(w, "strip_size_kb", raid_bdev->strip_size_kb);
spdk_json_write_named_uint32(w, "state", raid_bdev->state);
spdk_json_write_named_uint32(w, "raid_level", raid_bdev->raid_level);
spdk_json_write_named_uint32(w, "destruct_called", raid_bdev->destruct_called);
@ -717,7 +718,7 @@ raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *
spdk_json_write_named_object_begin(w, "params");
spdk_json_write_named_string(w, "name", bdev->name);
spdk_json_write_named_uint32(w, "strip_size", raid_bdev->strip_size);
spdk_json_write_named_uint32(w, "strip_size", raid_bdev->strip_size_kb);
spdk_json_write_named_uint32(w, "raid_level", raid_bdev->raid_level);
spdk_json_write_named_array_begin(w, "base_bdevs");
@ -1121,7 +1122,7 @@ raid_bdev_get_running_config(FILE *fp)
" StripSize %" PRIu32 "\n"
" NumDevices %hu\n"
" RaidLevel %hhu\n",
index, raid_bdev->bdev.name, raid_bdev->strip_size,
index, raid_bdev->bdev.name, raid_bdev->strip_size_kb,
raid_bdev->num_base_bdevs, raid_bdev->raid_level);
fprintf(fp,
" Devices ");
@ -1254,7 +1255,11 @@ raid_bdev_create(struct raid_bdev_config *raid_cfg)
return -ENOMEM;
}
raid_bdev->strip_size = raid_cfg->strip_size;
/* strip_size_kb is from the rpc param. strip_size is in blocks and used
* intnerally and set later.
*/
raid_bdev->strip_size = 0;
raid_bdev->strip_size_kb = raid_cfg->strip_size;
raid_bdev->state = RAID_BDEV_STATE_CONFIGURING;
raid_bdev->config = raid_cfg;
@ -1364,7 +1369,10 @@ raid_bdev_configure(struct raid_bdev *raid_bdev)
}
}
raid_bdev->strip_size = (raid_bdev->strip_size * 1024) / blocklen;
/* The strip_size_kb is read in from user in KB. Convert to blocks here for
* internal use.
*/
raid_bdev->strip_size = (raid_bdev->strip_size_kb * 1024) / blocklen;
raid_bdev->strip_size_shift = spdk_u32log2(raid_bdev->strip_size);
raid_bdev->blocklen_shift = spdk_u32log2(blocklen);

View File

@ -104,6 +104,9 @@ struct raid_bdev {
/* strip size of raid bdev in blocks */
uint32_t strip_size;
/* strip size of raid bdev in KB */
uint32_t strip_size_kb;
/* strip size bit shift for optimized calculation */
uint32_t strip_size_shift;

View File

@ -162,8 +162,9 @@ struct rpc_construct_raid_bdev {
/* Raid bdev name */
char *name;
/* RAID strip size */
/* RAID strip size KB, 'strip_size' is deprecated. */
uint32_t strip_size;
uint32_t strip_size_kb;
/* RAID raid level */
uint8_t raid_level;
@ -203,9 +204,11 @@ decode_base_bdevs(const struct spdk_json_val *val, void *out)
/*
* Decoder object for RPC construct_raid
*/
/* Note: strip_size is deprecated, one of the two options must be specified but not both. */
static const struct spdk_json_object_decoder rpc_construct_raid_bdev_decoders[] = {
{"name", offsetof(struct rpc_construct_raid_bdev, name), spdk_json_decode_string},
{"strip_size", offsetof(struct rpc_construct_raid_bdev, strip_size), spdk_json_decode_uint32},
{"strip_size", offsetof(struct rpc_construct_raid_bdev, strip_size), spdk_json_decode_uint32, true},
{"strip_size_kb", offsetof(struct rpc_construct_raid_bdev, strip_size_kb), spdk_json_decode_uint32, true},
{"raid_level", offsetof(struct rpc_construct_raid_bdev, raid_level), spdk_json_decode_uint32},
{"base_bdevs", offsetof(struct rpc_construct_raid_bdev, base_bdevs), decode_base_bdevs},
};
@ -224,10 +227,10 @@ static void
spdk_rpc_construct_raid_bdev(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_construct_raid_bdev req = {};
struct spdk_json_write_ctx *w;
struct raid_bdev_config *raid_cfg;
int rc;
struct rpc_construct_raid_bdev req = {};
struct spdk_json_write_ctx *w;
struct raid_bdev_config *raid_cfg;
int rc;
if (spdk_json_decode_object(params, rpc_construct_raid_bdev_decoders,
SPDK_COUNTOF(rpc_construct_raid_bdev_decoders),
@ -238,7 +241,23 @@ spdk_rpc_construct_raid_bdev(struct spdk_jsonrpc_request *request,
return;
}
rc = raid_bdev_config_add(req.name, req.strip_size, req.base_bdevs.num_base_bdevs, req.raid_level,
if (req.strip_size == 0 && req.strip_size_kb == 0) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
"strip size not specified");
free_rpc_construct_raid_bdev(&req);
return;
} else if (req.strip_size > 0 && req.strip_size_kb > 0) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
"please use only one strip size option");
free_rpc_construct_raid_bdev(&req);
return;
} else if (req.strip_size > 0 && req.strip_size_kb == 0) {
SPDK_ERRLOG("the rpc param strip_size is depretaced.");
req.strip_size_kb = req.strip_size;
}
rc = raid_bdev_config_add(req.name, req.strip_size_kb, req.base_bdevs.num_base_bdevs,
req.raid_level,
&raid_cfg);
if (rc != 0) {
spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,

View File

@ -1212,11 +1212,13 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
rpc.bdev.construct_raid_bdev(args.client,
name=args.name,
strip_size=args.strip_size,
strip_size_kb=args.strip_size_kb,
raid_level=args.raid_level,
base_bdevs=base_bdevs)
p = subparsers.add_parser('construct_raid_bdev', help='Construct new raid bdev')
p.add_argument('-n', '--name', help='raid bdev name', required=True)
p.add_argument('-s', '--strip-size', help='strip size in KB', type=int, required=True)
p.add_argument('-s', '--strip-size', help='strip size in KB (deprecated)', type=int)
p.add_argument('-z', '--strip-size_kb', help='strip size in KB', type=int)
p.add_argument('-r', '--raid-level', help='raid level, only raid level 0 is supported', type=int, required=True)
p.add_argument('-b', '--base-bdevs', help='base bdevs name, whitespace separated list in quotes', required=True)
p.set_defaults(func=construct_raid_bdev)

View File

@ -168,19 +168,26 @@ def get_raid_bdevs(client, category):
return client.call('get_raid_bdevs', params)
def construct_raid_bdev(client, name, strip_size, raid_level, base_bdevs):
"""Construct pooled device
def construct_raid_bdev(client, name, raid_level, base_bdevs, strip_size=None, strip_size_kb=None):
"""Construct pooled device. Either strip size arg will work but one is required.
Args:
name: user defined raid bdev name
strip_size: strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, 512, 1024 etc
strip_size (deprecated): strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
strip_size_kb: strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
raid_level: raid level of raid bdev, supported values 0
base_bdevs: Space separated names of Nvme bdevs in double quotes, like "Nvme0n1 Nvme1n1 Nvme2n1"
Returns:
None
"""
params = {'name': name, 'strip_size': strip_size, 'raid_level': raid_level, 'base_bdevs': base_bdevs}
params = {'name': name, 'raid_level': raid_level, 'base_bdevs': base_bdevs}
if strip_size:
params['strip_size'] = strip_size
if strip_size_kb:
params['strip_size_kb'] = strip_size_kb
return client.call('construct_raid_bdev', params)