diff --git a/src/googletest b/src/googletest --- a/src/googletest +++ b/src/googletest @@ -1 +1 @@ -Subproject commit 389cb68b87193358358ae87cc56d257fd0d80189 +Subproject commit 389cb68b87193358358ae87cc56d257fd0d80189-dirty diff --git a/src/os/bluestore/fastbmap_allocator_impl.h b/src/os/bluestore/fastbmap_allocator_impl.h index 550214b62a8..f4ab2e15f14 100644 --- a/src/os/bluestore/fastbmap_allocator_impl.h +++ b/src/os/bluestore/fastbmap_allocator_impl.h @@ -823,6 +823,9 @@ protected: std::lock_guard l(lock); auto allocated = l1._mark_alloc_l1(o, len); +std::cout << std::hex + << allocated << " " << available << " " << o << "~" << len + << std::dec << std::endl; ceph_assert(available >= allocated); available -= allocated; _mark_l2_on_l1(l2_pos, l2_pos_end); diff --git a/src/test/objectstore/Allocator_test.cc b/src/test/objectstore/Allocator_test.cc index 8204179b531..8cfe59563f5 100644 --- a/src/test/objectstore/Allocator_test.cc +++ b/src/test/objectstore/Allocator_test.cc @@ -654,6 +654,89 @@ TEST_P(AllocTest, test_init_rm_free_unbound) } } +TEST_P(AllocTest, test_alloc_bad_unit) +{ + uint64_t block = 0x10000; + uint64_t size = 0x100000000ul; + + init_alloc(size, block); + alloc->init_add_free(0, size); + EXPECT_EQ(alloc->get_free(), size); + + alloc->init_rm_free(0x1000, 0x1000); + std::cout << std::hex + << "remove 0x1000~1000, " + << "free = " << alloc->get_free() << std::dec << std::endl; + alloc->foreach([](uint64_t offset, uint64_t length) { + std::cout << std::hex << offset << "~" << length << std::dec << std::endl; + }); + std::cout << "-----------------" << std::endl; + +} + +TEST_P(AllocTest, test_alloc_bad_unit2) +{ + uint64_t block = 0x10000; + uint64_t size = 0x100000000ul; + + init_alloc(size, block); + alloc->init_add_free(0, size); + EXPECT_EQ(alloc->get_free(), size); + + PExtentVector extents; + auto need = 0x10000; + int64_t got; + got = alloc->allocate(need, 0x10000, 0, (int64_t)0, &extents); + EXPECT_EQ(got, 0x10000); + std::cout << std::hex + << "allocate 0x10000, " + << "free = " << alloc->get_free() << std::dec << std::endl; + std::for_each(extents.begin(), extents.end(), [](bluestore_pextent_t& pe) { + std::cout << std::hex << pe.offset << "~" << pe.length << std::dec << std::endl; + }); + std::cout << "-----" << std::endl; + alloc->foreach([](uint64_t offset, uint64_t length) { + std::cout << std::hex << offset << "~" << length << std::dec << std::endl; + }); + std::cout << "-----------------" << std::endl; + + extents.clear(); + need = 0x1000; + got = alloc->allocate(need, 0x1000, 0, (int64_t)0, &extents); + EXPECT_EQ(got, 0x1000); + std::cout << std::hex + << "allocate 0x1000, " + << "free = " << alloc->get_free() << std::dec << std::endl; + std::for_each(extents.begin(), extents.end(), [](bluestore_pextent_t& pe) { + std::cout << std::hex << pe.offset << "~" << pe.length << std::dec << std::endl; + }); + std::cout << "-----" << std::endl; + alloc->foreach([](uint64_t offset, uint64_t length) { + std::cout << std::hex << offset << "~" << length << std::dec << std::endl; + }); + std::cout << "-----------------" << std::endl; + + alloc->release(extents); + std::cout << std::hex + << "release 0x1000, " + << "free = " << alloc->get_free() << std::dec << std::endl; + alloc->foreach([](uint64_t offset, uint64_t length) { + std::cout << std::hex << offset << "~" << length << std::dec << std::endl; + }); + std::cout << "-----------------" << std::endl; + + alloc->init_add_free(0x0, 0x10000); + std::cout << std::hex + << "add free 0x0~10000, " + << "free = " << alloc->get_free() << std::dec << std::endl; + alloc->foreach([](uint64_t offset, uint64_t length) { + std::cout << std::hex << offset << "~" << length << std::dec << std::endl; + }); + std::cout << "-----------------" << std::endl; + ASSERT_EQ(alloc->get_free(), size); +} + + INSTANTIATE_TEST_SUITE_P( Allocator, AllocTest,