From b3a6d18ea64e0f70e0d3371cbfcd21280677000e Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Tue, 16 Jun 2020 09:36:55 +0200 Subject: [PATCH] common/mempool: copies bufferlist assignment to mempool through rebuild Fixes: https://tracker.ceph.com/issues/46027 Signed-off-by: Adam Kupczyk --- src/common/buffer.cc | 2 ++ src/test/test_mempool.cc | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 15ecd9626e0b4..886dd22224cd9 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1175,6 +1175,8 @@ static ceph::spinlock debug_lock; std::unique_ptr nb) { unsigned pos = 0; + int mempool = _buffers.front().get_mempool(); + nb->reassign_to_mempool(mempool); for (auto& node : _buffers) { nb->copy_in(pos, node.length(), node.c_str(), false); pos += node.length(); diff --git a/src/test/test_mempool.cc b/src/test/test_mempool.cc index ed2431368f1c3..f4c2abb7d3b0b 100644 --- a/src/test/test_mempool.cc +++ b/src/test/test_mempool.cc @@ -366,6 +366,21 @@ TEST(mempool, bufferlist_reassign) ASSERT_EQ(bytes_before, mempool::osd::allocated_bytes()); } +TEST(mempool, bufferlist_c_str) +{ + bufferlist bl; + int len = 1048576; + size_t before = mempool::osd::allocated_bytes(); + bl.append(buffer::create_aligned(len, 4096)); + bl.append(buffer::create_aligned(len, 4096)); + bl.reassign_to_mempool(mempool::mempool_osd); + size_t after = mempool::osd::allocated_bytes(); + ASSERT_GE(after, before + len * 2); + bl.c_str(); + size_t after_c_str = mempool::osd::allocated_bytes(); + ASSERT_EQ(after, after_c_str); +} + TEST(mempool, btree_map_test) { typedef mempool::pool_allocator