From 43863e88b4168602e0438735e46ee5ce0cb40284 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 9 Oct 2018 01:16:32 +0200 Subject: [PATCH] common: proliferate ptr_node in the bufferlist implementation. Signed-off-by: Radoslaw Zarzynski --- src/common/buffer.cc | 28 +++++++++++++++------------- src/include/buffer.h | 8 +++++++- src/librbd/internal.cc | 5 +++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 5c4a43b74adff..4634f14f7a502 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1325,15 +1325,13 @@ using namespace ceph; _buffers.clear_and_dispose(ptr_node::disposer()); return; } - ptr nb; if ((_len & ~CEPH_PAGE_MASK) == 0) - nb = buffer::create_page_aligned(_len); + rebuild(ptr_node::create(buffer::create_page_aligned(_len))); else - nb = buffer::create(_len); - rebuild(nb); + rebuild(ptr_node::create(buffer::create(_len))); } - void buffer::list::rebuild(ptr& nb) + void buffer::list::rebuild(ptr_node& nb) { unsigned pos = 0; for (auto& node : _buffers) { @@ -1342,8 +1340,11 @@ using namespace ceph; } _memcopy_count += pos; _buffers.clear_and_dispose(ptr_node::disposer()); - if (nb.length()) - _buffers.push_back(ptr_node::create(nb)); + if (likely(nb.length())) { + _buffers.push_back(nb); + } else { + ptr_node::disposer()(&nb); + } invalidate_crc(); last_p = begin(); } @@ -1397,8 +1398,9 @@ using namespace ceph; !p->is_n_align_sized(align_size) || (offset % align_size))); if (!(unaligned.is_contiguous() && unaligned._buffers.front().is_aligned(align_memory))) { - ptr nb(buffer::create_aligned(unaligned._len, align_memory)); - unaligned.rebuild(nb); + unaligned.rebuild( + ptr_node::create( + buffer::create_aligned(unaligned._len, align_memory))); _memcopy_count += unaligned._len; } _buffers.insert(p, ptr_node::create(unaligned._buffers.front())); @@ -1556,7 +1558,7 @@ using namespace ceph; } } // add new item to list - push_back(ptr(bp, off, len)); + push_back(ptr_node::create(bp, off, len)); } void buffer::list::append(const list& bl) @@ -1852,11 +1854,11 @@ int buffer::list::read_file(const char *fn, std::string *error) ssize_t buffer::list::read_fd(int fd, size_t len) { - bufferptr bp = buffer::create(len); + auto& bp = ptr_node::create(buffer::create(len)); ssize_t ret = safe_read(fd, (void*)bp.c_str(), len); if (ret >= 0) { bp.set_length(ret); - append(std::move(bp)); + push_back(bp); } return ret; } @@ -2165,7 +2167,7 @@ void buffer::list::hexdump(std::ostream &out, bool trailing_newline) const buffer::list buffer::list::static_from_mem(char* c, size_t l) { list bl; - bl.push_back(ptr(create_static(l, c))); + bl.push_back(ptr_node::create(create_static(l, c))); return bl; } diff --git a/src/include/buffer.h b/src/include/buffer.h index d89ce2a2a26ce..b592255667494 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -828,6 +828,12 @@ namespace buffer CEPH_BUFFER_API { _len += bp.length(); _buffers.push_back(ptr_node::create(std::move(bp))); } + void push_back(ptr_node& bp) { + if (bp.length() == 0) + return; + _len += bp.length(); + _buffers.push_back(bp); + } void push_back(raw *r) { _buffers.push_back(ptr_node::create(r)); _len += _buffers.back().length(); @@ -838,7 +844,7 @@ namespace buffer CEPH_BUFFER_API { bool is_contiguous() const; void rebuild(); - void rebuild(ptr& nb); + void rebuild(ptr_node& nb); bool rebuild_aligned(unsigned align); // max_buffers = 0 mean don't care _buffers.size(), other // must make _buffers.size() <= max_buffers after rebuilding. diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 52a3ae9cc1a1c..74898772a5256 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1427,7 +1427,7 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { }); auto gather_ctx = new C_Gather(m_dest->cct, end_op_ctx); - bufferptr m_ptr(m_bl->length()); + auto& m_ptr = buffer::ptr_node::create(m_bl->length()); m_bl->rebuild(m_ptr); size_t write_offset = 0; size_t write_length = 0; @@ -1440,7 +1440,8 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { &write_offset, &write_length, &offset)) { - bufferptr write_ptr(m_ptr, write_offset, write_length); + auto& write_ptr = \ + buffer::ptr_node::create(m_ptr, write_offset, write_length); bufferlist *write_bl = new bufferlist(); write_bl->push_back(write_ptr); Context *ctx = new C_CopyWrite(write_bl, gather_ctx->new_sub()); -- 2.39.5