blobstore: add RPC for growing blobstore

Add num_md_pages_per_cluster_ratio parameter to bdev_lvol_create_lvstore.
Add bdev_lvol_grow_lvstore rpc.

Signed-off-by: Peng Yu <yupeng0921@gmail.com>
Change-Id: I43a129efbc1a08f9d0df027e80f63ab1393163a2
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9734
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
yupeng 2021-10-05 15:20:24 +00:00 committed by Ben Walker
parent 1f0b8df7b0
commit 4c59c6ac53
3 changed files with 57 additions and 8 deletions

View File

@ -7862,12 +7862,27 @@ Construct a logical volume store.
#### Parameters #### Parameters
Name | Optional | Type | Description Name | Optional | Type | Description
----------------------- | -------- | ----------- | ----------- ----------------------------- | -------- | ----------- | -----------
bdev_name | Required | string | Bdev on which to construct logical volume store bdev_name | Required | string | Bdev on which to construct logical volume store
lvs_name | Required | string | Name of the logical volume store to create lvs_name | Required | string | Name of the logical volume store to create
cluster_sz | Optional | number | Cluster size of the logical volume store in bytes cluster_sz | Optional | number | Cluster size of the logical volume store in bytes (Default: 4MiB)
clear_method | Optional | string | Change clear method for data region. Available: none, unmap (default), write_zeroes clear_method | Optional | string | Change clear method for data region. Available: none, unmap (default), write_zeroes
num_md_pages_per_cluster_ratio| Optional | number | Reserved metadata pages per cluster (Default: 100)
The num_md_pages_per_cluster_ratio defines the amount of metadata to
allocate when the logical volume store is created. The default value
is '100', which translates to 1 4KiB per cluster. For the default 4MiB
cluster size, this equates to about 0.1% of the underlying block
device allocated for metadata. Logical volume stores can be grown, if
the size of the underlying block device grows in the future, but only
if enough metadata pages were allocated to support the growth. So
num_md_pages_per_cluster_ratio should be set to a higher value if
wanting to support future growth. For example,
num_md_pages_per_cluster_ratio = 200 would support future 2x growth of
the logical volume store, and would result in 0.2% of the underlying
block device allocated for metadata (with a default 4MiB cluster
size).
#### Response #### Response

View File

@ -1,4 +1,5 @@
def bdev_lvol_create_lvstore(client, bdev_name, lvs_name, cluster_sz=None, clear_method=None): def bdev_lvol_create_lvstore(client, bdev_name, lvs_name, cluster_sz=None,
clear_method=None, num_md_pages_per_cluster_ratio=None):
"""Construct a logical volume store. """Construct a logical volume store.
Args: Args:
@ -6,6 +7,7 @@ def bdev_lvol_create_lvstore(client, bdev_name, lvs_name, cluster_sz=None, clear
lvs_name: name of the logical volume store to create lvs_name: name of the logical volume store to create
cluster_sz: cluster size of the logical volume store in bytes (optional) cluster_sz: cluster size of the logical volume store in bytes (optional)
clear_method: Change clear method for data region. Available: none, unmap, write_zeroes (optional) clear_method: Change clear method for data region. Available: none, unmap, write_zeroes (optional)
num_md_pages_per_cluster_ratio: metadata pages per cluster (optional)
Returns: Returns:
UUID of created logical volume store. UUID of created logical volume store.
@ -15,6 +17,8 @@ def bdev_lvol_create_lvstore(client, bdev_name, lvs_name, cluster_sz=None, clear
params['cluster_sz'] = cluster_sz params['cluster_sz'] = cluster_sz
if clear_method: if clear_method:
params['clear_method'] = clear_method params['clear_method'] = clear_method
if num_md_pages_per_cluster_ratio:
params['num_md_pages_per_cluster_ratio'] = num_md_pages_per_cluster_ratio
return client.call('bdev_lvol_create_lvstore', params) return client.call('bdev_lvol_create_lvstore', params)
@ -32,6 +36,23 @@ def bdev_lvol_rename_lvstore(client, old_name, new_name):
return client.call('bdev_lvol_rename_lvstore', params) return client.call('bdev_lvol_rename_lvstore', params)
def bdev_lvol_grow_lvstore(client, uuid=None, lvs_name=None):
"""Grow the logical volume store to fill the underlying bdev
Args:
uuid: UUID of logical volume store to resize (optional)
lvs_name: name of logical volume store to resize (optional)
"""
if (uuid and lvs_name):
raise ValueError("Exactly one of uuid or lvs_name may be specified")
params = {}
if uuid:
params['uuid'] = uuid
if lvs_name:
params['lvs_name'] = lvs_name
return client.call('bdev_lvol_grow_lvstore', params)
def bdev_lvol_create(client, lvol_name, size, thin_provision=False, uuid=None, lvs_name=None, clear_method=None): def bdev_lvol_create(client, lvol_name, size, thin_provision=False, uuid=None, lvs_name=None, clear_method=None):
"""Create a logical volume on a logical volume store. """Create a logical volume on a logical volume store.

View File

@ -1767,7 +1767,8 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
bdev_name=args.bdev_name, bdev_name=args.bdev_name,
lvs_name=args.lvs_name, lvs_name=args.lvs_name,
cluster_sz=args.cluster_sz, cluster_sz=args.cluster_sz,
clear_method=args.clear_method)) clear_method=args.clear_method,
num_md_pages_per_cluster_ratio=args.md_pages_per_cluster_ratio))
p = subparsers.add_parser('bdev_lvol_create_lvstore', help='Add logical volume store on base bdev') p = subparsers.add_parser('bdev_lvol_create_lvstore', help='Add logical volume store on base bdev')
p.add_argument('bdev_name', help='base bdev name') p.add_argument('bdev_name', help='base bdev name')
@ -1775,6 +1776,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.add_argument('-c', '--cluster-sz', help='size of cluster (in bytes)', type=int, required=False) p.add_argument('-c', '--cluster-sz', help='size of cluster (in bytes)', type=int, required=False)
p.add_argument('--clear-method', help="""Change clear method for data region. p.add_argument('--clear-method', help="""Change clear method for data region.
Available: none, unmap, write_zeroes""", required=False) Available: none, unmap, write_zeroes""", required=False)
p.add_argument('-m', '--md-pages-per-cluster-ratio', help='reserved metadata pages for each cluster', type=int, required=False)
p.set_defaults(func=bdev_lvol_create_lvstore) p.set_defaults(func=bdev_lvol_create_lvstore)
def bdev_lvol_rename_lvstore(args): def bdev_lvol_rename_lvstore(args):
@ -1787,6 +1789,17 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
p.add_argument('new_name', help='new name') p.add_argument('new_name', help='new name')
p.set_defaults(func=bdev_lvol_rename_lvstore) p.set_defaults(func=bdev_lvol_rename_lvstore)
def bdev_lvol_grow_lvstore(args):
print_dict(rpc.lvol.bdev_lvol_grow_lvstore(args.client,
uuid=args.uuid,
lvs_name=args.lvs_name))
p = subparsers.add_parser('bdev_lvol_grow_lvstore',
help='Grow the lvstore size to the underlying bdev size')
p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
p.set_defaults(func=bdev_lvol_grow_lvstore)
def bdev_lvol_create(args): def bdev_lvol_create(args):
print_json(rpc.lvol.bdev_lvol_create(args.client, print_json(rpc.lvol.bdev_lvol_create(args.client,
lvol_name=args.lvol_name, lvol_name=args.lvol_name,