diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 4aa1305ec..44f254d78 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -7862,12 +7862,27 @@ 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 -clear_method | Optional | string | Change clear method for data region. Available: none, unmap (default), write_zeroes +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 (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 diff --git a/python/spdk/rpc/lvol.py b/python/spdk/rpc/lvol.py index f7c89e3fd..8da2505f6 100644 --- a/python/spdk/rpc/lvol.py +++ b/python/spdk/rpc/lvol.py @@ -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. 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. diff --git a/scripts/rpc.py b/scripts/rpc.py index 287892561..1cd94e711 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -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,