From: Sage Weil Date: Wed, 10 Feb 2016 23:01:00 +0000 (-0500) Subject: buffer: size append_buffer so that it fits into page-multiple allocations X-Git-Tag: v10.1.0~245^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b6ed4d3ebf9d3938bc1aba7a2a7878dfbcf01537;p=ceph.git buffer: size append_buffer so that it fits into page-multiple allocations We drop some unittest assertions about alloc buffer size. Sorry! Signed-off-by: Sage Weil --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 188ef72af24e..cea59d018a23 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -39,6 +39,9 @@ #include 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. } } diff --git a/src/include/buffer.h b/src/include/buffer.h index 81ce336c05a1..056d69eb69f4 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -70,8 +70,6 @@ class XioDispatchHook; namespace ceph { -const static int CEPH_BUFFER_APPEND_SIZE(4096); - namespace buffer CEPH_BUFFER_API { /* * exceptions diff --git a/src/test/bufferlist.cc b/src/test/bufferlist.cc index 99ad5578a101..a6120fd06141 100644 --- a/src/test/bufferlist.cc +++ b/src/test/bufferlist.cc @@ -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);