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:
parent
1a150069e1
commit
8a1acca65d
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user