Commit 8a1acca6 authored by paul luse's avatar paul luse Committed by Jim Harris
Browse files

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: default avatarpaul luse <paul.e.luse@intel.com>
Reviewed-on: https://review.gerrithub.io/c/437873


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 1a150069
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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
+12 −4
Original line number Diff line number Diff line
@@ -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);

+3 −0
Original line number Diff line number Diff line
@@ -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;

+26 −7
Original line number Diff line number Diff line
@@ -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},
};
@@ -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,
+3 −1
Original line number Diff line number Diff line
@@ -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)
Loading