]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: size append_buffer so that it fits into page-multiple allocations
authorSage Weil <sage@redhat.com>
Wed, 10 Feb 2016 23:01:00 +0000 (18:01 -0500)
committerSage Weil <sage@redhat.com>
Tue, 1 Mar 2016 14:09:22 +0000 (09:09 -0500)
We drop some unittest assertions about alloc buffer size.  Sorry!

Signed-off-by: Sage Weil <sage@redhat.com>
src/common/buffer.cc
src/include/buffer.h
src/test/bufferlist.cc

index 188ef72af24ef21f130552bdb2022c12c15bed90..cea59d018a2306d3c5dc18ea6400c1170d5da73c 100644 (file)
@@ -39,6 +39,9 @@
 #include <ostream>
 namespace ceph {
 
+#define CEPH_BUFFER_ALLOC_UNIT  (MIN(CEPH_PAGE_SIZE, 4096))
+#define CEPH_BUFFER_APPEND_SIZE (CEPH_BUFFER_ALLOC_UNIT - sizeof(raw_combined))
+
 #ifdef BUFFER_DEBUG
 static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER;
 # define bdout { simple_spin_lock(&buffer_debug_lock); std::cout
@@ -1657,7 +1660,7 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER;
     unsigned gap = append_buffer.unused_tail_length();
     if (!gap) {
       // make a new append_buffer!
-      append_buffer = create_aligned(CEPH_BUFFER_APPEND_SIZE, CEPH_BUFFER_APPEND_SIZE);
+      append_buffer = create_combined(CEPH_BUFFER_APPEND_SIZE);
       append_buffer.set_length(0);   // unused, so far.
     }
     append(append_buffer, append_buffer.append(c) - 1, 1);     // add segment to the list
@@ -1679,9 +1682,12 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER;
       if (len == 0)
         break;  // done!
       
-      // make a new append_buffer!
-      unsigned alen = CEPH_BUFFER_APPEND_SIZE * (((len-1) / CEPH_BUFFER_APPEND_SIZE) + 1);
-      append_buffer = create_aligned(alen, CEPH_BUFFER_APPEND_SIZE);
+      // make a new append_buffer.  fill out a complete page, factoring in the
+      // raw_combined overhead.
+      size_t need = ROUND_UP_TO(len, sizeof(size_t)) + sizeof(raw_combined);
+      size_t alen = ROUND_UP_TO(need, CEPH_BUFFER_ALLOC_UNIT) -
+       sizeof(raw_combined);
+      append_buffer = create_combined(alen);
       append_buffer.set_length(0);   // unused, so far.
     }
   }
index 81ce336c05a19681b73b5d635bfc3695b4fe4edd..056d69eb69f42e33487b16b8271c01af2f225651 100644 (file)
@@ -70,8 +70,6 @@ class XioDispatchHook;
 
 namespace ceph {
 
-const static int CEPH_BUFFER_APPEND_SIZE(4096);
-
 namespace buffer CEPH_BUFFER_API {
   /*
    * exceptions
index 99ad5578a101b0fe131d04a57a5163a70a34b750..a6120fd0614141e7583f1f71cf3c1b5456fa72b6 100644 (file)
@@ -1734,7 +1734,7 @@ TEST(BufferList, rebuild) {
     bl.append(str.c_str(), str.size());
     bl.append(str.c_str(), str.size());
     EXPECT_EQ((unsigned)2, bl.get_num_buffers());
-    EXPECT_TRUE(bl.is_aligned(CEPH_BUFFER_APPEND_SIZE));
+    //EXPECT_TRUE(bl.is_aligned(CEPH_BUFFER_APPEND_SIZE));
     bl.rebuild();
     EXPECT_TRUE(bl.is_page_aligned());
     EXPECT_EQ((unsigned)1, bl.get_num_buffers());
@@ -1981,7 +1981,7 @@ TEST(BufferList, append) {
     EXPECT_EQ((unsigned)0, bl.get_num_buffers());
     bl.append('A');
     EXPECT_EQ((unsigned)1, bl.get_num_buffers());
-    EXPECT_TRUE(bl.is_aligned(CEPH_BUFFER_APPEND_SIZE));
+    //EXPECT_TRUE(bl.is_aligned(CEPH_BUFFER_APPEND_SIZE));
   }
   //
   // void append(const char *data, unsigned len);
@@ -2269,7 +2269,7 @@ TEST(BufferList, read_fd) {
   EXPECT_EQ(-EBADF, bl.read_fd(fd, len));
   fd = ::open(FILENAME, O_RDONLY);
   EXPECT_EQ(len, (unsigned)bl.read_fd(fd, len));
-  EXPECT_EQ(CEPH_BUFFER_APPEND_SIZE - len, bl.front().unused_tail_length());
+  //EXPECT_EQ(CEPH_BUFFER_APPEND_SIZE - len, bl.front().unused_tail_length());
   EXPECT_EQ(len, bl.length());
   ::close(fd);
   ::unlink(FILENAME);