From 18bce0a0759ca6e7d3274fbfbd4c1ae47dfd0016 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 15 Feb 2018 22:23:03 -0500 Subject: [PATCH] librbd: moved write same buffer assembler to common location Signed-off-by: Jason Dillaman --- src/librbd/CMakeLists.txt | 1 + src/librbd/io/ImageRequest.cc | 52 +++---------------------------- src/librbd/io/ImageRequest.h | 3 -- src/librbd/io/ObjectRequest.cc | 1 + src/librbd/io/ObjectRequest.h | 1 + src/librbd/io/Utils.cc | 57 ++++++++++++++++++++++++++++++++++ src/librbd/io/Utils.h | 26 ++++++++++++++++ 7 files changed, 90 insertions(+), 51 deletions(-) create mode 100644 src/librbd/io/Utils.cc create mode 100644 src/librbd/io/Utils.h diff --git a/src/librbd/CMakeLists.txt b/src/librbd/CMakeLists.txt index 141f53cd5e5b2..36bb315b7f487 100644 --- a/src/librbd/CMakeLists.txt +++ b/src/librbd/CMakeLists.txt @@ -62,6 +62,7 @@ set(librbd_internal_srcs io/ImageRequestWQ.cc io/ObjectRequest.cc io/ReadResult.cc + io/Utils.cc journal/CreateRequest.cc journal/DemoteRequest.cc journal/OpenRequest.cc diff --git a/src/librbd/io/ImageRequest.cc b/src/librbd/io/ImageRequest.cc index 85872004bb983..ac479b74f9e7a 100644 --- a/src/librbd/io/ImageRequest.cc +++ b/src/librbd/io/ImageRequest.cc @@ -10,6 +10,7 @@ #include "librbd/cache/ImageCache.h" #include "librbd/io/AioCompletion.h" #include "librbd/io/ObjectRequest.h" +#include "librbd/io/Utils.h" #include "librbd/journal/Types.h" #include "include/rados/librados.hpp" #include "common/WorkQueue.h" @@ -23,7 +24,7 @@ namespace librbd { namespace io { -using util::get_image_ctx; +using librbd::util::get_image_ctx; namespace { @@ -654,51 +655,6 @@ void ImageFlushRequest::send_image_cache_request() { image_ctx.image_cache->aio_flush(req_comp); } -template -bool ImageWriteSameRequest::assemble_writesame_extent(const ObjectExtent &object_extent, - bufferlist *bl, bool force_write) { - size_t m_data_len = m_data_bl.length(); - - if (!force_write) { - bool may_writesame = true; - - for (auto q = object_extent.buffer_extents.begin(); - q != object_extent.buffer_extents.end(); ++q) { - if (!(q->first % m_data_len == 0 && q->second % m_data_len == 0)) { - may_writesame = false; - break; - } - } - - if (may_writesame) { - bl->append(m_data_bl); - return true; - } - } - - for (auto q = object_extent.buffer_extents.begin(); - q != object_extent.buffer_extents.end(); ++q) { - bufferlist sub_bl; - uint64_t sub_off = q->first % m_data_len; - uint64_t sub_len = m_data_len - sub_off; - uint64_t extent_left = q->second; - while (extent_left >= sub_len) { - sub_bl.substr_of(m_data_bl, sub_off, sub_len); - bl->claim_append(sub_bl); - extent_left -= sub_len; - if (sub_off) { - sub_off = 0; - sub_len = m_data_len; - } - } - if (extent_left) { - sub_bl.substr_of(m_data_bl, sub_off, extent_left); - bl->claim_append(sub_bl); - } - } - return false; -} - template uint64_t ImageWriteSameRequest::append_journal_event( const ObjectRequests &requests, bool synchronous) { @@ -745,7 +701,7 @@ void ImageWriteSameRequest::send_object_cache_requests( const ObjectExtent &object_extent = *p; bufferlist bl; - assemble_writesame_extent(object_extent, &bl, true); + util::assemble_write_same_extent(object_extent, m_data_bl, &bl, true); AioCompletion *aio_comp = this->m_aio_comp; C_AioRequest *req_comp = new C_AioRequest(aio_comp); @@ -779,7 +735,7 @@ ObjectRequestHandle *ImageWriteSameRequest::create_object_request( bufferlist bl; ObjectRequest *req; - if (assemble_writesame_extent(object_extent, &bl, false)) { + if (util::assemble_write_same_extent(object_extent, m_data_bl, &bl, false)) { req = ObjectRequest::create_writesame( &image_ctx, object_extent.oid.name, object_extent.objectno, object_extent.offset, object_extent.length, diff --git a/src/librbd/io/ImageRequest.h b/src/librbd/io/ImageRequest.h index ec91582cebb31..0a09b8b5fd91b 100644 --- a/src/librbd/io/ImageRequest.h +++ b/src/librbd/io/ImageRequest.h @@ -306,9 +306,6 @@ protected: return "aio_writesame"; } - bool assemble_writesame_extent(const ObjectExtent &object_extent, - bufferlist *bl, bool force_write); - void send_image_cache_request() override; void send_object_cache_requests(const ObjectExtents &object_extents, diff --git a/src/librbd/io/ObjectRequest.cc b/src/librbd/io/ObjectRequest.cc index eec6eb06cb201..e545a45c3632a 100644 --- a/src/librbd/io/ObjectRequest.cc +++ b/src/librbd/io/ObjectRequest.cc @@ -10,6 +10,7 @@ #include "common/WorkQueue.h" #include "include/Context.h" #include "include/err.h" +#include "osd/osd_types.h" #include "librbd/ExclusiveLock.h" #include "librbd/ImageCtx.h" diff --git a/src/librbd/io/ObjectRequest.h b/src/librbd/io/ObjectRequest.h index be319cb802af3..f51263326937d 100644 --- a/src/librbd/io/ObjectRequest.h +++ b/src/librbd/io/ObjectRequest.h @@ -14,6 +14,7 @@ #include class Context; +class ObjectExtent; namespace librbd { diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc new file mode 100644 index 0000000000000..1b50561a795d0 --- /dev/null +++ b/src/librbd/io/Utils.cc @@ -0,0 +1,57 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "librbd/io/Utils.h" +#include "include/buffer.h" +#include "osd/osd_types.h" + +namespace librbd { +namespace io { +namespace util { + +bool assemble_write_same_extent( + const ObjectExtent &object_extent, const ceph::bufferlist& data, + ceph::bufferlist *ws_data, bool force_write) { + size_t data_len = data.length(); + + if (!force_write) { + bool may_writesame = true; + for (auto& q : object_extent.buffer_extents) { + if (!(q.first % data_len == 0 && q.second % data_len == 0)) { + may_writesame = false; + break; + } + } + + if (may_writesame) { + ws_data->append(data); + return true; + } + } + + for (auto& q : object_extent.buffer_extents) { + bufferlist sub_bl; + uint64_t sub_off = q.first % data_len; + uint64_t sub_len = data_len - sub_off; + uint64_t extent_left = q.second; + while (extent_left >= sub_len) { + sub_bl.substr_of(data, sub_off, sub_len); + ws_data->claim_append(sub_bl); + extent_left -= sub_len; + if (sub_off) { + sub_off = 0; + sub_len = data_len; + } + } + if (extent_left) { + sub_bl.substr_of(data, sub_off, extent_left); + ws_data->claim_append(sub_bl); + } + } + return false; +} + +} // namespace util +} // namespace io +} // namespace librbd + diff --git a/src/librbd/io/Utils.h b/src/librbd/io/Utils.h new file mode 100644 index 0000000000000..c1f373d40bc69 --- /dev/null +++ b/src/librbd/io/Utils.h @@ -0,0 +1,26 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_LIBRBD_IO_UTILS_H +#define CEPH_LIBRBD_IO_UTILS_H + +#include "include/int_types.h" +#include "include/buffer_fwd.h" +#include + +class ObjectExtent; + +namespace librbd { +namespace io { +namespace util { + +bool assemble_write_same_extent(const ObjectExtent &object_extent, + const ceph::bufferlist& data, + ceph::bufferlist *ws_data, + bool force_write); + +} // namespace util +} // namespace io +} // namespace librbd + +#endif // CEPH_LIBRBD_IO_UTILS_H -- 2.39.5