]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: moved write same buffer assembler to common location 20560/head
authorJason Dillaman <dillaman@redhat.com>
Fri, 16 Feb 2018 03:23:03 +0000 (22:23 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 26 Feb 2018 17:31:59 +0000 (12:31 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/CMakeLists.txt
src/librbd/io/ImageRequest.cc
src/librbd/io/ImageRequest.h
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h
src/librbd/io/Utils.cc [new file with mode: 0644]
src/librbd/io/Utils.h [new file with mode: 0644]

index 141f53cd5e5b255aca093e30eb280a34e76e28b4..36bb315b7f487ba0d473b29d19a15c5365834e34 100644 (file)
@@ -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
index 85872004bb983eab93e82464bcfe9d92ba928440..ac479b74f9e7a24aac0500d9272f8e98c527a3bb 100644 (file)
@@ -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<I>::send_image_cache_request() {
   image_ctx.image_cache->aio_flush(req_comp);
 }
 
-template <typename I>
-bool ImageWriteSameRequest<I>::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 <typename I>
 uint64_t ImageWriteSameRequest<I>::append_journal_event(
     const ObjectRequests &requests, bool synchronous) {
@@ -745,7 +701,7 @@ void ImageWriteSameRequest<I>::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<I>::create_object_request(
   bufferlist bl;
   ObjectRequest<I> *req;
 
-  if (assemble_writesame_extent(object_extent, &bl, false)) {
+  if (util::assemble_write_same_extent(object_extent, m_data_bl, &bl, false)) {
     req = ObjectRequest<I>::create_writesame(
       &image_ctx, object_extent.oid.name, object_extent.objectno,
       object_extent.offset, object_extent.length,
index ec91582cebb31ae7b503ab82fee033622d50ec80..0a09b8b5fd91bf1a9f8352587ae9dca48e5ee194 100644 (file)
@@ -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,
index eec6eb06cb201a41e1c74ff0bda8e827246df9d3..e545a45c3632aa901ba1e46689ae6851d270396d 100644 (file)
@@ -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"
index be319cb802af393d3749d4fe5e33666b70557a72..f51263326937d5283e376170ddb1ebccd57e05b2 100644 (file)
@@ -14,6 +14,7 @@
 #include <map>
 
 class Context;
+class ObjectExtent;
 
 namespace librbd {
 
diff --git a/src/librbd/io/Utils.cc b/src/librbd/io/Utils.cc
new file mode 100644 (file)
index 0000000..1b50561
--- /dev/null
@@ -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 (file)
index 0000000..c1f373d
--- /dev/null
@@ -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 <map>
+
+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