From 52a857f5786e96270d75ab6ac7004a26e7daaa18 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 31 May 2017 22:19:51 -0400 Subject: [PATCH] buffer: fix some append_buffer vs mempool assignment; add tests Signed-off-by: Sage Weil --- src/common/buffer.cc | 8 ++++++- src/test/test_mempool.cc | 49 +++++++++++++++++++++++++++++++++------- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 5ff28c41c6ade..afd4536869da2 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1768,7 +1768,7 @@ static std::atomic_flag buffer_debug_lock = ATOMIC_FLAG_INIT; { if (append_buffer.unused_tail_length() < prealloc) { append_buffer = buffer::create(prealloc); - if (_mempool) { + if (_mempool >= 0) { append_buffer.get_raw()->reassign_to_mempool(_mempool); } append_buffer.set_length(0); // unused, so far. @@ -1860,6 +1860,9 @@ static std::atomic_flag buffer_debug_lock = ATOMIC_FLAG_INIT; // make a new append_buffer! append_buffer = raw_combined::create(CEPH_BUFFER_APPEND_SIZE); append_buffer.set_length(0); // unused, so far. + if (_mempool >= 0) { + append_buffer.get_raw()->reassign_to_mempool(_mempool); + } } append(append_buffer, append_buffer.append(c) - 1, 1); // add segment to the list } @@ -1887,6 +1890,9 @@ static std::atomic_flag buffer_debug_lock = ATOMIC_FLAG_INIT; sizeof(raw_combined); append_buffer = raw_combined::create(alen); append_buffer.set_length(0); // unused, so far. + if (_mempool >= 0) { + append_buffer.get_raw()->reassign_to_mempool(_mempool); + } } } diff --git a/src/test/test_mempool.cc b/src/test/test_mempool.cc index 443d1b0ead572..a9c6fc88b75fe 100644 --- a/src/test/test_mempool.cc +++ b/src/test/test_mempool.cc @@ -265,6 +265,18 @@ TEST(mempool, unordered_map) h[2] = obj(1); } +TEST(mempool, string_test) +{ + mempool::osdmap::string s; + s.reserve(100); + EXPECT_GE(mempool::osdmap::allocated_items(), s.capacity() + 1u); // +1 for zero-byte termination : + for (size_t i = 0; i < 10; ++i) { + s += '1'; + s.append(s); + EXPECT_GE(mempool::osdmap::allocated_items(), s.capacity() + 1u); + } +} + TEST(mempool, bufferlist) { bufferlist bl; @@ -277,16 +289,37 @@ TEST(mempool, bufferlist) ASSERT_GE(after, before + len); } -TEST(mempool, string_test) +TEST(mempool, bufferlist_reassign) { - mempool::osdmap::string s; - s.reserve(100); - EXPECT_GE(mempool::osdmap::allocated_items(), s.capacity() + 1u); // +1 for zero-byte termination : - for (size_t i = 0; i < 10; ++i) { - s += '1'; - s.append(s); - EXPECT_GE(mempool::osdmap::allocated_items(), s.capacity() + 1u); + bufferlist bl; + size_t items_before = mempool::buffer_anon::allocated_items(); + size_t bytes_before = mempool::buffer_anon::allocated_bytes(); + bl.append("fooo"); + ASSERT_EQ(items_before + 1, mempool::buffer_anon::allocated_items()); + ASSERT_LT(bytes_before, mempool::buffer_anon::allocated_bytes()); + + // move existing bl + bl.reassign_to_mempool(mempool::mempool_osd); + ASSERT_EQ(items_before, mempool::buffer_anon::allocated_items()); + ASSERT_EQ(bytes_before, mempool::buffer_anon::allocated_bytes()); + + // additional appends should go to the same pool + items_before = mempool::osd::allocated_items(); + bytes_before = mempool::osd::allocated_bytes(); + cout << "anon b " << mempool::buffer_anon::allocated_bytes() << std::endl; + for (unsigned i = 0; i < 1000; ++i) { + bl.append("asdfddddddddddddddddddddddasfdasdfasdfasdfasdfasdf"); } + cout << "anon a " << mempool::buffer_anon::allocated_bytes() << std::endl; + ASSERT_LT(items_before, mempool::osd::allocated_items()); + ASSERT_LT(bytes_before, mempool::osd::allocated_bytes()); + + // try_.. won't + items_before = mempool::osd::allocated_items(); + bytes_before = mempool::osd::allocated_bytes(); + bl.try_assign_to_mempool(mempool::mempool_bloom_filter); + ASSERT_EQ(items_before, mempool::osd::allocated_items()); + ASSERT_EQ(bytes_before, mempool::osd::allocated_bytes()); } int main(int argc, char **argv) -- 2.39.5