From 3c31f6dc038c58ebc7e1ba4fbc0813bbde7056c9 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Wed, 2 Sep 2020 19:08:06 +0000 Subject: [PATCH] blob_ut: add create_loop This test repeatedly creates and deletes blobs to confirm that the used_md_pages and used_clusters bit arrays are managed properly. This test exposed the bug reported in #1590 which has now been fixed. Signed-off-by: Jim Harris Change-ID: If5d7b7f03cc2fb9daac928573c73430b74ea9a51 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4038 Reviewed-by: Tomasz Zawadzki Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- test/unit/lib/blob/blob.c/blob_ut.c | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/unit/lib/blob/blob.c/blob_ut.c b/test/unit/lib/blob/blob.c/blob_ut.c index d20eb70d7..5dc76e7b4 100644 --- a/test/unit/lib/blob/blob.c/blob_ut.c +++ b/test/unit/lib/blob/blob.c/blob_ut.c @@ -443,6 +443,36 @@ blob_create(void) CU_ASSERT(g_bserrno == -ENOSPC); } +/* + * Create and delete one blob in a loop over and over again. This helps ensure + * that the internal bit masks tracking used clusters and md_pages are being + * tracked correctly. + */ +static void +blob_create_loop(void) +{ + struct spdk_blob_store *bs = g_bs; + struct spdk_blob_opts opts; + uint32_t i, loop_count; + + loop_count = 4 * spdk_max(spdk_bit_array_capacity(bs->used_md_pages), + spdk_bit_array_capacity(bs->used_clusters)); + + for (i = 0; i < loop_count; i++) { + ut_spdk_blob_opts_init(&opts); + opts.num_clusters = 1; + g_bserrno = -1; + g_blobid = SPDK_BLOBID_INVALID; + spdk_bs_create_blob_ext(bs, &opts, blob_op_with_id_complete, NULL); + poll_threads(); + CU_ASSERT(g_bserrno == 0); + CU_ASSERT(g_blobid != SPDK_BLOBID_INVALID); + spdk_bs_delete_blob(bs, g_blobid, blob_op_complete, NULL); + poll_threads(); + CU_ASSERT(g_bserrno == 0); + } +} + static void blob_create_fail(void) { @@ -6648,6 +6678,7 @@ int main(int argc, char **argv) CU_ADD_TEST(suite, blob_init); CU_ADD_TEST(suite_bs, blob_open); CU_ADD_TEST(suite_bs, blob_create); + CU_ADD_TEST(suite_bs, blob_create_loop); CU_ADD_TEST(suite_bs, blob_create_fail); CU_ADD_TEST(suite_bs, blob_create_internal); CU_ADD_TEST(suite, blob_thin_provision);