test/lvol: Implement test case 653

Test resize feature for thin provisioned lvol bdev.
Check if free size of lvol stores equals
to expected values.

Change-Id: Ib0822f1a9c48a6beae816b487cd7889ebfabd2e8
Signed-off-by: Pawel Kaminski <pawelx.kaminski@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/446254
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Pawel Kaminski 2019-02-26 06:41:34 -05:00 committed by Jim Harris
parent 6d24eeb21d
commit 32c888e575
2 changed files with 60 additions and 19 deletions

View File

@ -206,7 +206,7 @@ if [ $SPDK_RUN_FUNCTIONAL_TEST -eq 1 ]; then
timing_enter lvol
test_cases="1,50,51,52,53,100,101,102,150,200,201,250,251,252,253,254,255,"
test_cases+="300,301,450,451,452,500,550,551,552,553,"
test_cases+="600,601,602,650,651,652,654,655,"
test_cases+="600,601,602,650,651,652,653,654,655,"
test_cases+="700,701,702,750,751,752,753,754,755,756,757,758,759,760,"
test_cases+="800,801,802,803,804,10000"
run_test suite ./test/lvol/lvol.sh --test-cases=$test_cases

View File

@ -1650,27 +1650,68 @@ class TestCases(object):
"""
thin_provisioning_resize
Check thin provisioned bdev resize. To be implemented.
Check thin provisioned bdev resize.
"""
# TODO
# create malloc bdev
# construct lvol store on malloc bdev
# construct thin provisioned lvol bdevs on created lvol store
# Create malloc bdev
base_name = self.c.construct_malloc_bdev(self.total_size,
self.block_size)
# Construct lvol store on malloc bdev
uuid_store = self.c.construct_lvol_store(base_name, self.lvs_name)
fail_count = self.c.check_get_lvol_stores(base_name, uuid_store,
self.cluster_size)
# Construct thin provisioned lvol bdevs on created lvol store
# with size equal to 50% of lvol store
# fill all free space of lvol bdev with data
# save number of free clusters for lvs
# resize bdev to full size of lvs
# check if bdev size changed (total_data_clusters*cluster_size
# equal to num_blocks*block_size)
# check if free_clusters on lvs remain unaffected
# perform write operation with verification
size = self.get_lvs_divided_size(2)
uuid_bdev = self.c.construct_lvol_bdev(uuid_store,
self.lbd_name, size, thin=True)
fail_count += self.c.check_get_bdevs_methods(uuid_bdev, size)
# Fill all free space of lvol bdev with data
nbd_name = "/dev/nbd0"
fail_count += self.c.start_nbd_disk(uuid_bdev, nbd_name)
fail_count += self.run_fio_test(nbd_name, 0, size*MEGABYTE, "write", "0xcc", 0)
fail_count += self.c.stop_nbd_disk(nbd_name)
# Save number of free clusters for lvs
lvs = self.c.get_lvol_stores()[0]
free_clusters_start = int(lvs['free_clusters'])
# Resize bdev to full size of lvs
full_size = int(lvs['total_data_clusters'] * lvs['cluster_size'] / MEGABYTE)
fail_count += self.c.resize_lvol_bdev(uuid_bdev, full_size)
# Check if bdev size changed (total_data_clusters*cluster_size
# equals to num_blocks*block_size)
lvol_bdev = self.c.get_lvol_bdev_with_name(uuid_bdev)
lbd_size = int(lvol_bdev['num_blocks'] * lvol_bdev['block_size'] / MEGABYTE)
if full_size != lbd_size:
fail_count += 1
# Check if free_clusters on lvs remain unaffected
lvs = self.c.get_lvol_stores()[0]
free_clusters_resize = int(lvs['free_clusters'])
if free_clusters_start != free_clusters_resize:
fail_count += 1
# Perform write operation with verification
# to newly created free space of lvol bdev
# resize bdev to 30M and check if it ended with success
# check if free clusters on lvs equals to saved counter
# destroy thin provisioned lvol bdev
# destroy lvol store
# destroy malloc bdev
fail_count = 0
nbd_name = "/dev/nbd0"
fail_count += self.c.start_nbd_disk(uuid_bdev, nbd_name)
fail_count += self.run_fio_test(nbd_name, int(lbd_size * MEGABYTE / 2),
int(lbd_size * MEGABYTE / 2), "write", "0xcc", 0)
fail_count += self.c.stop_nbd_disk(nbd_name)
# Check if free clusters on lvs equals to zero
lvs = self.c.get_lvol_stores()[0]
if int(lvs['free_clusters']) != 0:
fail_count += 1
# Resize bdev to 25% of lvs and check if it ended with success
size = self.get_lvs_divided_size(4)
fail_count += self.c.resize_lvol_bdev(uuid_bdev, size)
# Check free clusters on lvs
lvs = self.c.get_lvol_stores()[0]
free_clusters_resize2 = int(lvs['free_clusters'])
free_clusters_expected = int((full_size - size) * MEGABYTE / lvs['cluster_size'])
if free_clusters_expected != free_clusters_resize2:
fail_count += 1
self.c.destroy_lvol_bdev(uuid_bdev)
self.c.destroy_lvol_store(uuid_store)
self.c.delete_malloc_bdev(base_name)
# Expected result:
# - calls successful, return code = 0
# - no other operation fails