From: Igor Fedotov Date: Thu, 29 Apr 2021 18:16:44 +0000 (+0300) Subject: os/bluestore: tolerate zero length for allocators' init_[add/rm]_free() X-Git-Tag: v17.1.0~1991^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6548e5d991810e89fc1ac14eb4fcf1a37a2b129f;p=ceph.git os/bluestore: tolerate zero length for allocators' init_[add/rm]_free() Signed-off-by: Igor Fedotov --- diff --git a/src/os/bluestore/AvlAllocator.cc b/src/os/bluestore/AvlAllocator.cc index 43e2387c5c19..9964d44a57b1 100644 --- a/src/os/bluestore/AvlAllocator.cc +++ b/src/os/bluestore/AvlAllocator.cc @@ -402,6 +402,8 @@ void AvlAllocator::dump(std::function no void AvlAllocator::init_add_free(uint64_t offset, uint64_t length) { + if (!length) + return; std::lock_guard l(lock); ceph_assert(offset + length <= uint64_t(device_size)); ldout(cct, 10) << __func__ << std::hex @@ -413,6 +415,8 @@ void AvlAllocator::init_add_free(uint64_t offset, uint64_t length) void AvlAllocator::init_rm_free(uint64_t offset, uint64_t length) { + if (!length) + return; std::lock_guard l(lock); ceph_assert(offset + length <= uint64_t(device_size)); ldout(cct, 10) << __func__ << std::hex diff --git a/src/os/bluestore/HybridAllocator.cc b/src/os/bluestore/HybridAllocator.cc index 6caf5c6dd892..3a2da67379b5 100644 --- a/src/os/bluestore/HybridAllocator.cc +++ b/src/os/bluestore/HybridAllocator.cc @@ -155,6 +155,8 @@ void HybridAllocator::dump(std::function void HybridAllocator::init_rm_free(uint64_t offset, uint64_t length) { + if (!length) + return; std::lock_guard l(lock); ldout(cct, 10) << __func__ << std::hex << " offset 0x" << offset diff --git a/src/os/bluestore/StupidAllocator.cc b/src/os/bluestore/StupidAllocator.cc index 51d444170c4c..572fb792fb8d 100644 --- a/src/os/bluestore/StupidAllocator.cc +++ b/src/os/bluestore/StupidAllocator.cc @@ -311,6 +311,8 @@ void StupidAllocator::dump(std::function void StupidAllocator::init_add_free(uint64_t offset, uint64_t length) { + if (!length) + return; std::lock_guard l(lock); ldout(cct, 10) << __func__ << " 0x" << std::hex << offset << "~" << length << std::dec << dendl; @@ -320,6 +322,8 @@ void StupidAllocator::init_add_free(uint64_t offset, uint64_t length) void StupidAllocator::init_rm_free(uint64_t offset, uint64_t length) { + if (!length) + return; std::lock_guard l(lock); ldout(cct, 10) << __func__ << " 0x" << std::hex << offset << "~" << length << std::dec << dendl; diff --git a/src/test/objectstore/Allocator_test.cc b/src/test/objectstore/Allocator_test.cc index 43f2fbf51eca..3e5a2209a63c 100644 --- a/src/test/objectstore/Allocator_test.cc +++ b/src/test/objectstore/Allocator_test.cc @@ -47,6 +47,23 @@ TEST_P(AllocTest, test_alloc_init) ASSERT_EQ(alloc->get_free(), (uint64_t) 0); } +TEST_P(AllocTest, test_init_add_free) +{ + int64_t block_size = 1024; + int64_t capacity = 4 * 1024 * block_size; + + { + init_alloc(capacity, block_size); + + auto free = alloc->get_free(); + alloc->init_add_free(block_size, 0); + ASSERT_EQ(free, alloc->get_free()); + + alloc->init_rm_free(block_size, 0); + ASSERT_EQ(free, alloc->get_free()); + } +} + TEST_P(AllocTest, test_alloc_min_alloc) { int64_t block_size = 1024;