]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: switch the IO path to utilize the neorados API
authorJason Dillaman <dillaman@redhat.com>
Thu, 9 Jul 2020 21:04:50 +0000 (17:04 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 16 Jul 2020 19:59:31 +0000 (15:59 -0400)
IO operations to the cluster are now dispatched via the neorados
API which allows multiple threads to be utilized for processing
incoming and outgoing IO.

This also involves switching from a map for tracking sparse extents
to a vector of pairs since that matches the new API for sparse
read operations.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
27 files changed:
src/librbd/asio/Utils.h [new file with mode: 0644]
src/librbd/cache/ObjectCacherObjectDispatch.cc
src/librbd/cache/ObjectCacherObjectDispatch.h
src/librbd/cache/ParentCacheObjectDispatch.cc
src/librbd/cache/ParentCacheObjectDispatch.h
src/librbd/cache/WriteAroundObjectDispatch.cc
src/librbd/cache/WriteAroundObjectDispatch.h
src/librbd/io/CopyupRequest.cc
src/librbd/io/CopyupRequest.h
src/librbd/io/ImageRequest.cc
src/librbd/io/ObjectDispatch.cc
src/librbd/io/ObjectDispatch.h
src/librbd/io/ObjectDispatchInterface.h
src/librbd/io/ObjectDispatchSpec.h
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h
src/librbd/io/ReadResult.h
src/librbd/io/SimpleSchedulerObjectDispatch.cc
src/librbd/io/SimpleSchedulerObjectDispatch.h
src/librbd/io/Utils.cc
src/librbd/io/Utils.h
src/librbd/journal/ObjectDispatch.h
src/osdc/Striper.cc
src/osdc/Striper.h
src/test/librbd/io/test_mock_CopyupRequest.cc
src/test/librbd/io/test_mock_ObjectRequest.cc
src/test/librbd/mock/io/MockObjectDispatch.h

diff --git a/src/librbd/asio/Utils.h b/src/librbd/asio/Utils.h
new file mode 100644 (file)
index 0000000..2fbbb58
--- /dev/null
@@ -0,0 +1,33 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_LIBRBD_ASIO_UTILS_H
+#define CEPH_LIBRBD_ASIO_UTILS_H
+
+#include "include/Context.h"
+#include "include/rados/librados_fwd.hpp"
+#include <boost/system/error_code.hpp>
+
+namespace librbd {
+namespace asio {
+namespace util {
+
+template <typename T>
+auto get_context_adapter(T&& t) {
+  return [t = std::move(t)](boost::system::error_code ec) {
+      t->complete(-ec.value());
+    };
+}
+
+template <typename T>
+auto get_callback_adapter(T&& t) {
+  return [t = std::move(t)](boost::system::error_code ec, auto&& ... args) {
+      t(-ec.value(), std::forward<decltype(args)>(args)...);
+    };
+}
+
+} // namespace util
+} // namespace asio
+} // namespace librbd
+
+#endif // CEPH_LIBRBD_ASIO_UTILS_H
index 8479ef06b87f24c3b11a1856e5613cc01f4599fa..ffa0fc0a840ea8f4eee0a8492b8772168d0108e8 100644 (file)
@@ -183,7 +183,7 @@ template <typename I>
 bool ObjectCacherObjectDispatch<I>::read(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
-    ceph::bufferlist* read_data, io::ExtentMap* extent_map,
+    ceph::bufferlist* read_data, io::Extents* extent_map,
     int* object_dispatch_flags, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
   // IO chained in reverse order
index c6d7af0cd7ae922ab265c14cf713feffac088ffd..cb5e389126446e4017beb60bea5947866fc272ac 100644 (file)
@@ -45,7 +45,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      io::ExtentMap* extent_map, int* object_dispatch_flags,
+      io::Extents* extent_map, int* object_dispatch_flags,
       io::DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
index 73d3727431010342bb572fbd49c577436df7e732..b6c36c1d92d659acec49f7e59cc06734e7fd4482 100644 (file)
@@ -66,7 +66,7 @@ bool ParentCacheObjectDispatch<I>::read(
     uint64_t object_no, uint64_t object_off,
     uint64_t object_len, librados::snap_t snap_id, int op_flags,
     const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-    io::ExtentMap* extent_map, int* object_dispatch_flags,
+    io::Extents* extent_map, int* object_dispatch_flags,
     io::DispatchResult* dispatch_result, Context** on_finish,
     Context* on_dispatched) {
   auto cct = m_image_ctx->cct;
index 2c7b52341415ad6a6897e25d73536e8b9706b150..98b00bc916d6a3e0fc9742f9ba4855908f3fc135 100644 (file)
@@ -43,7 +43,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      io::ExtentMap* extent_map, int* object_dispatch_flags,
+      io::Extents* extent_map, int* object_dispatch_flags,
       io::DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
index 0d96d0296596daf2f3214ce1f224acabb0cde824..3d4fd1fc31e0b52bc230c7ddca5671a8e58fff33 100644 (file)
@@ -59,7 +59,7 @@ template <typename I>
 bool WriteAroundObjectDispatch<I>::read(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
-    ceph::bufferlist* read_data, io::ExtentMap* extent_map,
+    ceph::bufferlist* read_data, io::Extents* extent_map,
     int* object_dispatch_flags, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
   return dispatch_unoptimized_io(object_no, object_off, object_len,
index f32e3b4d0f252d421c3798c974ee349cb62e7e15..873feb724493e17e64c998cf5caef1509e126b2b 100644 (file)
@@ -45,7 +45,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      io::ExtentMap* extent_map, int* object_dispatch_flags,
+      io::Extents* extent_map, int* object_dispatch_flags,
       io::DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
index 27d396a0eaf106b9eb576fa9defddf99a94f945e..b8b2d2a8151c4fb6611f3baa01e12efdd8ac8e34 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "librbd/io/CopyupRequest.h"
+#include "include/neorados/RADOS.hpp"
 #include "common/ceph_context.h"
 #include "common/ceph_mutex.h"
 #include "common/dout.h"
@@ -13,6 +14,7 @@
 #include "librbd/ObjectMap.h"
 #include "librbd/Utils.h"
 #include "librbd/asio/ContextWQ.h"
+#include "librbd/asio/Utils.h"
 #include "librbd/deep_copy/ObjectCopyRequest.h"
 #include "librbd/io/AioCompletion.h"
 #include "librbd/io/ImageRequest.h"
@@ -371,6 +373,7 @@ void CopyupRequest<I>::copyup() {
   auto cct = m_image_ctx->cct;
   m_image_ctx->image_lock.lock_shared();
   auto snapc = m_image_ctx->snapc;
+  auto io_context = m_image_ctx->get_data_io_context();
   m_image_ctx->image_lock.unlock_shared();
 
   m_lock.lock();
@@ -391,8 +394,7 @@ void CopyupRequest<I>::copyup() {
     m_copyup_extent_map.clear();
   }
 
-  int r;
-  librados::ObjectWriteOperation copyup_op;
+  neorados::WriteOp copyup_op;
   if (copy_on_read || deep_copyup) {
     if (m_image_ctx->enable_sparse_copyup) {
       cls_client::sparse_copyup(&copyup_op, m_copyup_extent_map, m_copyup_data);
@@ -403,7 +405,7 @@ void CopyupRequest<I>::copyup() {
     ++m_pending_copyups;
   }
 
-  librados::ObjectWriteOperation write_op;
+  neorados::WriteOp write_op;
   if (!copy_on_read) {
     if (!deep_copyup) {
       if (m_image_ctx->enable_sparse_copyup) {
@@ -428,8 +430,7 @@ void CopyupRequest<I>::copyup() {
   m_lock.unlock();
 
   // issue librados ops at the end to simplify test cases
-  std::string oid(data_object_name(m_image_ctx, m_object_no));
-  std::vector<librados::snap_t> snaps;
+  auto object = neorados::Object{data_object_name(m_image_ctx, m_object_no)};
   if (copyup_op.size() > 0) {
     // send only the copyup request with a blank snapshot context so that
     // all snapshots are detected from the parent for this object.  If
@@ -437,13 +438,14 @@ void CopyupRequest<I>::copyup() {
     // actual modification.
     ldout(cct, 20) << "copyup with empty snapshot context" << dendl;
 
-    auto comp = util::create_rados_callback<
-      CopyupRequest<I>, &CopyupRequest<I>::handle_copyup>(this);
-    r = m_image_ctx->data_ctx.aio_operate(
-      oid, comp, &copyup_op, 0, snaps,
-      (m_trace.valid() ? m_trace.get_info() : nullptr));
-    ceph_assert(r == 0);
-    comp->release();
+    auto copyup_io_context = *io_context;
+    copyup_io_context.write_snap_context({});
+
+    m_image_ctx->rados_api.execute(
+      object, copyup_io_context, std::move(copyup_op),
+      librbd::asio::util::get_callback_adapter(
+        [this](int r) { handle_copyup(r); }), nullptr,
+        (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
   }
 
   if (write_op.size() > 0) {
@@ -454,14 +456,11 @@ void CopyupRequest<I>::copyup() {
                         "copyup + ops" : !deep_copyup ? "copyup" : "ops")
                    << " with current snapshot context" << dendl;
 
-    snaps.insert(snaps.end(), snapc.snaps.begin(), snapc.snaps.end());
-    auto comp = util::create_rados_callback<
-      CopyupRequest<I>, &CopyupRequest<I>::handle_copyup>(this);
-    r = m_image_ctx->data_ctx.aio_operate(
-      oid, comp, &write_op, snapc.seq, snaps,
-      (m_trace.valid() ? m_trace.get_info() : nullptr));
-    ceph_assert(r == 0);
-    comp->release();
+    m_image_ctx->rados_api.execute(
+      object, *io_context, std::move(write_op),
+      librbd::asio::util::get_callback_adapter(
+        [this](int r) { handle_copyup(r); }), nullptr,
+        (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
   }
 }
 
index 1dc9d1ca4931e95d94199c21d56feaf55c253d2b..24e65b4d5e93462953da537dba58d12750f08759 100644 (file)
@@ -5,7 +5,6 @@
 #define CEPH_LIBRBD_IO_COPYUP_REQUEST_H
 
 #include "include/int_types.h"
-#include "include/rados/librados.hpp"
 #include "include/buffer.h"
 #include "common/ceph_mutex.h"
 #include "common/zipkin_trace.h"
index d4a15645fb5070ddb3fa4881753ef1a3abe023bd..e8b824f0ee6f7b7f674c9ae121b843e16c2bea9e 100644 (file)
@@ -42,7 +42,7 @@ struct C_RBD_Readahead : public Context {
   uint64_t length;
 
   bufferlist read_data;
-  io::ExtentMap extent_map;
+  io::Extents extent_map;
 
   C_RBD_Readahead(I *ictx, uint64_t object_no, uint64_t offset, uint64_t length)
     : ictx(ictx), object_no(object_no), offset(offset), length(length) {
index 3e202f1b0795c74cdc162a03457ebb8f9787b69f..4e0e626cfd3cb8856ce51d77b9f93cce41bd7c94 100644 (file)
@@ -35,7 +35,7 @@ template <typename I>
 bool ObjectDispatch<I>::read(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
-    ceph::bufferlist* read_data, ExtentMap* extent_map,
+    ceph::bufferlist* read_data, Extents* extent_map,
     int* object_dispatch_flags, DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
   auto cct = m_image_ctx->cct;
index cbfe8b5ad0e3e7b660e7ce199de3a5fc9f6524e6..a7945ed0ce0db358347a4a822e98e94695770453 100644 (file)
@@ -37,7 +37,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, int* object_dispatch_flags,
+      Extents* extent_map, int* object_dispatch_flags,
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
index 31ed39994ebe2c9a07c4e03cc7874b0cc666867e..9397d1ead147162bb0fe546885f0e4b3d4e43901 100644 (file)
@@ -36,7 +36,7 @@ struct ObjectDispatchInterface {
   virtual bool read(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,const ZTracer::Trace &parent_trace,
-      ceph::bufferlist* read_data, ExtentMap* extent_map,
+      ceph::bufferlist* read_data, Extents* extent_map,
       int* object_dispatch_flags, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) = 0;
 
index 91a76d7eea092cca9f59c7e54ac143d6e4333f94..74ff4208f7a302ee5fdd27265a60b9a134b16959 100644 (file)
@@ -47,11 +47,11 @@ public:
     uint64_t object_len;
     librados::snap_t snap_id;
     ceph::bufferlist* read_data;
-    ExtentMap* extent_map;
+    Extents* extent_map;
 
     ReadRequest(uint64_t object_no, uint64_t object_off, uint64_t object_len,
                 librados::snap_t snap_id, ceph::bufferlist* read_data,
-                ExtentMap* extent_map)
+                Extents* extent_map)
       : RequestBase(object_no, object_off),
         object_len(object_len), snap_id(snap_id), read_data(read_data),
         extent_map(extent_map) {
@@ -156,7 +156,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, Context* on_finish) {
+      Extents* extent_map, Context* on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
                                   ReadRequest{object_no, object_off,
index 407bc1d33304518f744ef1ae6981d927ed639e94..22c4b8ed046be5a2c4fe217475f3798a5ad7d5d5 100644 (file)
@@ -8,6 +8,7 @@
 #include "common/ceph_mutex.h"
 #include "include/Context.h"
 #include "include/err.h"
+#include "include/neorados/RADOS.hpp"
 #include "osd/osd_types.h"
 
 #include "librbd/AsioEngine.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/ObjectMap.h"
 #include "librbd/Utils.h"
+#include "librbd/asio/Utils.h"
 #include "librbd/io/AioCompletion.h"
 #include "librbd/io/CopyupRequest.h"
 #include "librbd/io/ImageRequest.h"
 #include "librbd/io/ReadResult.h"
+#include "librbd/io/Utils.h"
 
 #include <boost/bind.hpp>
 #include <boost/optional.hpp>
@@ -102,7 +105,7 @@ ObjectRequest<I>::ObjectRequest(
     const ZTracer::Trace &trace, Context *completion)
   : m_ictx(ictx), m_object_no(objectno), m_object_off(off),
     m_object_len(len), m_snap_id(snap_id), m_completion(completion),
-    m_trace(util::create_trace(*ictx, "", trace)) {
+    m_trace(librbd::util::create_trace(*ictx, "", trace)) {
   ceph_assert(m_ictx->data_ctx.is_valid());
   if (m_trace.valid()) {
     m_trace.copy_name(trace_name + std::string(" ") +
@@ -112,14 +115,15 @@ ObjectRequest<I>::ObjectRequest(
 }
 
 template <typename I>
-void ObjectRequest<I>::add_write_hint(I& image_ctx,
-                                      librados::ObjectWriteOperation *wr) {
+void ObjectRequest<I>::add_write_hint(I& image_ctx, neorados::WriteOp* wr) {
+  auto alloc_hint_flags = static_cast<neorados::alloc_hint::alloc_hint_t>(
+    image_ctx.alloc_hint_flags);
   if (image_ctx.enable_alloc_hint) {
-    wr->set_alloc_hint2(image_ctx.get_object_size(),
-                        image_ctx.get_object_size(),
-                        image_ctx.alloc_hint_flags);
+    wr->set_alloc_hint(image_ctx.get_object_size(),
+                       image_ctx.get_object_size(),
+                       alloc_hint_flags);
   } else if (image_ctx.alloc_hint_flags != 0U) {
-    wr->set_alloc_hint2(0, 0, image_ctx.alloc_hint_flags);
+    wr->set_alloc_hint(0, 0, alloc_hint_flags);
   }
 }
 
@@ -181,7 +185,7 @@ template <typename I>
 ObjectReadRequest<I>::ObjectReadRequest(
     I *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
     librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
-    bufferlist* read_data, ExtentMap* extent_map, Context *completion)
+    bufferlist* read_data, Extents* extent_map, Context *completion)
   : ObjectRequest<I>(ictx, objectno, offset, len, snap_id, "read",
                      parent_trace, completion),
     m_op_flags(op_flags), m_read_data(read_data), m_extent_map(extent_map) {
@@ -209,25 +213,22 @@ void ObjectReadRequest<I>::read_object() {
 
   ldout(image_ctx->cct, 20) << dendl;
 
-  librados::ObjectReadOperation op;
+  neorados::ReadOp read_op;
   if (this->m_object_len >= image_ctx->sparse_read_threshold_bytes) {
-    op.sparse_read(this->m_object_off, this->m_object_len, m_extent_map,
-                   m_read_data, nullptr);
+    read_op.sparse_read(this->m_object_off, this->m_object_len, m_read_data,
+                        m_extent_map);
   } else {
-    op.read(this->m_object_off, this->m_object_len, m_read_data, nullptr);
+    read_op.read(this->m_object_off, this->m_object_len, m_read_data);
   }
-  op.set_op_flags2(m_op_flags);
+  util::apply_op_flags(m_op_flags, image_ctx->get_read_flags(this->m_snap_id),
+                       &read_op);
 
-  librados::AioCompletion *rados_completion = util::create_rados_callback<
-    ObjectReadRequest<I>, &ObjectReadRequest<I>::handle_read_object>(this);
-  int flags = image_ctx->get_read_flags(this->m_snap_id);
-  int r = image_ctx->data_ctx.aio_operate(
-    data_object_name(this->m_ictx, this->m_object_no), rados_completion, &op,
-    flags, nullptr,
-    (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
-  ceph_assert(r == 0);
-
-  rados_completion->release();
+  image_ctx->rados_api.execute(
+    {data_object_name(this->m_ictx, this->m_object_no)},
+    *image_ctx->get_data_io_context(), std::move(read_op), nullptr,
+    librbd::asio::util::get_callback_adapter(
+      [this](int r) { handle_read_object(r); }), nullptr,
+      (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
 }
 
 template <typename I>
@@ -279,7 +280,7 @@ void ObjectReadRequest<I>::read_parent() {
 
   auto parent_completion = AioCompletion::create_and_start<
     ObjectReadRequest<I>, &ObjectReadRequest<I>::handle_read_parent>(
-      this, util::get_image_ctx(image_ctx->parent), AIO_TYPE_READ);
+      this, librbd::util::get_image_ctx(image_ctx->parent), AIO_TYPE_READ);
   ImageRequest<I>::aio_read(image_ctx->parent, parent_completion,
                             std::move(parent_extents), ReadResult{m_read_data},
                             0, this->m_trace);
@@ -387,7 +388,7 @@ void AbstractObjectWriteRequest<I>::compute_parent_info() {
 
 template <typename I>
 void AbstractObjectWriteRequest<I>::add_write_hint(
-    librados::ObjectWriteOperation *wr) {
+    neorados::WriteOp *wr) {
   I *image_ctx = this->m_ictx;
   std::shared_lock image_locker{image_ctx->image_lock};
   if (image_ctx->object_map == nullptr || !this->m_object_may_exist) {
@@ -477,30 +478,27 @@ void AbstractObjectWriteRequest<I>::write_object() {
   I *image_ctx = this->m_ictx;
   ldout(image_ctx->cct, 20) << dendl;
 
-  librados::ObjectWriteOperation write;
+  neorados::WriteOp write_op;
   if (m_copyup_enabled) {
     ldout(image_ctx->cct, 20) << "guarding write" << dendl;
     if (m_guarding_migration_write) {
       cls_client::assert_snapc_seq(
-        &write, m_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ);
+        &write_op, m_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ);
     } else {
-      write.assert_exists();
+      write_op.assert_exists();
     }
   }
 
-  add_write_hint(&write);
-  add_write_ops(&write);
-  ceph_assert(write.size() != 0);
+  add_write_hint(&write_op);
+  add_write_ops(&write_op);
+  ceph_assert(write_op.size() != 0);
 
-  librados::AioCompletion *rados_completion = util::create_rados_callback<
-    AbstractObjectWriteRequest<I>,
-    &AbstractObjectWriteRequest<I>::handle_write_object>(this);
-  int r = image_ctx->data_ctx.aio_operate(
-    data_object_name(this->m_ictx, this->m_object_no), rados_completion,
-    &write, m_snap_seq, m_snaps,
-    (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
-  ceph_assert(r == 0);
-  rados_completion->release();
+  image_ctx->rados_api.execute(
+    {data_object_name(this->m_ictx, this->m_object_no)},
+    *image_ctx->get_data_io_context(), std::move(write_op),
+    librbd::asio::util::get_callback_adapter(
+      [this](int r) { handle_write_object(r); }), nullptr,
+      (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
 }
 
 template <typename I>
@@ -636,33 +634,53 @@ void AbstractObjectWriteRequest<I>::handle_post_write_object_map_update(int r) {
 }
 
 template <typename I>
-void ObjectWriteRequest<I>::add_write_ops(librados::ObjectWriteOperation *wr) {
+void ObjectWriteRequest<I>::add_write_ops(neorados::WriteOp* wr) {
   if (this->m_full_object) {
-    wr->write_full(m_write_data);
+    wr->write_full(bufferlist{m_write_data});
   } else {
-    wr->write(this->m_object_off, m_write_data);
+    wr->write(this->m_object_off, bufferlist{m_write_data});
+  }
+  util::apply_op_flags(m_op_flags, 0U, wr);
+}
+
+template <typename I>
+void ObjectDiscardRequest<I>::add_write_ops(neorados::WriteOp* wr) {
+  switch (m_discard_action) {
+  case DISCARD_ACTION_REMOVE:
+    wr->remove();
+    break;
+  case DISCARD_ACTION_REMOVE_TRUNCATE:
+    wr->create(false);
+    // fall through
+  case DISCARD_ACTION_TRUNCATE:
+    wr->truncate(this->m_object_off);
+    break;
+  case DISCARD_ACTION_ZERO:
+    wr->zero(this->m_object_off, this->m_object_len);
+    break;
+  default:
+    ceph_abort();
+    break;
   }
-  wr->set_op_flags2(m_op_flags);
 }
 
 template <typename I>
-void ObjectWriteSameRequest<I>::add_write_ops(
-    librados::ObjectWriteOperation *wr) {
-  wr->writesame(this->m_object_off, this->m_object_len, m_write_data);
-  wr->set_op_flags2(m_op_flags);
+void ObjectWriteSameRequest<I>::add_write_ops(neorados::WriteOp* wr) {
+  wr->writesame(this->m_object_off, this->m_object_len,
+                bufferlist{m_write_data});
+  util::apply_op_flags(m_op_flags, 0U, wr);
 }
 
 template <typename I>
-void ObjectCompareAndWriteRequest<I>::add_write_ops(
-    librados::ObjectWriteOperation *wr) {
-  wr->cmpext(this->m_object_off, m_cmp_bl, nullptr);
+void ObjectCompareAndWriteRequest<I>::add_write_ops(neorados::WriteOp* wr) {
+  wr->cmpext(this->m_object_off, bufferlist{m_cmp_bl}, nullptr);
 
   if (this->m_full_object) {
-    wr->write_full(m_write_bl);
+    wr->write_full(bufferlist{m_write_bl});
   } else {
-    wr->write(this->m_object_off, m_write_bl);
+    wr->write(this->m_object_off, bufferlist{m_write_bl});
   }
-  wr->set_op_flags2(m_op_flags);
+  util::apply_op_flags(m_op_flags, 0U, wr);
 }
 
 template <typename I>
index b9bd134451e2c394e33f6d35c9901fd4177c8cfd..f696e13f71c47b06de6815bde22fb7e0b1fe3ea1 100644 (file)
@@ -16,6 +16,8 @@
 class Context;
 class ObjectExtent;
 
+namespace neorados { struct WriteOp; }
+
 namespace librbd {
 
 struct ImageCtx;
@@ -59,7 +61,7 @@ public:
   }
 
   static void add_write_hint(ImageCtxT& image_ctx,
-                             librados::ObjectWriteOperation *wr);
+                             neorados::WriteOp *wr);
 
   virtual void send() = 0;
 
@@ -88,13 +90,11 @@ private:
 template <typename ImageCtxT = ImageCtx>
 class ObjectReadRequest : public ObjectRequest<ImageCtxT> {
 public:
-  typedef std::map<uint64_t, uint64_t> ExtentMap;
-
   static ObjectReadRequest* create(
       ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, Context *completion) {
+      Extents* extent_map, Context *completion) {
     return new ObjectReadRequest(ictx, objectno, offset, len,
                                  snap_id, op_flags, parent_trace, read_data,
                                  extent_map, completion);
@@ -104,7 +104,7 @@ public:
       ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, Context *completion);
+      Extents* extent_map, Context *completion);
 
   void send() override;
 
@@ -137,7 +137,7 @@ private:
   int m_op_flags;
 
   ceph::bufferlist* m_read_data;
-  ExtentMap* m_extent_map;
+  Extents* m_extent_map;
 
   void read_object();
   void handle_read_object(int r);
@@ -164,7 +164,7 @@ public:
     return OBJECT_EXISTS;
   }
 
-  virtual void add_copyup_ops(librados::ObjectWriteOperation *wr) {
+  virtual void add_copyup_ops(neorados::WriteOp *wr) {
     add_write_ops(wr);
   }
 
@@ -189,8 +189,8 @@ protected:
     return false;
   }
 
-  virtual void add_write_hint(librados::ObjectWriteOperation *wr);
-  virtual void add_write_ops(librados::ObjectWriteOperation *wr) = 0;
+  virtual void add_write_hint(neorados::WriteOp *wr);
+  virtual void add_write_ops(neorados::WriteOp *wr) = 0;
 
   virtual int filter_write_result(int r) const {
     return r;
@@ -273,7 +273,7 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(neorados::WriteOp *wr) override;
 
 private:
   ceph::bufferlist m_write_data;
@@ -345,29 +345,11 @@ protected:
     return (m_discard_action == DISCARD_ACTION_REMOVE);
   }
 
-  void add_write_hint(librados::ObjectWriteOperation *wr) override {
+  void add_write_hint(neorados::WriteOp *wr) override {
     // no hint for discard
   }
 
-  void add_write_ops(librados::ObjectWriteOperation *wr) override {
-    switch (m_discard_action) {
-    case DISCARD_ACTION_REMOVE:
-      wr->remove();
-      break;
-    case DISCARD_ACTION_REMOVE_TRUNCATE:
-      wr->create(false);
-      // fall through
-    case DISCARD_ACTION_TRUNCATE:
-      wr->truncate(this->m_object_off);
-      break;
-    case DISCARD_ACTION_ZERO:
-      wr->zero(this->m_object_off, this->m_object_len);
-      break;
-    default:
-      ceph_abort();
-      break;
-    }
-  }
+  void add_write_ops(neorados::WriteOp *wr) override;
 
 private:
   enum DiscardAction {
@@ -400,7 +382,7 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(neorados::WriteOp *wr) override;
 
 private:
   ceph::bufferlist m_write_data;
@@ -427,7 +409,7 @@ public:
     return "compare_and_write";
   }
 
-  void add_copyup_ops(librados::ObjectWriteOperation *wr) override {
+  void add_copyup_ops(neorados::WriteOp *wr) override {
     // no-op on copyup
   }
 
@@ -436,7 +418,7 @@ protected:
     return true;
   }
 
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(neorados::WriteOp *wr) override;
 
   int filter_write_result(int r) const override;
 
index 67339caec85f27d1b56dce7c6c4761f24d385bf0..f4a34a0506bf21c5ff61dcaf6acef2e5bb1f0c1d 100644 (file)
@@ -43,7 +43,7 @@ public:
     LightweightBufferExtents buffer_extents;
 
     bufferlist bl;
-    ExtentMap extent_map;
+    Extents extent_map;
 
     C_ObjectReadRequest(AioCompletion *aio_completion, uint64_t object_off,
                         uint64_t object_len,
index f6781b6646e65b29d3173e3b81a1eb4552d2437f..eca053e8a70c2d610a168e9123b24ea737a7633d 100644 (file)
@@ -213,7 +213,7 @@ template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::read(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
-    ceph::bufferlist* read_data, ExtentMap* extent_map,
+    ceph::bufferlist* read_data, Extents* extent_map,
     int* object_dispatch_flags, DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
   auto cct = m_image_ctx->cct;
index cca6b12b4c367cd56664388f9ae65c954bc5619b..c32d513a2c89b2370b70ad3132c92b9ebdef778e 100644 (file)
@@ -52,7 +52,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, int* object_dispatch_flags,
+      Extents* extent_map, int* object_dispatch_flags,
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) override;
 
index bf06663388c8e710cb315500db0fa79df9855cfb..d50ac98d1987109334ea58a258ab279e58ea77a3 100644 (file)
@@ -3,12 +3,32 @@
 
 #include "librbd/io/Utils.h"
 #include "include/buffer.h"
+#include "include/rados/librados.hpp"
+#include "include/neorados/RADOS.hpp"
 #include "osd/osd_types.h"
 
 namespace librbd {
 namespace io {
 namespace util {
 
+void apply_op_flags(uint32_t op_flags, uint32_t flags, neorados::Op* op) {
+  if (op_flags & LIBRADOS_OP_FLAG_FADVISE_RANDOM)
+    op->set_fadvise_random();
+  if (op_flags & LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL)
+    op->set_fadvise_sequential();
+  if (op_flags & LIBRADOS_OP_FLAG_FADVISE_WILLNEED)
+    op->set_fadvise_willneed();
+  if (op_flags & LIBRADOS_OP_FLAG_FADVISE_DONTNEED)
+    op->set_fadvise_dontneed();
+  if (op_flags & LIBRADOS_OP_FLAG_FADVISE_NOCACHE)
+    op->set_fadvise_nocache();
+
+  if (flags & librados::OPERATION_BALANCE_READS)
+    op->balance_reads();
+  if (flags & librados::OPERATION_LOCALIZE_READS)
+    op->localize_reads();
+}
+
 bool assemble_write_same_extent(
     const LightweightObjectExtent &object_extent, const ceph::bufferlist& data,
     ceph::bufferlist *ws_data, bool force_write) {
index 285985036de280e44bdb090f41c9fa70fb7d7026..cadc22840bf9cadb82a973d351c5255a9ab357e1 100644 (file)
 
 class ObjectExtent;
 
+namespace neorados { struct Op; }
+
 namespace librbd {
 namespace io {
 namespace util {
 
+void apply_op_flags(uint32_t op_flags, uint32_t flags, neorados::Op* op);
+
 bool assemble_write_same_extent(const LightweightObjectExtent &object_extent,
                                 const ceph::bufferlist& data,
                                 ceph::bufferlist *ws_data,
index e63f05535f8e5368b709ce36b772f9a44404f76d..48176e6434512ae8c8f6800a25e194d3c5c4b454 100644 (file)
@@ -41,7 +41,7 @@ public:
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      io::ExtentMap* extent_map, int* object_dispatch_flags,
+      io::Extents* extent_map, int* object_dispatch_flags,
       io::DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) {
     return false;
index 2c7f0a960875ec1862b74b09e6211ad5d394aa5a..d0d2ab47c37e03355758ced48245354d4043e736 100644 (file)
@@ -50,6 +50,72 @@ struct OrderByObject {
   }
 };
 
+template <typename I>
+void add_partial_sparse_result(
+    CephContext *cct,
+    std::map<uint64_t, std::pair<ceph::buffer::list, uint64_t> >* partial,
+    uint64_t* total_intended_len, bufferlist& bl, I* it, const I& end_it,
+    uint64_t* bl_off, uint64_t tofs, uint64_t tlen) {
+  ldout(cct, 30) << " be " << tofs << "~" << tlen << dendl;
+
+  auto& s = *it;
+  while (tlen > 0) {
+    ldout(cct, 20) << "  t " << tofs << "~" << tlen
+                   << " bl has " << bl.length()
+                   << " off " << *bl_off << dendl;
+    if (s == end_it) {
+      ldout(cct, 20) << "  s at end" << dendl;
+      auto& r = (*partial)[tofs];
+      r.second = tlen;
+      *total_intended_len += r.second;
+      break;
+    }
+
+    ldout(cct, 30) << "  s " << s->first << "~" << s->second << dendl;
+
+    // skip zero-length extent
+    if (s->second == 0) {
+      ldout(cct, 30) << "  s len 0, skipping" << dendl;
+      ++s;
+      continue;
+    }
+
+    if (s->first > *bl_off) {
+      // gap in sparse read result
+      pair<bufferlist, uint64_t>& r = (*partial)[tofs];
+      size_t gap = std::min<size_t>(s->first - *bl_off, tlen);
+      ldout(cct, 20) << "  s gap " << gap << ", skipping" << dendl;
+      r.second = gap;
+      *total_intended_len += r.second;
+      *bl_off += gap;
+      tofs += gap;
+      tlen -= gap;
+      if (tlen == 0) {
+        continue;
+      }
+    }
+
+    ceph_assert(s->first <= *bl_off);
+    size_t left = (s->first + s->second) - *bl_off;
+    size_t actual = std::min<size_t>(left, tlen);
+
+    if (actual > 0) {
+      ldout(cct, 20) << "  s has " << actual << ", copying" << dendl;
+      pair<bufferlist, uint64_t>& r = (*partial)[tofs];
+      bl.splice(0, actual, &r.first);
+      r.second = actual;
+      *total_intended_len += r.second;
+      *bl_off += actual;
+      tofs += actual;
+      tlen -= actual;
+    }
+    if (actual == left) {
+      ldout(cct, 30) << "  s advancing" << dendl;
+      ++s;
+    }
+  }
+}
+
 } // anonymous namespace
 
 void Striper::file_to_extents(CephContext *cct, const char *object_format,
@@ -361,87 +427,22 @@ void Striper::StripedReadResult::add_partial_sparse_result(
                 << " to " << buffer_extents << dendl;
   auto s = bl_map.cbegin();
   for (auto& be : buffer_extents) {
-    add_partial_sparse_result(cct, bl, &s, bl_map.end(), &bl_off, be.first,
-                              be.second);
+    ::add_partial_sparse_result(cct, &partial, &total_intended_len, bl, &s,
+                                bl_map.end(), &bl_off, be.first, be.second);
   }
 }
 
 void Striper::StripedReadResult::add_partial_sparse_result(
     CephContext *cct, ceph::buffer::list& bl,
-    const std::map<uint64_t, uint64_t>& bl_map, uint64_t bl_off,
+    const std::vector<std::pair<uint64_t, uint64_t>>& bl_map, uint64_t bl_off,
     const striper::LightweightBufferExtents& buffer_extents) {
   ldout(cct, 10) << "add_partial_sparse_result(" << this << ") " << bl.length()
                 << " covering " << bl_map << " (offset " << bl_off << ")"
                 << " to " << buffer_extents << dendl;
   auto s = bl_map.cbegin();
   for (auto& be : buffer_extents) {
-    add_partial_sparse_result(cct, bl, &s, bl_map.cend(), &bl_off, be.first,
-                              be.second);
-  }
-}
-
-void Striper::StripedReadResult::add_partial_sparse_result(
-    CephContext *cct, bufferlist& bl,
-    std::map<uint64_t, uint64_t>::const_iterator* it,
-    const std::map<uint64_t, uint64_t>::const_iterator& end_it,
-    uint64_t* bl_off, uint64_t tofs, uint64_t tlen) {
-  ldout(cct, 30) << " be " << tofs << "~" << tlen << dendl;
-
-  auto& s = *it;
-  while (tlen > 0) {
-    ldout(cct, 20) << "  t " << tofs << "~" << tlen
-                   << " bl has " << bl.length()
-                   << " off " << *bl_off << dendl;
-    if (s == end_it) {
-      ldout(cct, 20) << "  s at end" << dendl;
-      auto& r = partial[tofs];
-      r.second = tlen;
-      total_intended_len += r.second;
-      break;
-    }
-
-    ldout(cct, 30) << "  s " << s->first << "~" << s->second << dendl;
-
-    // skip zero-length extent
-    if (s->second == 0) {
-      ldout(cct, 30) << "  s len 0, skipping" << dendl;
-      ++s;
-      continue;
-    }
-
-    if (s->first > *bl_off) {
-      // gap in sparse read result
-      pair<bufferlist, uint64_t>& r = partial[tofs];
-      size_t gap = std::min<size_t>(s->first - *bl_off, tlen);
-      ldout(cct, 20) << "  s gap " << gap << ", skipping" << dendl;
-      r.second = gap;
-      total_intended_len += r.second;
-      *bl_off += gap;
-      tofs += gap;
-      tlen -= gap;
-      if (tlen == 0) {
-        continue;
-      }
-    }
-
-    ceph_assert(s->first <= *bl_off);
-    size_t left = (s->first + s->second) - *bl_off;
-    size_t actual = std::min<size_t>(left, tlen);
-
-    if (actual > 0) {
-      ldout(cct, 20) << "  s has " << actual << ", copying" << dendl;
-      pair<bufferlist, uint64_t>& r = partial[tofs];
-      bl.splice(0, actual, &r.first);
-      r.second = actual;
-      total_intended_len += r.second;
-      *bl_off += actual;
-      tofs += actual;
-      tlen -= actual;
-    }
-    if (actual == left) {
-      ldout(cct, 30) << "  s advancing" << dendl;
-      ++s;
-    }
+    ::add_partial_sparse_result(cct, &partial, &total_intended_len, bl, &s,
+                                bl_map.cend(), &bl_off, be.first, be.second);
   }
 }
 
index 2ebc29a1213a6a1049d674945ac979c050a9ee36..9cb48352c4cc8470a3b442ebdb1e4a4792c8f94f 100644 (file)
        const std::vector<std::pair<uint64_t,uint64_t> >& buffer_extents);
       void add_partial_sparse_result(
          CephContext *cct, ceph::buffer::list& bl,
-         const std::map<uint64_t, uint64_t>& bl_map, uint64_t bl_off,
-         const striper::LightweightBufferExtents& buffer_extents);
+         const std::vector<std::pair<uint64_t, uint64_t>>& bl_map,
+          uint64_t bl_off,
+          const striper::LightweightBufferExtents& buffer_extents);
 
       void assemble_result(CephContext *cct, ceph::buffer::list& bl,
                            bool zero_tail);
       void assemble_result(CephContext *cct,
                            std::map<uint64_t, uint64_t> *extent_map,
                            ceph::buffer::list *bl);
-
-    private:
-      void add_partial_sparse_result(
-          CephContext *cct, ceph::buffer::list& bl,
-          std::map<uint64_t, uint64_t>::const_iterator* it,
-          const std::map<uint64_t, uint64_t>::const_iterator& end_it,
-          uint64_t* bl_off, uint64_t tofs, uint64_t tlen);
     };
 
   };
index ec8cdf651eebdc65e99d9cb769a0c9e3ab42fc23..b0f3eae101a1dedf933d96e321f3278c49fd026c 100644 (file)
@@ -83,7 +83,7 @@ namespace io {
 template <>
 struct ObjectRequest<librbd::MockTestImageCtx> {
   static void add_write_hint(librbd::MockTestImageCtx&,
-                             librados::ObjectWriteOperation*) {
+                             neorados::WriteOp*) {
   }
 };
 
@@ -97,7 +97,7 @@ struct AbstractObjectWriteRequest<librbd::MockTestImageCtx> {
   MOCK_CONST_METHOD0(get_pre_write_object_map_state, uint8_t());
   MOCK_CONST_METHOD0(is_empty_write_op, bool());
 
-  MOCK_METHOD1(add_copyup_ops, void(librados::ObjectWriteOperation*));
+  MOCK_METHOD1(add_copyup_ops, void(neorados::WriteOp*));
 };
 
 template <>
@@ -217,7 +217,9 @@ struct TestMockIoCopyupRequest : public TestMockFixture {
       snapc = mock_image_ctx.snapc;
     }
 
-    EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    EXPECT_CALL(mock_io_ctx,
                 exec(oid, _, StrEq("rbd"), StrEq("copyup"),
                      ContentsEqual(in_bl), _, _, snapc))
       .WillOnce(Return(r));
@@ -239,7 +241,9 @@ struct TestMockIoCopyupRequest : public TestMockFixture {
       snapc = mock_image_ctx.snapc;
     }
 
-    EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    EXPECT_CALL(mock_io_ctx,
                 exec(oid, _, StrEq("rbd"), StrEq("sparse_copyup"),
                      ContentsEqual(in_bl), _, _, snapc))
       .WillOnce(Return(r));
@@ -252,8 +256,9 @@ struct TestMockIoCopyupRequest : public TestMockFixture {
       snapc = mock_image_ctx.snapc;
     }
 
-    EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                write(oid, _, 0, 0, snapc))
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    EXPECT_CALL(mock_io_ctx, write(oid, _, 0, 0, snapc))
       .WillOnce(Return(r));
   }
 
@@ -279,7 +284,7 @@ struct TestMockIoCopyupRequest : public TestMockFixture {
 
   void expect_add_copyup_ops(MockAbstractObjectWriteRequest& mock_write_request) {
     EXPECT_CALL(mock_write_request, add_copyup_ops(_))
-      .WillOnce(Invoke([](librados::ObjectWriteOperation* op) {
+      .WillOnce(Invoke([](neorados::WriteOp* op) {
                   op->write(0, bufferlist{});
                 }));
   }
@@ -914,8 +919,9 @@ TEST_F(TestMockIoCopyupRequest, RestartWrite) {
                        {{0, 4096}}, data, 0);
 
   MockAbstractObjectWriteRequest mock_write_request2;
-  EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-              write(ictx->get_object_name(0), _, 0, 0, _))
+  auto& mock_io_ctx = librados::get_mock_io_ctx(
+    mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+  EXPECT_CALL(mock_io_ctx, write(ictx->get_object_name(0), _, 0, 0, _))
     .WillOnce(WithoutArgs(Invoke([req, &mock_write_request2]() {
                             req->append_request(&mock_write_request2);
                             return 0;
index 0ca7e9b800d028282b627428b2f6081a20b4918d..841b3c40d3312df8318a388104168c64ac151c4e 100644 (file)
@@ -149,8 +149,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
     bufferlist bl;
     bl.append(data);
 
-    auto& expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               read(oid, len, off, _, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto& expect = EXPECT_CALL(mock_io_ctx, read(oid, len, off, _, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -167,7 +168,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
     bufferlist bl;
     bl.append(data);
 
-    auto& expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto& expect = EXPECT_CALL(mock_io_ctx,
                                sparse_read(oid, off, len, _, _, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
@@ -225,14 +228,17 @@ struct TestMockIoObjectRequest : public TestMockFixture {
   }
 
   void expect_assert_exists(MockTestImageCtx &mock_image_ctx, int r) {
-    EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                assert_exists(_, _))
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    EXPECT_CALL(mock_io_ctx, assert_exists(_, _))
       .WillOnce(Return(r));
   }
 
   void expect_write(MockTestImageCtx &mock_image_ctx,
                     uint64_t offset, uint64_t length, int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx,
                                write(_, _, length, offset, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
@@ -242,8 +248,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
   }
 
   void expect_write_full(MockTestImageCtx &mock_image_ctx, int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               write_full(_, _, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx, write_full(_, _, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -253,8 +260,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
 
   void expect_writesame(MockTestImageCtx &mock_image_ctx,
                         uint64_t offset, uint64_t length, int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               writesame(_, _, length, offset, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx, writesame(_, _, length, offset, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -263,8 +271,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
   }
 
   void expect_remove(MockTestImageCtx &mock_image_ctx, int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               remove(_, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx, remove(_, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -273,13 +282,16 @@ struct TestMockIoObjectRequest : public TestMockFixture {
   }
 
   void expect_create(MockTestImageCtx &mock_image_ctx, bool exclusive) {
-    EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx), create(_, exclusive, _))
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    EXPECT_CALL(mock_io_ctx, create(_, exclusive, _))
       .Times(1);
   }
 
   void expect_truncate(MockTestImageCtx &mock_image_ctx, int offset, int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               truncate(_, offset, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx, truncate(_, offset, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -289,8 +301,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
 
   void expect_zero(MockTestImageCtx &mock_image_ctx, int offset, int length,
                    int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               zero(_, offset, length, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx, zero(_, offset, length, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -299,8 +312,9 @@ struct TestMockIoObjectRequest : public TestMockFixture {
   }
 
   void expect_cmpext(MockTestImageCtx &mock_image_ctx, int offset, int r) {
-    auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.data_ctx),
-                               cmpext(_, offset, _, _));
+    auto& mock_io_ctx = librados::get_mock_io_ctx(
+      mock_image_ctx.rados_api, *mock_image_ctx.get_data_io_context());
+    auto &expect = EXPECT_CALL(mock_io_ctx, cmpext(_, offset, _, _));
     if (r < 0) {
       expect.WillOnce(Return(r));
     } else {
@@ -328,7 +342,7 @@ TEST_F(TestMockIoObjectRequest, Read) {
               std::string(4096, '1'), 0);
 
   bufferlist bl;
-  ExtentMap extent_map;
+  Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx);
@@ -356,7 +370,7 @@ TEST_F(TestMockIoObjectRequest, SparseReadThreshold) {
                      std::string(ictx->sparse_read_threshold_bytes, '1'), 0);
 
   bufferlist bl;
-  ExtentMap extent_map;
+  Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0, 0, ictx->sparse_read_threshold_bytes, CEPH_NOSNAP, 0,
@@ -383,7 +397,7 @@ TEST_F(TestMockIoObjectRequest, ReadError) {
   expect_read(mock_image_ctx, ictx->get_object_name(0), 0, 4096, "", -EPERM);
 
   bufferlist bl;
-  ExtentMap extent_map;
+  Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx);
@@ -430,7 +444,7 @@ TEST_F(TestMockIoObjectRequest, ParentRead) {
   expect_aio_read(mock_image_ctx, mock_image_request, {{0, 4096}}, 0);
 
   bufferlist bl;
-  ExtentMap extent_map;
+  Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx);
@@ -477,7 +491,7 @@ TEST_F(TestMockIoObjectRequest, ParentReadError) {
   expect_aio_read(mock_image_ctx, mock_image_request, {{0, 4096}}, -EPERM);
 
   bufferlist bl;
-  ExtentMap extent_map;
+  Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx);
@@ -529,7 +543,7 @@ TEST_F(TestMockIoObjectRequest, CopyOnRead) {
   expect_copyup(mock_copyup_request, 0);
 
   bufferlist bl;
-  ExtentMap extent_map;
+  Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0, 0, 4096, CEPH_NOSNAP, 0, {}, &bl, &extent_map, &ctx);
index 16cf4b0d2b134620c518984408add19d72c5b02d..5cfe98f48068882b8d1877c1843630081246bab6 100644 (file)
@@ -26,12 +26,12 @@ public:
 
   MOCK_METHOD8(execute_read,
                bool(uint64_t, uint64_t, uint64_t, librados::snap_t,
-                    ceph::bufferlist*, ExtentMap*, DispatchResult*, Context*));
+                    ceph::bufferlist*, Extents*, DispatchResult*, Context*));
   bool read(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       librados::snap_t snap_id, int op_flags,
       const ZTracer::Trace& parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, int* dispatch_flags,
+      Extents* extent_map, int* dispatch_flags,
       DispatchResult* dispatch_result, Context** on_finish,
       Context* on_dispatched) {
     return execute_read(object_no, object_off, object_len, snap_id, read_data,