]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: bl::appends don't use the append_buffer anymore.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 17 Sep 2018 23:15:24 +0000 (01:15 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 1 Feb 2019 21:54:50 +0000 (22:54 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/common/buffer.cc
src/include/buffer.h

index 41c267015b7524bd01a622ab4d52654a3a4a4cb9..078d41321688ce3d1fb4b42bde89e912295c8060 100644 (file)
@@ -1321,9 +1321,10 @@ static ceph::spinlock debug_lock;
 
   void buffer::list::reserve(size_t prealloc)
   {
-    if (append_buffer.unused_tail_length() < prealloc) {
-      append_buffer = buffer::create_page_aligned(prealloc);
-      append_buffer.set_length(0);   // unused, so far.
+    if (get_append_buffer_unused_tail_length() < prealloc) {
+      auto ptr = ptr_node::create(buffer::create_page_aligned(prealloc));
+      ptr->set_length(0);   // unused, so far.
+      _buffers.push_back(*ptr.release());
     }
   }
 
@@ -1400,39 +1401,50 @@ static ceph::spinlock debug_lock;
   void buffer::list::append(char c)
   {
     // put what we can into the existing append_buffer.
-    unsigned gap = append_buffer.unused_tail_length();
+    unsigned gap = get_append_buffer_unused_tail_length();
     if (!gap) {
-      // make a new append_buffer!
-      append_buffer = raw_combined::create(CEPH_BUFFER_APPEND_SIZE, 0,
-                                          get_mempool());
-      append_buffer.set_length(0);   // unused, so far.
+      // make a new buffer!
+      auto buf = ptr_node::create(
+       raw_combined::create(CEPH_BUFFER_APPEND_SIZE, 0, get_mempool()));
+      buf->set_length(0);   // unused, so far.
+      _buffers.push_back(*buf.release());
     }
-    append(append_buffer, append_buffer.append(c) - 1, 1);     // add segment to the list
+    _buffers.back().append(c);
+    _len++;
   }
 
   void buffer::list::append(const char *data, unsigned len)
   {
+    // hmm, maybe let's provide ::appends with guarantee the container is
+    // never empty?
+    if (_buffers.empty()) {
+      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);
+      _buffers.emplace_back(raw_combined::create(alen, 0, get_mempool()));
+      _buffers.back().set_length(0);   // unused, so far.
+    }
+
     while (len > 0) {
-      // put what we can into the existing append_buffer.
-      unsigned gap = append_buffer.unused_tail_length();
-      if (gap > 0) {
-        if (gap > len) gap = len;
-    //cout << "append first char is " << data[0] << ", last char is " << data[len-1] << std::endl;
-        append_buffer.append(data, gap);
-        append(append_buffer, append_buffer.length() - gap, gap);      // add segment to the list
-        len -= gap;
-        data += gap;
+      ptr& last_one = _buffers.back();
+      unsigned gap = \
+       std::min(last_one.raw_nref() == 1 ? last_one.unused_tail_length() : 0, len);
+      last_one.append(data, gap);
+      _len += gap;
+      len -= gap;
+      data += gap;
+
+      if (len == 0) {
+       break;
       }
-      if (len == 0)
-        break;  // done!
-      
-      // make a new append_buffer.  fill out a complete page, factoring in the
+
+      // make a new 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 = raw_combined::create(alen, 0, get_mempool());
-      append_buffer.set_length(0);   // unused, so far.
+      _buffers.emplace_back(raw_combined::create(alen, 0, get_mempool()));
+      _buffers.back().set_length(0);   // unused, so far.
     }
   }
 
@@ -1511,16 +1523,19 @@ static ceph::spinlock debug_lock;
   
   void buffer::list::append_zero(unsigned len)
   {
-    unsigned need = std::min(append_buffer.unused_tail_length(), len);
-    if (need) {
-      append_buffer.append_zeros(need);
-      append(append_buffer, append_buffer.length() - need, need);
-      len -= need;
+    _len += len;
+
+    const unsigned free_in_last = get_append_buffer_unused_tail_length();
+    const unsigned first_round = std::min(len, free_in_last);
+    if (first_round) {
+      _buffers.back().append_zeros(first_round);
     }
-    if (len) {
-      auto bp = ptr_node::create(buffer::create_page_aligned(len));
-      bp->zero(false);
-      push_back(std::move(bp));
+
+    const unsigned second_round = len - first_round;
+    if (second_round) {
+      auto& new_back = refill_append_space(second_round);
+      new_back.set_length(second_round);
+      new_back.zero(false);
     }
   }
 
index e2f86db8e5b3c43fe9f30015f83fab413a7b6d52..62e9d917755e1624fa5bc469def94f96cc26b263 100644 (file)
@@ -1005,7 +1005,16 @@ namespace buffer CEPH_BUFFER_API {
     void try_assign_to_mempool(int pool);
 
     size_t get_append_buffer_unused_tail_length() const {
-      return append_buffer.unused_tail_length();
+      if (_buffers.empty()) {
+       return 0;
+      }
+
+      auto& buf = _buffers.back();
+      if (buf.raw_nref() != 1) {
+       return 0;
+      }
+
+      return buf.unused_tail_length();
     }
 
     unsigned get_memcopy_count() const {return _memcopy_count; }