]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: fix some append_buffer vs mempool assignment; add tests 15403/head
authorSage Weil <sage@redhat.com>
Thu, 1 Jun 2017 02:19:51 +0000 (22:19 -0400)
committerSage Weil <sage@redhat.com>
Thu, 1 Jun 2017 02:20:03 +0000 (22:20 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/buffer.cc
src/test/test_mempool.cc

index 5ff28c41c6adef537dd7d422dd200838d67b5e94..afd4536869da2a2a801976a73f5d7d7a85bb5a9e 100644 (file)
@@ -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);
+      }
     }
   }
 
index 443d1b0ead5725b66536b64e5028e98dc33c3ea1..a9c6fc88b75fe83f41b6d2abecc67d053b718108 100644 (file)
@@ -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)