Commit 4c59c6ac authored by yupeng's avatar yupeng Committed by Ben Walker
Browse files

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: default avatarPeng Yu <yupeng0921@gmail.com>
Change-Id: I43a129efbc1a08f9d0df027e80f63ab1393163a2
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9734


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 1f0b8df7
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -7863,11 +7863,26 @@ Construct a logical volume store.
#### Parameters

Name                          | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
----------------------------- | -------- | ----------- | -----------
bdev_name                     | Required | string      | Bdev on which to construct logical volume store
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
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

+22 −1
Original line number Diff line number Diff line
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.

    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
        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)
        num_md_pages_per_cluster_ratio: metadata pages per cluster (optional)

    Returns:
        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
    if 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)


@@ -32,6 +36,23 @@ def bdev_lvol_rename_lvstore(client, old_name, new_name):
    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):
    """Create a logical volume on a logical volume store.

+14 −1
Original line number Diff line number Diff line
@@ -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,
                                                     lvs_name=args.lvs_name,
                                                     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.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('--clear-method', help="""Change clear method for data region.
        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)

    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.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):
        print_json(rpc.lvol.bdev_lvol_create(args.client,
                                             lvol_name=args.lvol_name,