]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: pass IOContext to object-extent IO dispatch methods
authorJason Dillaman <dillaman@redhat.com>
Fri, 4 Sep 2020 00:22:30 +0000 (20:22 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 18 Sep 2020 03:52:32 +0000 (23:52 -0400)
This allows a specific IOContext to be used regardless of the image's
current read and write snapshot state.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
39 files changed:
src/librbd/CMakeLists.txt
src/librbd/ImageCtx.cc
src/librbd/Operations.cc
src/librbd/Utils.cc
src/librbd/Utils.h
src/librbd/cache/ObjectCacherObjectDispatch.cc
src/librbd/cache/ObjectCacherObjectDispatch.h
src/librbd/cache/ObjectCacherWriteback.cc
src/librbd/cache/ParentCacheObjectDispatch.cc
src/librbd/cache/ParentCacheObjectDispatch.h
src/librbd/cache/WriteAroundObjectDispatch.cc
src/librbd/cache/WriteAroundObjectDispatch.h
src/librbd/crypto/CryptoObjectDispatch.cc
src/librbd/crypto/CryptoObjectDispatch.h
src/librbd/io/ImageRequest.cc
src/librbd/io/ImageRequest.h
src/librbd/io/ObjectDispatch.cc
src/librbd/io/ObjectDispatch.h
src/librbd/io/ObjectDispatchInterface.h
src/librbd/io/ObjectDispatchSpec.h
src/librbd/io/ObjectDispatcher.cc
src/librbd/io/ObjectRequest.cc
src/librbd/io/ObjectRequest.h
src/librbd/io/SimpleSchedulerObjectDispatch.cc
src/librbd/io/SimpleSchedulerObjectDispatch.h
src/librbd/journal/ObjectDispatch.cc
src/librbd/journal/ObjectDispatch.h
src/librbd/operation/FlattenRequest.cc
src/librbd/operation/FlattenRequest.h
src/librbd/operation/MigrateRequest.cc
src/librbd/operation/MigrateRequest.h
src/librbd/operation/TrimRequest.cc
src/test/librados_test_stub/NeoradosTestStub.cc
src/test/librbd/cache/test_mock_ParentCacheObjectDispatch.cc
src/test/librbd/crypto/test_mock_CryptoObjectDispatch.cc
src/test/librbd/io/test_mock_ObjectRequest.cc
src/test/librbd/io/test_mock_SimpleSchedulerObjectDispatch.cc
src/test/librbd/mock/MockImageCtx.cc
src/test/librbd/mock/io/MockObjectDispatch.h

index a7ff50935ff9e5c3277fab88093d6897839c6490..735ead7896da1af13b391399f62628bbfa7883d7 100644 (file)
@@ -225,6 +225,7 @@ add_library(librbd_plugin_parent_cache SHARED
   ${rbd_plugin_parent_cache_srcs})
 target_link_libraries(librbd_plugin_parent_cache PRIVATE
   ceph_immutable_object_cache_lib ceph-common librbd
+  libneorados
   librados)
 set_target_properties(librbd_plugin_parent_cache PROPERTIES
   OUTPUT_NAME ceph_librbd_parent_cache
index c1f19aa209db82ba13b3154ea9a5baf1e071bda3..39f4b0ffc4fd435cf3da87ad88bfb5f3d5a7a5c0 100644 (file)
@@ -912,9 +912,13 @@ librados::IoCtx duplicate_io_ctx(librados::IoCtx& io_ctx) {
   void ImageCtx::rebuild_data_io_context() {
     auto ctx = std::make_shared<neorados::IOContext>(
       data_ctx.get_id(), data_ctx.get_namespace());
-    ctx->read_snap(snap_id);
-    ctx->write_snap_context(
-      {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}});
+    if (snap_id != CEPH_NOSNAP) {
+      ctx->read_snap(snap_id);
+    }
+    if (!snapc.snaps.empty()) {
+      ctx->write_snap_context(
+        {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}});
+    }
 
     // atomically reset the data IOContext to new version
     atomic_store(&data_io_context, ctx);
index c18259c67f78ac6b542b2797cebeaf04f45c3129..7e3f8a63c97359c07d001d788a3a2aff961ad900 100644 (file)
@@ -406,8 +406,6 @@ void Operations<I>::execute_flatten(ProgressContext &prog_ctx,
     return;
   }
 
-  ::SnapContext snapc = m_image_ctx.snapc;
-
   uint64_t overlap;
   int r = m_image_ctx.get_parent_overlap(CEPH_NOSNAP, &overlap);
   ceph_assert(r == 0);
@@ -420,7 +418,7 @@ void Operations<I>::execute_flatten(ProgressContext &prog_ctx,
 
   operation::FlattenRequest<I> *req = new operation::FlattenRequest<I>(
     m_image_ctx, new C_NotifyUpdate<I>(m_image_ctx, on_finish), overlap_objects,
-    snapc, prog_ctx);
+    prog_ctx);
   req->send();
 }
 
index 044839c944620c9d108cf7ade69c3ce6e222a11d..420f73a69bd38027c06366ff74cd1977bc1cd82b 100644 (file)
@@ -7,6 +7,7 @@
 #include "librbd/Utils.h"
 #include "include/rbd_types.h"
 #include "include/stringify.h"
+#include "include/neorados/RADOS.hpp"
 #include "include/rbd/features.h"
 #include "common/dout.h"
 #include "librbd/ImageCtx.h"
@@ -179,5 +180,18 @@ uint32_t get_default_snap_create_flags(ImageCtx *ictx) {
   }
 }
 
+SnapContext get_snap_context(
+    const std::optional<
+      std::pair<std::uint64_t,
+                std::vector<std::uint64_t>>>& write_snap_context) {
+  SnapContext snapc;
+  if (write_snap_context) {
+    snapc = SnapContext{write_snap_context->first,
+                        {write_snap_context->second.begin(),
+                         write_snap_context->second.end()}};
+  }
+  return snapc;
+}
+
 } // namespace util
 } // namespace librbd
index 9c1d9a547f4a962beab05c9be91d0f37a7c534e8..134447f7cd8249eaf0735c6b890067d6e1713051 100644 (file)
@@ -8,11 +8,15 @@
 #include "include/rbd_types.h"
 #include "include/ceph_assert.h"
 #include "include/Context.h"
+#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
 #include "common/RefCountedObj.h"
 
 #include <atomic>
+#include <optional>
 #include <type_traits>
+#include <utility>
+#include <vector>
 #include <stdio.h>
 
 namespace librbd {
@@ -265,6 +269,11 @@ int snap_create_flags_api_to_internal(CephContext *cct, uint32_t api_flags,
 
 uint32_t get_default_snap_create_flags(ImageCtx *ictx);
 
+SnapContext get_snap_context(
+    const std::optional<
+      std::pair<std::uint64_t,
+                std::vector<std::uint64_t>>>& write_snap_context);
+
 } // namespace util
 } // namespace librbd
 
index 0c0be29a91d93eb484fe9117d8f7d1d23ca15ec3..71b72e90f8782c2f7cd4c8d4e5a1fc48967777ec 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "librbd/cache/ObjectCacherObjectDispatch.h"
+#include "include/neorados/RADOS.hpp"
 #include "common/errno.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/Journal.h"
@@ -181,7 +182,7 @@ void ObjectCacherObjectDispatch<I>::shut_down(Context* on_finish) {
 
 template <typename I>
 bool ObjectCacherObjectDispatch<I>::read(
-    uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+    uint64_t object_no, const io::Extents &extents, IOContext io_context,
     int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version,
     int* object_dispatch_flags, io::DispatchResult* dispatch_result,
@@ -202,7 +203,8 @@ bool ObjectCacherObjectDispatch<I>::read(
                                                       on_dispatched);
 
   m_image_ctx->image_lock.lock_shared();
-  auto rd = m_object_cacher->prepare_read(snap_id, read_data, op_flags);
+  auto rd = m_object_cacher->prepare_read(
+    io_context->read_snap().value_or(CEPH_NOSNAP), read_data, op_flags);
   m_image_ctx->image_lock.unlock_shared();
 
   ObjectExtent extent(data_object_name(m_image_ctx, object_no), object_no,
@@ -226,7 +228,7 @@ bool ObjectCacherObjectDispatch<I>::read(
 template <typename I>
 bool ObjectCacherObjectDispatch<I>::discard(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    const ::SnapContext &snapc, int discard_flags,
+    IOContext io_context, int discard_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -267,7 +269,7 @@ bool ObjectCacherObjectDispatch<I>::discard(
 template <typename I>
 bool ObjectCacherObjectDispatch<I>::write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -297,6 +299,14 @@ bool ObjectCacherObjectDispatch<I>::write(
     return true;
   }
 
+  SnapContext snapc;
+  if (io_context->write_snap_context()) {
+    auto write_snap_context = *io_context->write_snap_context();
+    snapc = std::move(SnapContext(write_snap_context.first,
+                                  {write_snap_context.second.begin(),
+                                   write_snap_context.second.end()}));
+  }
+
   m_image_ctx->image_lock.lock_shared();
   ObjectCacher::OSDWrite *wr = m_object_cacher->prepare_write(
     snapc, data, ceph::real_time::min(), op_flags, *journal_tid);
@@ -320,7 +330,7 @@ template <typename I>
 bool ObjectCacherObjectDispatch<I>::write_same(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags,
+    IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -335,15 +345,15 @@ bool ObjectCacherObjectDispatch<I>::write_same(
   bufferlist ws_data;
   io::util::assemble_write_same_extent(extent, data, &ws_data, true);
 
-  return write(object_no, object_off, std::move(ws_data), snapc, op_flags, 0,
-               std::nullopt, parent_trace, object_dispatch_flags, journal_tid,
-               dispatch_result, on_finish, on_dispatched);
+  return write(object_no, object_off, std::move(ws_data), io_context, op_flags,
+               0, std::nullopt, parent_trace, object_dispatch_flags,
+               journal_tid, dispatch_result, on_finish, on_dispatched);
 }
 
 template <typename I>
 bool ObjectCacherObjectDispatch<I>::compare_and_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-    ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
     int* object_dispatch_flags, uint64_t* journal_tid,
     io::DispatchResult* dispatch_result, Context** on_finish,
index 4f3d96707eccc9ccc5880819d39c4a0921da56bf..fb8be857d9ee5f894eb2cf1e2d7ad65c105872bf 100644 (file)
@@ -42,7 +42,7 @@ public:
   void shut_down(Context* on_finish) override;
 
   bool read(
-      uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const io::Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, io::Extents* extent_map,
       uint64_t* version, int* object_dispatch_flags,
@@ -51,14 +51,14 @@ public:
 
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -67,14 +67,14 @@ public:
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       io::DispatchResult* dispatch_result, Context** on_finish,
index cfa358d05ae31058be029e06b3535d381c0a67ff..4c7f193f7ae308af8c5e84a3a4c949e6ce58c6eb 100644 (file)
@@ -9,6 +9,7 @@
 #include "common/ceph_mutex.h"
 #include "osdc/Striper.h"
 #include "include/Context.h"
+#include "include/neorados/RADOS.hpp"
 #include "include/rados/librados.hpp"
 #include "include/rbd/librbd.hpp"
 
@@ -136,9 +137,15 @@ void ObjectCacherWriteback::read(const object_t& oid, uint64_t object_no,
   auto req_comp = new io::ReadResult::C_ObjectReadRequest(
     aio_comp, off, len, {{0, len}});
 
+  auto io_context = m_ictx->duplicate_data_io_context();
+  if (snapid != CEPH_NOSNAP) {
+    io_context->read_snap(snapid);
+  }
+
   auto req = io::ObjectDispatchSpec::create_read(
-    m_ictx, io::OBJECT_DISPATCH_LAYER_CACHE, object_no, {{off, len}}, snapid,
-    op_flags, trace, &req_comp->bl, &req_comp->extent_map, nullptr, req_comp);
+    m_ictx, io::OBJECT_DISPATCH_LAYER_CACHE, object_no, {{off, len}},
+    io_context, op_flags, trace, &req_comp->bl,
+    &req_comp->extent_map, nullptr, req_comp);
   req->send();
 }
 
@@ -195,9 +202,15 @@ ceph_tid_t ObjectCacherWriteback::write(const object_t& oid,
   Context *ctx = new C_OrderedWrite(m_ictx->cct, result, trace, this);
   ctx = util::create_async_context_callback(*m_ictx, ctx);
 
+  auto io_context = m_ictx->duplicate_data_io_context();
+  if (!snapc.empty()) {
+    io_context->write_snap_context(
+      {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}});
+  }
+
   auto req = io::ObjectDispatchSpec::create_write(
     m_ictx, io::OBJECT_DISPATCH_LAYER_CACHE, object_no, off, std::move(bl_copy),
-    snapc, 0, 0, std::nullopt, journal_tid, trace, ctx);
+    io_context, 0, 0, std::nullopt, journal_tid, trace, ctx);
   req->object_dispatch_flags = (
     io::OBJECT_DISPATCH_FLAG_FLUSH |
     io::OBJECT_DISPATCH_FLAG_WILL_RETRY_ON_ERROR);
index 55754ebe157b4d0a23876aba6f6c2d9e0b865277..78abaa148c86ca2ea640a49df8c3722ea6689549 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "common/errno.h"
+#include "include/neorados/RADOS.hpp"
 #include "librbd/ImageCtx.h"
 #include "librbd/Utils.h"
 #include "librbd/asio/ContextWQ.h"
@@ -64,7 +65,7 @@ void ParentCacheObjectDispatch<I>::init(Context* on_finish) {
 
 template <typename I>
 bool ParentCacheObjectDispatch<I>::read(
-    uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+    uint64_t object_no, const io::Extents &extents, IOContext io_context,
     int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version,
     int* object_dispatch_flags, io::DispatchResult* dispatch_result,
@@ -94,24 +95,26 @@ bool ParentCacheObjectDispatch<I>::read(
 
   CacheGenContextURef ctx = make_gen_lambda_context<ObjectCacheRequest*,
                                      std::function<void(ObjectCacheRequest*)>>
-   ([this, read_data, dispatch_result, on_dispatched, object_no, 
-     object_off = object_off, object_len = object_len, snap_id, &parent_trace]
+   ([this, read_data, dispatch_result, on_dispatched, object_no,
+     object_off = object_off, object_len = object_len, io_context,
+      &parent_trace]
    (ObjectCacheRequest* ack) {
-      handle_read_cache(ack, object_no, object_off, object_len, snap_id,
+      handle_read_cache(ack, object_no, object_off, object_len, io_context,
                         parent_trace, read_data, dispatch_result,
                         on_dispatched);
   });
 
   m_cache_client->lookup_object(m_image_ctx->data_ctx.get_namespace(),
                                 m_image_ctx->data_ctx.get_id(),
-                                (uint64_t)snap_id, oid, std::move(ctx));
+                                io_context->read_snap().value_or(CEPH_NOSNAP),
+                                oid, std::move(ctx));
   return true;
 }
 
 template <typename I>
 void ParentCacheObjectDispatch<I>::handle_read_cache(
      ObjectCacheRequest* ack, uint64_t object_no, uint64_t read_off,
-     uint64_t read_len, librados::snap_t snap_id,
+     uint64_t read_len, IOContext io_context,
      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
      io::DispatchResult* dispatch_result, Context* on_dispatched) {
   auto cct = m_image_ctx->cct;
@@ -137,7 +140,8 @@ void ParentCacheObjectDispatch<I>::handle_read_cache(
         on_dispatched->complete(r);
       });
     m_plugin_api.read_parent(m_image_ctx, object_no, {{read_off, read_len}},
-                             snap_id, parent_trace, read_data, ctx);
+                             io_context->read_snap().value_or(CEPH_NOSNAP),
+                             parent_trace, read_data, ctx);
     return;
   }
 
index ec8966b1ae65c1c7c71a4089b7ba9ee468636ac5..db5df8d0fe192f9de0f8478cbc7564b40c193d83 100644 (file)
@@ -44,7 +44,7 @@ public:
   }
 
   bool read(
-      uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const io::Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, io::Extents* extent_map,
       uint64_t* version, int* object_dispatch_flags,
@@ -52,8 +52,8 @@ public:
       Context* on_dispatched) override;
 
   bool discard(
-      uint64_t object_no, uint64_t object_off, uint64_t object_len, 
-      const ::SnapContext &snapc, int discard_flags,
+      uint64_t object_no, uint64_t object_off, uint64_t object_len,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) {
@@ -62,7 +62,7 @@ public:
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -72,8 +72,8 @@ public:
 
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data, 
-      const ::SnapContext &snapc, int op_flags,
+      io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) {
@@ -81,8 +81,8 @@ public:
   }
 
   bool compare_and_write(
-      uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data, 
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       io::DispatchResult* dispatch_result, Context** on_finish,
@@ -124,7 +124,7 @@ private:
                   uint64_t offset, uint64_t length, Context *on_finish);
   void handle_read_cache(ceph::immutable_obj_cache::ObjectCacheRequest* ack,
                          uint64_t object_no, uint64_t read_off,
-                         uint64_t read_len, librados::snap_t snap_id,
+                         uint64_t read_len, IOContext io_context,
                          const ZTracer::Trace &parent_trace,
                          ceph::bufferlist* read_data,
                          io::DispatchResult* dispatch_result,
index d206cc3f6c9155577cb8c17bae59d99f9d46958e..0992afafbddb8b3d5b6fc1f8754e706cdc3213d2 100644 (file)
@@ -57,7 +57,7 @@ void WriteAroundObjectDispatch<I>::shut_down(Context* on_finish) {
 
 template <typename I>
 bool WriteAroundObjectDispatch<I>::read(
-    uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+    uint64_t object_no, const io::Extents &extents, IOContext io_context,
     int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version,
     int* object_dispatch_flags, io::DispatchResult* dispatch_result,
@@ -70,7 +70,7 @@ bool WriteAroundObjectDispatch<I>::read(
 template <typename I>
 bool WriteAroundObjectDispatch<I>::discard(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    const ::SnapContext &snapc, int discard_flags,
+    IOContext io_context, int discard_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -85,7 +85,7 @@ bool WriteAroundObjectDispatch<I>::discard(
 template <typename I>
 bool WriteAroundObjectDispatch<I>::write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -102,7 +102,7 @@ template <typename I>
 bool WriteAroundObjectDispatch<I>::write_same(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags,
+    IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context**on_finish, Context* on_dispatched) {
@@ -117,7 +117,7 @@ bool WriteAroundObjectDispatch<I>::write_same(
 template <typename I>
 bool WriteAroundObjectDispatch<I>::compare_and_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-    ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
     int* object_dispatch_flags, uint64_t* journal_tid,
     io::DispatchResult* dispatch_result, Context** on_finish,
index e08cdd43574717ace9fe1371a46591f3f6a7167c..a89404b7b63db8d7993695d87416d0b21611c17c 100644 (file)
@@ -42,7 +42,7 @@ public:
   void shut_down(Context* on_finish) override;
 
   bool read(
-      uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const io::Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, io::Extents* extent_map,
       uint64_t* version, int* object_dispatch_flags,
@@ -51,14 +51,14 @@ public:
 
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context**on_finish, Context* on_dispatched) override;
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -67,14 +67,14 @@ public:
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context**on_finish, Context* on_dispatched) override;
 
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       io::DispatchResult* dispatch_result, Context** on_finish,
index 12cc7e899ad6575b0737a835b0a4254836c96fa0..197747628bc0b8fdcf65c8cdb0e9e2f49cbcb9ef 100644 (file)
@@ -37,7 +37,7 @@ struct C_EncryptedObjectReadRequest : public Context {
 
     C_EncryptedObjectReadRequest(
             I* image_ctx, CryptoInterface* crypto, uint64_t object_no,
-            uint64_t object_off, uint64_t object_len, librados::snap_t snap_id,
+            uint64_t object_off, uint64_t object_len, IOContext io_context,
             int op_flags, const ZTracer::Trace &parent_trace,
             ceph::bufferlist* read_data, int* object_dispatch_flags,
             Context** on_finish,
@@ -61,7 +61,7 @@ struct C_EncryptedObjectReadRequest : public Context {
 
       req = io::ObjectDispatchSpec::create_read(
               image_ctx, io::OBJECT_DISPATCH_LAYER_CRYPTO, object_no,
-              {{object_off, object_len}}, snap_id, op_flags, parent_trace,
+              {{object_off, object_len}}, io_context, op_flags, parent_trace,
               &req_comp->bl, &req_comp->extent_map, nullptr, req_comp);
     }
 
@@ -112,7 +112,7 @@ void CryptoObjectDispatch<I>::shut_down(Context* on_finish) {
 template <typename I>
 bool CryptoObjectDispatch<I>::read(
     uint64_t object_no, const io::Extents &extents,
-    librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
+    IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, io::Extents* extent_map, uint64_t* version,
     int* object_dispatch_flags, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -131,7 +131,7 @@ bool CryptoObjectDispatch<I>::read(
 
   *dispatch_result = io::DISPATCH_RESULT_COMPLETE;
   auto req = new C_EncryptedObjectReadRequest<I>(
-          m_image_ctx, m_crypto, object_no, object_off, object_len, snap_id,
+          m_image_ctx, m_crypto, object_no, object_off, object_len, io_context,
           op_flags, parent_trace, read_data, object_dispatch_flags, on_finish,
           on_dispatched);
   req->send();
@@ -141,7 +141,7 @@ bool CryptoObjectDispatch<I>::read(
 template <typename I>
 bool CryptoObjectDispatch<I>::write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -165,7 +165,7 @@ template <typename I>
 bool CryptoObjectDispatch<I>::write_same(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags,
+    IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -189,8 +189,8 @@ bool CryptoObjectDispatch<I>::write_same(
   *dispatch_result = io::DISPATCH_RESULT_COMPLETE;
   auto req = io::ObjectDispatchSpec::create_write(
           m_image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, object_no,
-          object_off, std::move(ws_data), snapc, op_flags, 0, std::nullopt, 0,
-          parent_trace, ctx);
+          object_off, std::move(ws_data), io_context, op_flags, 0, std::nullopt,
+          0, parent_trace, ctx);
   req->send();
   return true;
 }
@@ -198,7 +198,7 @@ bool CryptoObjectDispatch<I>::write_same(
 template <typename I>
 bool CryptoObjectDispatch<I>::compare_and_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-    ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
     int* object_dispatch_flags, uint64_t* journal_tid,
     io::DispatchResult* dispatch_result, Context** on_finish,
@@ -221,7 +221,7 @@ bool CryptoObjectDispatch<I>::compare_and_write(
 template <typename I>
 bool CryptoObjectDispatch<I>::discard(
         uint64_t object_no, uint64_t object_off, uint64_t object_len,
-        const ::SnapContext &snapc, int discard_flags,
+        IOContext io_context, int discard_flags,
         const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
         uint64_t* journal_tid, io::DispatchResult* dispatch_result,
         Context** on_finish, Context* on_dispatched) {
@@ -243,7 +243,7 @@ bool CryptoObjectDispatch<I>::discard(
   *dispatch_result = io::DISPATCH_RESULT_COMPLETE;
   auto req = io::ObjectDispatchSpec::create_write_same(
           m_image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, object_no, object_off,
-          object_len, {{0, buffer_size}}, std::move(bl), snapc,
+          object_len, {{0, buffer_size}}, std::move(bl), io_context,
           *object_dispatch_flags, 0, parent_trace, ctx);
   req->send();
   return true;
index 6b95256f60df87c505b4456ca2e091afd01bc96c..c02961e8fa3fa96ee21f8695e2cee6447aa53617 100644 (file)
@@ -13,7 +13,7 @@ namespace librbd {
 struct ImageCtx;
 
 namespace crypto {
-    
+
 template <typename ImageCtxT = librbd::ImageCtx>
 class CryptoObjectDispatch : public io::ObjectDispatchInterface {
 public:
@@ -33,7 +33,7 @@ public:
 
   bool read(
       uint64_t object_no, const io::Extents &extents,
-      librados::snap_t snap_id, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
       io::Extents* extent_map, uint64_t* version, int* object_dispatch_flags,
       io::DispatchResult* dispatch_result, Context** on_finish,
@@ -41,14 +41,14 @@ public:
 
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -57,14 +57,14 @@ public:
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       io::DispatchResult* dispatch_result, Context** on_finish,
index c98d00dd8ae715d932777bad2a4c5fbefb458901..63a559c65658962422473544704fa70474a8c75b 100644 (file)
@@ -75,9 +75,10 @@ void readahead(I *ictx, const Extents& image_extents) {
   }
 
   uint64_t image_size = ictx->get_image_size(ictx->snap_id);
-  auto snap_id = ictx->snap_id;
   ictx->image_lock.unlock_shared();
 
+  auto io_context = ictx->get_data_io_context();
+
   auto readahead_extent = ictx->readahead.update(image_extents, image_size);
   uint64_t readahead_offset = readahead_extent.first;
   uint64_t readahead_length = readahead_extent.second;
@@ -101,7 +102,7 @@ void readahead(I *ictx, const Extents& image_extents) {
                                              object_extent.length);
       auto req = io::ObjectDispatchSpec::create_read(
         ictx, io::OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
-        {{object_extent.offset, object_extent.length}}, snap_id, 0, {},
+        {{object_extent.offset, object_extent.length}}, io_context, 0, {},
         &req_comp->read_data, &req_comp->extent_map, nullptr, req_comp);
       req->send();
     }
@@ -373,17 +374,9 @@ void ImageReadRequest<I>::send_request() {
     readahead(get_image_ctx(&image_ctx), image_extents);
   }
 
-  librados::snap_t snap_id;
-  uint64_t buffer_ofs = 0;
-  {
-    // prevent image size from changing between computing clip and recording
-    // pending async operation
-    std::shared_lock image_locker{image_ctx.image_lock};
-    snap_id = image_ctx.snap_id;
-  }
-
   // map image extents to object extents
   LightweightObjectExtents object_extents;
+  uint64_t buffer_ofs = 0;
   for (auto &extent : image_extents) {
     if (extent.second == 0) {
       continue;
@@ -394,6 +387,8 @@ void ImageReadRequest<I>::send_request() {
     buffer_ofs += extent.second;
   }
 
+  auto io_context = image_ctx.get_data_io_context();
+
   // issue the requests
   AioCompletion *aio_comp = this->m_aio_comp;
   aio_comp->set_request_count(object_extents.size());
@@ -406,7 +401,7 @@ void ImageReadRequest<I>::send_request() {
       aio_comp, oe.offset, oe.length, std::move(oe.buffer_extents));
     auto req = ObjectDispatchSpec::create_read(
       &image_ctx, OBJECT_DISPATCH_LAYER_NONE, oe.object_no,
-      {{oe.offset, oe.length}}, snap_id, m_op_flags, this->m_trace,
+      {{oe.offset, oe.length}}, io_context, m_op_flags, this->m_trace,
       &req_comp->bl, &req_comp->extent_map, nullptr, req_comp);
     req->send();
   }
@@ -455,14 +450,12 @@ void AbstractImageWriteRequest<I>::send_request() {
 
   bool journaling = false;
 
+  auto io_context = image_ctx.get_data_io_context();
   AioCompletion *aio_comp = this->m_aio_comp;
-  ::SnapContext snapc;
   {
     // prevent image size from changing between computing clip and recording
     // pending async operation
     std::shared_lock image_locker{image_ctx.image_lock};
-
-    snapc = image_ctx.snapc;
     journaling = (image_ctx.journal != nullptr &&
                   image_ctx.journal->is_journal_appending());
   }
@@ -495,7 +488,7 @@ void AbstractImageWriteRequest<I>::send_request() {
       journal_tid = append_journal_event(m_synchronous);
     }
 
-    send_object_requests(object_extents, snapc, journal_tid);
+    send_object_requests(object_extents, io_context, journal_tid);
   }
 
   update_stats(clip_len);
@@ -503,7 +496,7 @@ void AbstractImageWriteRequest<I>::send_request() {
 
 template <typename I>
 void AbstractImageWriteRequest<I>::send_object_requests(
-    const LightweightObjectExtents &object_extents, const ::SnapContext &snapc,
+    const LightweightObjectExtents &object_extents, IOContext io_context,
     uint64_t journal_tid) {
   I &image_ctx = this->m_image_ctx;
   CephContext *cct = image_ctx.cct;
@@ -515,8 +508,8 @@ void AbstractImageWriteRequest<I>::send_object_requests(
                    << oe.offset << "~" << oe.length << " from "
                    << oe.buffer_extents << dendl;
     C_AioRequest *req_comp = new C_AioRequest(aio_comp);
-    auto request = create_object_request(oe, snapc, journal_tid, single_extent,
-                                         req_comp);
+    auto request = create_object_request(oe, io_context, journal_tid,
+                                         single_extent, req_comp);
     request->send();
   }
 }
@@ -565,7 +558,7 @@ void ImageWriteRequest<I>::send_image_cache_request() {
 
 template <typename I>
 ObjectDispatchSpec *ImageWriteRequest<I>::create_object_request(
-    const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+    const LightweightObjectExtent &object_extent, IOContext io_context,
     uint64_t journal_tid, bool single_extent, Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
 
@@ -579,8 +572,8 @@ ObjectDispatchSpec *ImageWriteRequest<I>::create_object_request(
 
   auto req = ObjectDispatchSpec::create_write(
     &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
-    object_extent.offset, std::move(bl), snapc, m_op_flags, 0, std::nullopt,
-    journal_tid, this->m_trace, on_finish);
+    object_extent.offset, std::move(bl), io_context, m_op_flags, 0,
+    std::nullopt, journal_tid, this->m_trace, on_finish);
   return req;
 }
 
@@ -627,12 +620,12 @@ void ImageDiscardRequest<I>::send_image_cache_request() {
 
 template <typename I>
 ObjectDispatchSpec *ImageDiscardRequest<I>::create_object_request(
-    const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+    const LightweightObjectExtent &object_extent, IOContext io_context,
     uint64_t journal_tid, bool single_extent, Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
   auto req = ObjectDispatchSpec::create_discard(
     &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
-    object_extent.offset, object_extent.length, snapc,
+    object_extent.offset, object_extent.length, io_context,
     OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, journal_tid, this->m_trace,
     on_finish);
   return req;
@@ -792,7 +785,7 @@ void ImageWriteSameRequest<I>::send_image_cache_request() {
 
 template <typename I>
 ObjectDispatchSpec *ImageWriteSameRequest<I>::create_object_request(
-    const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+    const LightweightObjectExtent &object_extent, IOContext io_context,
     uint64_t journal_tid, bool single_extent, Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
 
@@ -805,14 +798,14 @@ ObjectDispatchSpec *ImageWriteSameRequest<I>::create_object_request(
     req = ObjectDispatchSpec::create_write_same(
       &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
       object_extent.offset, object_extent.length, std::move(buffer_extents),
-      std::move(bl), snapc, m_op_flags, journal_tid,
+      std::move(bl), io_context, m_op_flags, journal_tid,
       this->m_trace, on_finish);
     return req;
   }
   req = ObjectDispatchSpec::create_write(
     &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
-    object_extent.offset, std::move(bl), snapc, m_op_flags, 0, std::nullopt,
-    journal_tid, this->m_trace, on_finish);
+    object_extent.offset, std::move(bl), io_context, m_op_flags, 0,
+    std::nullopt, journal_tid, this->m_trace, on_finish);
   return req;
 }
 
@@ -867,7 +860,7 @@ void ImageCompareAndWriteRequest<I>::send_image_cache_request() {
 
 template <typename I>
 ObjectDispatchSpec *ImageCompareAndWriteRequest<I>::create_object_request(
-    const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+    const LightweightObjectExtent &object_extent, IOContext io_context,
     uint64_t journal_tid, bool single_extent, Context *on_finish) {
   I &image_ctx = this->m_image_ctx;
 
@@ -877,7 +870,7 @@ ObjectDispatchSpec *ImageCompareAndWriteRequest<I>::create_object_request(
   assemble_extent(object_extent, &bl);
   auto req = ObjectDispatchSpec::create_compare_and_write(
     &image_ctx, OBJECT_DISPATCH_LAYER_NONE, object_extent.object_no,
-    object_extent.offset, std::move(m_cmp_bl), std::move(bl), snapc,
+    object_extent.offset, std::move(m_cmp_bl), std::move(bl), io_context,
     m_mismatch_offset, m_op_flags, journal_tid, this->m_trace, on_finish);
   return req;
 }
index 36ba9624b24064927ec2dfa22436f2dd5fccd2b2..b6460de6568f55ed0bd12f9f73bfceb4d0436082 100644 (file)
@@ -6,10 +6,10 @@
 
 #include "include/int_types.h"
 #include "include/buffer_fwd.h"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
 #include "osd/osd_types.h"
 #include "librbd/Utils.h"
+#include "librbd/Types.h"
 #include "librbd/io/Types.h"
 #include <list>
 #include <utility>
@@ -151,9 +151,9 @@ protected:
   }
 
   void send_object_requests(const LightweightObjectExtents &object_extents,
-                            const ::SnapContext &snapc, uint64_t journal_tid);
+                            IOContext io_context, uint64_t journal_tid);
   virtual ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) = 0;
 
   virtual uint64_t append_journal_event(bool synchronous) = 0;
@@ -193,7 +193,7 @@ protected:
 
 
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -229,7 +229,7 @@ protected:
   void send_image_cache_request() override;
 
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -300,7 +300,7 @@ protected:
   void send_image_cache_request() override;
 
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
@@ -332,7 +332,7 @@ protected:
                        bufferlist *bl);
 
   ObjectDispatchSpec *create_object_request(
-      const LightweightObjectExtent &object_extent, const ::SnapContext &snapc,
+      const LightweightObjectExtent &object_extent, IOContext io_context,
       uint64_t journal_tid, bool single_extent, Context *on_finish) override;
 
   uint64_t append_journal_event(bool synchronous) override;
index 1823be38222cf1c9e2ef1138a2b77bf701a23c12..9413a132a7b5be7de331ae0125d4dd12186e3237 100644 (file)
@@ -33,7 +33,7 @@ void ObjectDispatch<I>::shut_down(Context* on_finish) {
 
 template <typename I>
 bool ObjectDispatch<I>::read(
-    uint64_t object_no, const Extents &extents, librados::snap_t snap_id,
+    uint64_t object_no, const Extents &extents, IOContext io_context,
     int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
     int* object_dispatch_flags, DispatchResult* dispatch_result,
@@ -42,9 +42,10 @@ bool ObjectDispatch<I>::read(
   ldout(cct, 20) << "object_no=" << object_no << " " << extents << dendl;
 
   *dispatch_result = DISPATCH_RESULT_COMPLETE;
-  auto req = new ObjectReadRequest<I>(m_image_ctx, object_no, extents, snap_id,
-                                      op_flags, parent_trace, read_data,
-                                      extent_map, version, on_dispatched);
+  auto req = new ObjectReadRequest<I>(m_image_ctx, object_no, extents,
+                                     io_context,  op_flags, parent_trace,
+                                     read_data, extent_map, version,
+                                     on_dispatched);
   req->send();
   return true;
 }
@@ -52,7 +53,7 @@ bool ObjectDispatch<I>::read(
 template <typename I>
 bool ObjectDispatch<I>::discard(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    const ::SnapContext &snapc, int discard_flags,
+    IOContext io_context, int discard_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -62,7 +63,7 @@ bool ObjectDispatch<I>::discard(
 
   *dispatch_result = DISPATCH_RESULT_COMPLETE;
   auto req = new ObjectDiscardRequest<I>(m_image_ctx, object_no, object_off,
-                                         object_len, snapc, discard_flags,
+                                         object_len, io_context, discard_flags,
                                          parent_trace, on_dispatched);
   req->send();
   return true;
@@ -71,7 +72,7 @@ bool ObjectDispatch<I>::discard(
 template <typename I>
 bool ObjectDispatch<I>::write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, DispatchResult* dispatch_result,
@@ -82,7 +83,7 @@ bool ObjectDispatch<I>::write(
 
   *dispatch_result = DISPATCH_RESULT_COMPLETE;
   auto req = new ObjectWriteRequest<I>(m_image_ctx, object_no, object_off,
-                                       std::move(data), snapc, op_flags,
+                                       std::move(data), io_context, op_flags,
                                        write_flags, assert_version,
                                        parent_trace, on_dispatched);
   req->send();
@@ -93,7 +94,7 @@ template <typename I>
 bool ObjectDispatch<I>::write_same(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags,
+    IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -104,8 +105,9 @@ bool ObjectDispatch<I>::write_same(
   *dispatch_result = DISPATCH_RESULT_COMPLETE;
   auto req = new ObjectWriteSameRequest<I>(m_image_ctx, object_no,
                                            object_off, object_len,
-                                           std::move(data), snapc, op_flags,
-                                           parent_trace, on_dispatched);
+                                           std::move(data), io_context,
+                                           op_flags, parent_trace,
+                                           on_dispatched);
   req->send();
   return true;
 }
@@ -113,7 +115,7 @@ bool ObjectDispatch<I>::write_same(
 template <typename I>
 bool ObjectDispatch<I>::compare_and_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-    ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
     int* object_dispatch_flags, uint64_t* journal_tid,
     DispatchResult* dispatch_result, Context** on_finish,
@@ -126,9 +128,10 @@ bool ObjectDispatch<I>::compare_and_write(
   auto req = new ObjectCompareAndWriteRequest<I>(m_image_ctx, object_no,
                                                  object_off,
                                                  std::move(cmp_data),
-                                                 std::move(write_data), snapc,
-                                                 mismatch_offset, op_flags,
-                                                 parent_trace, on_dispatched);
+                                                 std::move(write_data),
+                                                 io_context, mismatch_offset,
+                                                 op_flags, parent_trace,
+                                                 on_dispatched);
   req->send();
   return true;
 }
index f06271f26dc571070170ec52aca87f5d0d443127..5118e7bb9c3e0a5d2e356fdea632df2dbba04c2d 100644 (file)
@@ -7,7 +7,6 @@
 #include "include/int_types.h"
 #include "include/buffer.h"
 #include "include/rados/librados.hpp"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
 #include "librbd/io/Types.h"
 #include "librbd/io/ObjectDispatchInterface.h"
@@ -34,7 +33,7 @@ public:
   void shut_down(Context* on_finish) override;
 
   bool read(
-      uint64_t object_no, const Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, Extents* extent_map,
       uint64_t* version, int* object_dispatch_flags,
@@ -43,14 +42,14 @@ public:
 
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
@@ -59,14 +58,14 @@ public:
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       DispatchResult* dispatch_result, Context** on_finish,
index 5774787ebdeebdc7a056a73dc0a6ca9a533552d9..492406d3bf8ce9bd776ddbd3710e29b326fe5027 100644 (file)
@@ -7,8 +7,8 @@
 #include "include/int_types.h"
 #include "include/buffer.h"
 #include "include/rados/librados.hpp"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
+#include "librbd/Types.h"
 #include "librbd/io/Types.h"
 
 struct Context;
@@ -35,21 +35,21 @@ struct ObjectDispatchInterface {
 
   virtual bool read(
       uint64_t object_no, const Extents &extents,
-      librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
+      IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
       int* object_dispatch_flags, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) = 0;
 
   virtual bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context**on_finish, Context* on_dispatched) = 0;
 
   virtual bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
@@ -58,14 +58,14 @@ struct ObjectDispatchInterface {
   virtual bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
-      const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
-      uint64_t* journal_tid, DispatchResult* dispatch_result,
-      Context**on_finish, Context* on_dispatched) = 0;
+      IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
+      int* object_dispatch_flags, uint64_t* journal_tid,
+      DispatchResult* dispatch_result, Context**on_finish,
+      Context* on_dispatched) = 0;
 
   virtual bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       DispatchResult* dispatch_result, Context** on_finish,
index e4fa32b42e2719a30016b515cb32052b0eb98bd1..50e3e204950f8c87df94ade4b0930ecf068d6901 100644 (file)
@@ -8,8 +8,8 @@
 #include "include/buffer.h"
 #include "include/Context.h"
 #include "include/rados/librados.hpp"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
+#include "librbd/Types.h"
 #include "librbd/io/Types.h"
 #include <boost/variant/variant.hpp>
 
@@ -44,27 +44,25 @@ public:
 
   struct ReadRequest : public RequestBase {
     const Extents extents;
-    librados::snap_t snap_id;
     ceph::bufferlist* read_data;
     Extents* extent_map;
     uint64_t* version;
 
     ReadRequest(uint64_t object_no, const Extents &extents,
-                librados::snap_t snap_id, ceph::bufferlist* read_data,
-                Extents* extent_map, uint64_t* version)
-      : RequestBase(object_no), extents(extents), snap_id(snap_id),
-        read_data(read_data), extent_map(extent_map), version(version) {
+                ceph::bufferlist* read_data, Extents* extent_map,
+                uint64_t* version)
+      : RequestBase(object_no), extents(extents), read_data(read_data),
+        extent_map(extent_map), version(version) {
     }
   };
 
   struct WriteRequestBase : public RequestBase {
     uint64_t object_off;
-    ::SnapContext snapc;
     uint64_t journal_tid;
 
     WriteRequestBase(uint64_t object_no, uint64_t object_off,
-                     const ::SnapContext& snapc, uint64_t journal_tid)
-      : RequestBase(object_no), object_off(object_off), snapc(snapc),
+                     uint64_t journal_tid)
+      : RequestBase(object_no), object_off(object_off),
         journal_tid(journal_tid) {
     }
   };
@@ -74,9 +72,8 @@ public:
     int discard_flags;
 
     DiscardRequest(uint64_t object_no, uint64_t object_off, uint64_t object_len,
-                   int discard_flags, const ::SnapContext& snapc,
-                   uint64_t journal_tid)
-      : WriteRequestBase(object_no, object_off, snapc, journal_tid),
+                   int discard_flags, uint64_t journal_tid)
+      : WriteRequestBase(object_no, object_off, journal_tid),
         object_len(object_len), discard_flags(discard_flags) {
     }
   };
@@ -87,10 +84,9 @@ public:
     std::optional<uint64_t> assert_version;
 
     WriteRequest(uint64_t object_no, uint64_t object_off,
-                 ceph::bufferlist&& data, const ::SnapContext& snapc,
-                 int write_flags, std::optional<uint64_t> assert_version,
-                 uint64_t journal_tid)
-      : WriteRequestBase(object_no, object_off, snapc, journal_tid),
+                 ceph::bufferlist&& data, int write_flags,
+                 std::optional<uint64_t> assert_version, uint64_t journal_tid)
+      : WriteRequestBase(object_no, object_off, journal_tid),
         data(std::move(data)), write_flags(write_flags),
         assert_version(assert_version) {
     }
@@ -104,9 +100,8 @@ public:
     WriteSameRequest(uint64_t object_no, uint64_t object_off,
                      uint64_t object_len,
                      LightweightBufferExtents&& buffer_extents,
-                     ceph::bufferlist&& data, const ::SnapContext& snapc,
-                     uint64_t journal_tid)
-    : WriteRequestBase(object_no, object_off, snapc, journal_tid),
+                     ceph::bufferlist&& data, uint64_t journal_tid)
+    : WriteRequestBase(object_no, object_off, journal_tid),
       object_len(object_len), buffer_extents(std::move(buffer_extents)),
       data(std::move(data)) {
     }
@@ -120,8 +115,8 @@ public:
     CompareAndWriteRequest(uint64_t object_no, uint64_t object_off,
                            ceph::bufferlist&& cmp_data, ceph::bufferlist&& data,
                            uint64_t* mismatch_offset,
-                           const ::SnapContext& snapc, uint64_t journal_tid)
-      : WriteRequestBase(object_no, object_off, snapc, journal_tid),
+                           uint64_t journal_tid)
+      : WriteRequestBase(object_no, object_off, journal_tid),
         cmp_data(std::move(cmp_data)), data(std::move(data)),
         mismatch_offset(mismatch_offset) {
     }
@@ -151,51 +146,53 @@ public:
   DispatchResult dispatch_result = DISPATCH_RESULT_INVALID;
 
   Request request;
+  IOContext io_context;
   int op_flags;
   ZTracer::Trace parent_trace;
 
   template <typename ImageCtxT>
   static ObjectDispatchSpec* create_read(
       ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
-      uint64_t object_no, const Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
       Context* on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
-                                  ReadRequest{object_no, extents, snap_id,
+                                  ReadRequest{object_no, extents,
                                               read_data, extent_map, version},
-                                  op_flags, parent_trace, on_finish);
+                                  io_context, op_flags, parent_trace,
+                                  on_finish);
   }
 
   template <typename ImageCtxT>
   static ObjectDispatchSpec* create_discard(
       ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags, uint64_t journal_tid,
+      IOContext io_context, int discard_flags, uint64_t journal_tid,
       const ZTracer::Trace &parent_trace, Context *on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
                                   DiscardRequest{object_no, object_off,
                                                  object_len, discard_flags,
-                                                 snapc, journal_tid},
-                                  0, parent_trace, on_finish);
+                                                 journal_tid},
+                                  io_context, 0, parent_trace, on_finish);
   }
 
   template <typename ImageCtxT>
   static ObjectDispatchSpec* create_write(
       ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version, uint64_t journal_tid,
       const ZTracer::Trace &parent_trace, Context *on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
                                   WriteRequest{object_no, object_off,
-                                               std::move(data), snapc,
-                                               write_flags, assert_version,
-                                               journal_tid},
-                                  op_flags, parent_trace, on_finish);
+                                               std::move(data), write_flags,
+                                               assert_version, journal_tid},
+                                  io_context, op_flags, parent_trace,
+                                  on_finish);
   }
 
   template <typename ImageCtxT>
@@ -203,23 +200,24 @@ public:
       ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, uint64_t journal_tid,
+      IOContext io_context, int op_flags, uint64_t journal_tid,
       const ZTracer::Trace &parent_trace, Context *on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
                                   WriteSameRequest{object_no, object_off,
                                                    object_len,
                                                    std::move(buffer_extents),
-                                                   std::move(data), snapc,
+                                                   std::move(data),
                                                    journal_tid},
-                                  op_flags, parent_trace, on_finish);
+                                  io_context, op_flags, parent_trace,
+                                  on_finish);
   }
 
   template <typename ImageCtxT>
   static ObjectDispatchSpec* create_compare_and_write(
       ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc,
+      ceph::bufferlist&& write_data, IOContext io_context,
       uint64_t *mismatch_offset, int op_flags, uint64_t journal_tid,
       const ZTracer::Trace &parent_trace, Context *on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
@@ -229,8 +227,9 @@ public:
                                                          std::move(cmp_data),
                                                          std::move(write_data),
                                                          mismatch_offset,
-                                                         snapc, journal_tid},
-                                  op_flags, parent_trace, on_finish);
+                                                         journal_tid},
+                                  io_context, op_flags, parent_trace,
+                                  on_finish);
   }
 
   template <typename ImageCtxT>
@@ -240,8 +239,8 @@ public:
       const ZTracer::Trace &parent_trace, Context *on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
-                                  FlushRequest{flush_source, journal_tid}, 0,
-                                  parent_trace, on_finish);
+                                  FlushRequest{flush_source, journal_tid},
+                                  {}, 0, parent_trace, on_finish);
   }
 
   void send();
@@ -252,11 +251,11 @@ private:
 
   ObjectDispatchSpec(ObjectDispatcherInterface* object_dispatcher,
                      ObjectDispatchLayer object_dispatch_layer,
-                     Request&& request, int op_flags,
+                     Request&& request, IOContext io_context, int op_flags,
                      const ZTracer::Trace& parent_trace, Context* on_finish)
     : dispatcher_ctx(this, on_finish), object_dispatcher(object_dispatcher),
       dispatch_layer(object_dispatch_layer), request(std::move(request)),
-      op_flags(op_flags), parent_trace(parent_trace) {
+      io_context(io_context), op_flags(op_flags), parent_trace(parent_trace) {
   }
 
 };
index 6e0ee89673b10c27a734a210d3ffe7631d390ae1..58aa989479174539634331cab1443c9cbc66fb08 100644 (file)
@@ -107,7 +107,7 @@ struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
 
   bool operator()(ObjectDispatchSpec::ReadRequest& read) const {
     return object_dispatch->read(
-      read.object_no, read.extents, read.snap_id,
+      read.object_no, read.extents, object_dispatch_spec->io_context,
       object_dispatch_spec->op_flags, object_dispatch_spec->parent_trace,
       read.read_data, read.extent_map, read.version,
       &object_dispatch_spec->object_dispatch_flags,
@@ -118,8 +118,9 @@ struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
 
   bool operator()(ObjectDispatchSpec::DiscardRequest& discard) const {
     return object_dispatch->discard(
-      discard.object_no, discard.object_off, discard.object_len, discard.snapc,
-      discard.discard_flags, object_dispatch_spec->parent_trace,
+      discard.object_no, discard.object_off, discard.object_len,
+      object_dispatch_spec->io_context, discard.discard_flags,
+      object_dispatch_spec->parent_trace,
       &object_dispatch_spec->object_dispatch_flags, &discard.journal_tid,
       &object_dispatch_spec->dispatch_result,
       &object_dispatch_spec->dispatcher_ctx.on_finish,
@@ -128,8 +129,9 @@ struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
 
   bool operator()(ObjectDispatchSpec::WriteRequest& write) const {
     return object_dispatch->write(
-      write.object_no, write.object_off, std::move(write.data), write.snapc,
-      object_dispatch_spec->op_flags, write.write_flags, write.assert_version,
+      write.object_no, write.object_off, std::move(write.data),
+      object_dispatch_spec->io_context, object_dispatch_spec->op_flags,
+      write.write_flags, write.assert_version,
       object_dispatch_spec->parent_trace,
       &object_dispatch_spec->object_dispatch_flags, &write.journal_tid,
       &object_dispatch_spec->dispatch_result,
@@ -141,7 +143,7 @@ struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
     return object_dispatch->write_same(
       write_same.object_no, write_same.object_off, write_same.object_len,
       std::move(write_same.buffer_extents), std::move(write_same.data),
-      write_same.snapc, object_dispatch_spec->op_flags,
+      object_dispatch_spec->io_context, object_dispatch_spec->op_flags,
       object_dispatch_spec->parent_trace,
       &object_dispatch_spec->object_dispatch_flags, &write_same.journal_tid,
       &object_dispatch_spec->dispatch_result,
@@ -154,7 +156,7 @@ struct ObjectDispatcher<I>::SendVisitor : public boost::static_visitor<bool> {
     return object_dispatch->compare_and_write(
       compare_and_write.object_no, compare_and_write.object_off,
       std::move(compare_and_write.cmp_data), std::move(compare_and_write.data),
-      compare_and_write.snapc, object_dispatch_spec->op_flags,
+      object_dispatch_spec->io_context, object_dispatch_spec->op_flags,
       object_dispatch_spec->parent_trace, compare_and_write.mismatch_offset,
       &object_dispatch_spec->object_dispatch_flags,
       &compare_and_write.journal_tid,
index 60b05ea6115fe707ac9d9c02a3c435eb4853ce3c..d24997b198c502f39e3e5c6e71255c30e0b26c5b 100644 (file)
@@ -40,10 +40,10 @@ using librbd::util::create_trace;
 namespace {
 
 template <typename I>
-inline bool is_copy_on_read(I *ictx, librados::snap_t snap_id) {
+inline bool is_copy_on_read(I *ictx, const IOContext& io_context) {
   std::shared_lock image_locker{ictx->image_lock};
-  return (ictx->clone_copy_on_read &&
-          !ictx->read_only && snap_id == CEPH_NOSNAP &&
+  return (ictx->clone_copy_on_read && !ictx->read_only &&
+          io_context->read_snap().value_or(CEPH_NOSNAP) == CEPH_NOSNAP &&
           (ictx->exclusive_lock == nullptr ||
            ictx->exclusive_lock->is_lock_owner()));
 }
@@ -54,11 +54,11 @@ template <typename I>
 ObjectRequest<I>*
 ObjectRequest<I>::create_write(
     I *ictx, uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, Context *completion) {
   return new ObjectWriteRequest<I>(ictx, object_no, object_off,
-                                   std::move(data), snapc, op_flags,
+                                   std::move(data), io_context, op_flags,
                                    write_flags, assert_version,
                                    parent_trace, completion);
 }
@@ -67,10 +67,10 @@ template <typename I>
 ObjectRequest<I>*
 ObjectRequest<I>::create_discard(
     I *ictx, uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    const ::SnapContext &snapc, int discard_flags,
+    IOContext io_context, int discard_flags,
     const ZTracer::Trace &parent_trace, Context *completion) {
   return new ObjectDiscardRequest<I>(ictx, object_no, object_off,
-                                     object_len, snapc, discard_flags,
+                                     object_len, io_context, discard_flags,
                                      parent_trace, completion);
 }
 
@@ -78,10 +78,10 @@ template <typename I>
 ObjectRequest<I>*
 ObjectRequest<I>::create_write_same(
     I *ictx, uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, Context *completion) {
   return new ObjectWriteSameRequest<I>(ictx, object_no, object_off,
-                                       object_len, std::move(data), snapc,
+                                       object_len, std::move(data), io_context,
                                        op_flags, parent_trace, completion);
 }
 
@@ -90,20 +90,20 @@ ObjectRequest<I>*
 ObjectRequest<I>::create_compare_and_write(
     I *ictx, uint64_t object_no, uint64_t object_off,
     ceph::bufferlist&& cmp_data, ceph::bufferlist&& write_data,
-    const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags,
+    IOContext io_context, uint64_t *mismatch_offset, int op_flags,
     const ZTracer::Trace &parent_trace, Context *completion) {
   return new ObjectCompareAndWriteRequest<I>(ictx, object_no, object_off,
                                              std::move(cmp_data),
-                                             std::move(write_data), snapc,
+                                             std::move(write_data), io_context,
                                              mismatch_offset, op_flags,
                                              parent_trace, completion);
 }
 
 template <typename I>
 ObjectRequest<I>::ObjectRequest(
-    I *ictx, uint64_t objectno, librados::snap_t snap_id,
+    I *ictx, uint64_t objectno, IOContext io_context,
     const char *trace_name, const ZTracer::Trace &trace, Context *completion)
-  : m_ictx(ictx), m_object_no(objectno), m_snap_id(snap_id),
+  : m_ictx(ictx), m_object_no(objectno), m_io_context(io_context),
     m_completion(completion),
     m_trace(create_trace(*ictx, "", trace)) {
   ceph_assert(m_ictx->data_ctx.is_valid());
@@ -136,7 +136,8 @@ bool ObjectRequest<I>::compute_parent_extents(Extents *parent_extents,
   parent_extents->clear();
 
   uint64_t parent_overlap;
-  int r = m_ictx->get_parent_overlap(m_snap_id, &parent_overlap);
+  int r = m_ictx->get_parent_overlap(
+    m_io_context->read_snap().value_or(CEPH_NOSNAP), &parent_overlap);
   if (r < 0) {
     // NOTE: it's possible for a snapshot to be deleted while we are
     // still reading from it
@@ -184,11 +185,11 @@ void ObjectRequest<I>::finish(int r) {
 template <typename I>
 ObjectReadRequest<I>::ObjectReadRequest(
     I *ictx, uint64_t objectno, const Extents &extents,
-    librados::snap_t snap_id, int op_flags, const ZTracer::Trace &parent_trace,
+    IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
     Context *completion)
-  : ObjectRequest<I>(ictx, objectno, snap_id, "read",
-                     parent_trace, completion),
+  : ObjectRequest<I>(ictx, objectno, io_context, "read", parent_trace,
+                     completion),
     m_extents(extents), m_op_flags(op_flags), m_read_data(read_data),
     m_extent_map(extent_map), m_version(version) {
 }
@@ -204,14 +205,16 @@ void ObjectReadRequest<I>::send() {
 template <typename I>
 void ObjectReadRequest<I>::read_object() {
   I *image_ctx = this->m_ictx;
-  {
-    std::shared_lock image_locker{image_ctx->image_lock};
-    if (image_ctx->object_map != nullptr &&
-        !image_ctx->object_map->object_may_exist(this->m_object_no)) {
-      image_ctx->asio_engine->post([this]() { read_parent(); });
-      return;
-    }
+
+  std::shared_lock image_locker{image_ctx->image_lock};
+  auto read_snap_id = this->m_io_context->read_snap().value_or(CEPH_NOSNAP);
+  if (read_snap_id == image_ctx->snap_id &&
+      image_ctx->object_map != nullptr &&
+      !image_ctx->object_map->object_may_exist(this->m_object_no)) {
+    image_ctx->asio_engine->post([this]() { read_parent(); });
+    return;
   }
+  image_locker.unlock();
 
   ldout(image_ctx->cct, 20) << dendl;
 
@@ -227,12 +230,12 @@ void ObjectReadRequest<I>::read_object() {
       read_op.read(object_off, object_len, &(extent_result.first));
     }
   }
-  util::apply_op_flags(m_op_flags, image_ctx->get_read_flags(this->m_snap_id),
-                       &read_op);
+  util::apply_op_flags(
+    m_op_flags, image_ctx->get_read_flags(read_snap_id), &read_op);
 
   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,
+    *this->m_io_context, std::move(read_op), nullptr,
     librbd::asio::util::get_callback_adapter(
       [this](int r) { handle_read_object(r); }), m_version,
       (this->m_trace.valid() ? this->m_trace.get_info() : nullptr));
@@ -286,8 +289,10 @@ void ObjectReadRequest<I>::read_parent() {
   auto ctx = create_context_callback<
     ObjectReadRequest<I>, &ObjectReadRequest<I>::handle_read_parent>(this);
 
-  io::util::read_parent<I>(image_ctx, this->m_object_no, this->m_extents,
-                           this->m_snap_id, this->m_trace, m_read_data, ctx);
+  io::util::read_parent<I>(
+    image_ctx, this->m_object_no, this->m_extents,
+    this->m_io_context->read_snap().value_or(CEPH_NOSNAP), this->m_trace,
+    m_read_data, ctx);
 }
 
 template <typename I>
@@ -316,7 +321,7 @@ void ObjectReadRequest<I>::handle_read_parent(int r) {
 template <typename I>
 void ObjectReadRequest<I>::copyup() {
   I *image_ctx = this->m_ictx;
-  if (!is_copy_on_read(image_ctx, this->m_snap_id)) {
+  if (!is_copy_on_read(image_ctx, this->m_io_context)) {
     this->finish(0);
     return;
   }
@@ -360,14 +365,12 @@ void ObjectReadRequest<I>::copyup() {
 template <typename I>
 AbstractObjectWriteRequest<I>::AbstractObjectWriteRequest(
     I *ictx, uint64_t object_no, uint64_t object_off, uint64_t len,
-    const ::SnapContext &snapc, const char *trace_name,
+    IOContext io_context, const char *trace_name,
     const ZTracer::Trace &parent_trace, Context *completion)
-  : ObjectRequest<I>(ictx, object_no, CEPH_NOSNAP, trace_name, parent_trace,
+  : ObjectRequest<I>(ictx, object_no, io_context, trace_name, parent_trace,
                      completion),
-    m_object_off(object_off), m_object_len(len), m_snap_seq(snapc.seq.val)
+    m_object_off(object_off), m_object_len(len)
 {
-  m_snaps.insert(m_snaps.end(), snapc.snaps.begin(), snapc.snaps.end());
-
   if (this->m_object_off == 0 &&
       this->m_object_len == ictx->get_object_size()) {
     m_full_object = true;
@@ -390,7 +393,9 @@ void AbstractObjectWriteRequest<I>::compute_parent_info() {
   this->compute_parent_extents(&m_parent_extents, false);
 
   if (!this->has_parent() ||
-      (m_full_object && m_snaps.empty() && !is_post_copyup_write_required())) {
+      (m_full_object &&
+       !this->m_io_context->write_snap_context() &&
+       !is_post_copyup_write_required())) {
     m_copyup_enabled = false;
   }
 }
@@ -492,7 +497,10 @@ void AbstractObjectWriteRequest<I>::write_object() {
     ldout(image_ctx->cct, 20) << "guarding write" << dendl;
     if (m_guarding_migration_write) {
       cls_client::assert_snapc_seq(
-        &write_op, m_snap_seq, cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ);
+        &write_op,
+        (this->m_io_context->write_snap_context() ?
+          this->m_io_context->write_snap_context()->first : 0),
+        cls::rbd::ASSERT_SNAPC_SEQ_LE_SNAPSET_SEQ);
     } else {
       write_op.assert_exists();
     }
@@ -504,7 +512,7 @@ void AbstractObjectWriteRequest<I>::write_object() {
 
   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),
+    *this->m_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));
index 2750da98cd860839ebe90155c5d7e77bbd99a16f..2c7d410c64d59f890320a8f16fb4c45c0084508c 100644 (file)
@@ -7,9 +7,9 @@
 #include "include/int_types.h"
 #include "include/buffer.h"
 #include "include/rados/librados.hpp"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
 #include "librbd/ObjectMap.h"
+#include "librbd/Types.h"
 #include "librbd/io/Types.h"
 #include <map>
 
@@ -37,24 +37,24 @@ class ObjectRequest {
 public:
   static ObjectRequest* create_write(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
-      ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& data, IOContext io_context, int op_flags,
       int write_flags, std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, Context *completion);
   static ObjectRequest* create_discard(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
-      uint64_t object_len, const ::SnapContext &snapc, int discard_flags,
+      uint64_t object_len, IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, Context *completion);
   static ObjectRequest* create_write_same(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
-      uint64_t object_len, ceph::bufferlist&& data, const ::SnapContext &snapc,
+      uint64_t object_len, ceph::bufferlist&& data, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace, Context *completion);
   static ObjectRequest* create_compare_and_write(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
       ceph::bufferlist&& cmp_data, ceph::bufferlist&& write_data,
-      const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags,
+      IOContext io_context, uint64_t *mismatch_offset, int op_flags,
       const ZTracer::Trace &parent_trace, Context *completion);
 
-  ObjectRequest(ImageCtxT *ictx, uint64_t objectno, librados::snap_t snap_id,
+  ObjectRequest(ImageCtxT *ictx, uint64_t objectno, IOContext io_context,
                 const char *trace_name, const ZTracer::Trace &parent_trace,
                 Context *completion);
   virtual ~ObjectRequest() {
@@ -77,7 +77,7 @@ protected:
 
   ImageCtxT *m_ictx;
   uint64_t m_object_no;
-  librados::snap_t m_snap_id;
+  IOContext m_io_context;
   Context *m_completion;
   ZTracer::Trace m_trace;
 
@@ -93,19 +93,19 @@ class ObjectReadRequest : public ObjectRequest<ImageCtxT> {
 public:
   static ObjectReadRequest* create(
       ImageCtxT *ictx, uint64_t objectno, const Extents &extents,
-      librados::snap_t snap_id, int op_flags,
-      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      Extents* extent_map, uint64_t* version, Context *completion) {
-    return new ObjectReadRequest(ictx, objectno, extents, snap_id, op_flags,
+      IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
+      ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
+      Context *completion) {
+    return new ObjectReadRequest(ictx, objectno, extents, io_context, op_flags,
                                  parent_trace, read_data, extent_map, version,
                                  completion);
   }
 
   ObjectReadRequest(
       ImageCtxT *ictx, uint64_t objectno, const Extents &extents,
-      librados::snap_t snap_id, int op_flags,
-      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      Extents* extent_map, uint64_t* version, Context *completion);
+      IOContext io_context, int op_flags, const ZTracer::Trace &parent_trace,
+      ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
+      Context *completion);
 
   void send() override;
 
@@ -160,7 +160,7 @@ class AbstractObjectWriteRequest : public ObjectRequest<ImageCtxT> {
 public:
   AbstractObjectWriteRequest(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off, uint64_t len,
-      const ::SnapContext &snapc, const char *trace_name,
+      IOContext io_context, const char *trace_name,
       const ZTracer::Trace &parent_trace, Context *completion);
 
   virtual bool is_empty_write_op() const {
@@ -237,9 +237,6 @@ private:
    * @endverbatim
    */
 
-  uint64_t m_snap_seq;
-  std::vector<librados::snap_t> m_snaps;
-
   Extents m_parent_extents;
   bool m_object_may_exist = false;
   bool m_copyup_in_progress = false;
@@ -265,11 +262,11 @@ class ObjectWriteRequest : public AbstractObjectWriteRequest<ImageCtxT> {
 public:
   ObjectWriteRequest(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
-      ceph::bufferlist&& data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& data, IOContext io_context, int op_flags,
       int write_flags, std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, Context *completion)
     : AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
-                                            data.length(), snapc, "write",
+                                            data.length(), io_context, "write",
                                             parent_trace, completion),
       m_write_data(std::move(data)), m_op_flags(op_flags),
       m_write_flags(write_flags), m_assert_version(assert_version) {
@@ -298,10 +295,10 @@ class ObjectDiscardRequest : public AbstractObjectWriteRequest<ImageCtxT> {
 public:
   ObjectDiscardRequest(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
-      uint64_t object_len, const ::SnapContext &snapc, int discard_flags,
+      uint64_t object_len, IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, Context *completion)
     : AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
-                                            object_len, snapc, "discard",
+                                            object_len, io_context, "discard",
                                             parent_trace, completion),
       m_discard_flags(discard_flags) {
     if (this->m_full_object) {
@@ -382,10 +379,10 @@ class ObjectWriteSameRequest : public AbstractObjectWriteRequest<ImageCtxT> {
 public:
   ObjectWriteSameRequest(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
-      uint64_t object_len, ceph::bufferlist&& data, const ::SnapContext &snapc,
+      uint64_t object_len, ceph::bufferlist&& data, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace, Context *completion)
     : AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
-                                            object_len, snapc, "writesame",
+                                            object_len, io_context, "writesame",
                                             parent_trace, completion),
       m_write_data(std::move(data)), m_op_flags(op_flags) {
   }
@@ -408,10 +405,10 @@ public:
   ObjectCompareAndWriteRequest(
       ImageCtxT *ictx, uint64_t object_no, uint64_t object_off,
       ceph::bufferlist&& cmp_bl, ceph::bufferlist&& write_bl,
-      const ::SnapContext &snapc, uint64_t *mismatch_offset, int op_flags,
+      IOContext io_context, uint64_t *mismatch_offset, int op_flags,
       const ZTracer::Trace &parent_trace, Context *completion)
    : AbstractObjectWriteRequest<ImageCtxT>(ictx, object_no, object_off,
-                                           cmp_bl.length(), snapc,
+                                           cmp_bl.length(), io_context,
                                            "compare_and_write", parent_trace,
                                            completion),
     m_cmp_bl(std::move(cmp_bl)), m_write_bl(std::move(write_bl)),
index 1f50da8c29bf004195813940dac2a9e7e443fa2b..03fd4139f2bf92b2c8a4f30e7aa97d9548bb6c52 100644 (file)
@@ -2,6 +2,7 @@
 // vim: ts=8 sw=2 smarttab
 
 #include "librbd/io/SimpleSchedulerObjectDispatch.h"
+#include "include/neorados/RADOS.hpp"
 #include "common/Timer.h"
 #include "common/errno.h"
 #include "librbd/AsioEngine.h"
@@ -59,15 +60,16 @@ public:
 
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::ObjectRequests::try_delay_request(
-    uint64_t object_off, ceph::bufferlist&& data, const ::SnapContext &snapc,
+    uint64_t object_off, ceph::bufferlist&& data, IOContext io_context,
     int op_flags, int object_dispatch_flags, Context* on_dispatched) {
   if (!m_delayed_requests.empty()) {
-    if (snapc.seq != m_snapc.seq || op_flags != m_op_flags ||
-        data.length() == 0 || intersects(object_off, data.length())) {
+    if (!m_io_context || *m_io_context != *io_context ||
+        op_flags != m_op_flags || data.length() == 0 ||
+        intersects(object_off, data.length())) {
       return false;
     }
   } else {
-    m_snapc = snapc;
+    m_io_context = io_context;
     m_op_flags = op_flags;
   }
 
@@ -161,7 +163,7 @@ void SimpleSchedulerObjectDispatch<I>::ObjectRequests::dispatch_delayed_requests
 
     auto req = ObjectDispatchSpec::create_write(
         image_ctx, OBJECT_DISPATCH_LAYER_SCHEDULER,
-        m_object_no, offset, std::move(merged_requests.data), m_snapc,
+        m_object_no, offset, std::move(merged_requests.data), m_io_context,
         m_op_flags, 0, std::nullopt, 0, {}, ctx);
 
     req->object_dispatch_flags = m_object_dispatch_flags;
@@ -215,7 +217,7 @@ void SimpleSchedulerObjectDispatch<I>::shut_down(Context* on_finish) {
 
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::read(
-    uint64_t object_no, const Extents &extents, librados::snap_t snap_id,
+    uint64_t object_no, const Extents &extents, IOContext io_context,
     int op_flags, const ZTracer::Trace &parent_trace,
     ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
     int* object_dispatch_flags, DispatchResult* dispatch_result,
@@ -238,7 +240,7 @@ bool SimpleSchedulerObjectDispatch<I>::read(
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::discard(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    const ::SnapContext &snapc, int discard_flags,
+    IOContext io_context, int discard_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -256,7 +258,7 @@ bool SimpleSchedulerObjectDispatch<I>::discard(
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, DispatchResult* dispatch_result,
@@ -273,8 +275,8 @@ bool SimpleSchedulerObjectDispatch<I>::write(
   }
 
   std::lock_guard locker{m_lock};
-  if (try_delay_write(object_no, object_off, std::move(data), snapc, op_flags,
-                      *object_dispatch_flags, on_dispatched)) {
+  if (try_delay_write(object_no, object_off, std::move(data), io_context,
+                      op_flags, *object_dispatch_flags, on_dispatched)) {
 
     auto dispatch_seq = ++m_dispatch_seq;
     m_flush_tracker->start_io(dispatch_seq);
@@ -298,7 +300,7 @@ template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::write_same(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags,
+    IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -316,7 +318,7 @@ bool SimpleSchedulerObjectDispatch<I>::write_same(
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::compare_and_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-    ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
     int* object_dispatch_flags, uint64_t* journal_tid,
     DispatchResult* dispatch_result, Context** on_finish,
@@ -369,7 +371,7 @@ bool SimpleSchedulerObjectDispatch<I>::intersects(
 template <typename I>
 bool SimpleSchedulerObjectDispatch<I>::try_delay_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int object_dispatch_flags,
+    IOContext io_context, int op_flags, int object_dispatch_flags,
     Context* on_dispatched) {
   ceph_assert(ceph_mutex_is_locked(m_lock));
   auto cct = m_image_ctx->cct;
@@ -387,7 +389,7 @@ bool SimpleSchedulerObjectDispatch<I>::try_delay_write(
 
   auto &object_requests = it->second;
   bool delayed = object_requests->try_delay_request(
-      object_off, std::move(data), snapc, op_flags, object_dispatch_flags,
+      object_off, std::move(data), io_context, op_flags, object_dispatch_flags,
       on_dispatched);
 
   ldout(cct, 20) << "delayed: " << delayed << dendl;
index 9b7d1fbad1c6a06fbc8d1e875ecf208705790f17..132b4240b36f7aa7b810150dcfb2a18c5525d58f 100644 (file)
@@ -5,7 +5,6 @@
 #define CEPH_LIBRBD_IO_SIMPLE_SCHEDULER_OBJECT_DISPATCH_H
 
 #include "common/ceph_mutex.h"
-#include "common/snap_types.h"
 #include "include/interval_set.h"
 #include "include/utime.h"
 
@@ -50,7 +49,7 @@ public:
   void shut_down(Context* on_finish) override;
 
   bool read(
-      uint64_t object_no, const Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, Extents* extent_map,
       uint64_t* version, int* object_dispatch_flags,
@@ -59,14 +58,14 @@ public:
 
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
@@ -75,14 +74,14 @@ public:
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       DispatchResult* dispatch_result, Context** on_finish,
@@ -151,7 +150,7 @@ private:
     }
 
     bool try_delay_request(uint64_t object_off, ceph::bufferlist&& data,
-                           const ::SnapContext &snapc, int op_flags,
+                           IOContext io_context, int op_flags,
                            int object_dispatch_flags, Context* on_dispatched);
 
     void dispatch_delayed_requests(ImageCtxT *image_ctx,
@@ -162,7 +161,7 @@ private:
     uint64_t m_object_no;
     uint64_t m_dispatch_seq = 0;
     clock_t::time_point m_dispatch_time;
-    SnapContext m_snapc = {0, {}};
+    IOContext m_io_context;
     int m_op_flags = 0;
     int m_object_dispatch_flags = 0;
     std::map<uint64_t, MergedRequests> m_delayed_requests;
@@ -192,7 +191,7 @@ private:
   std::unique_ptr<LatencyStats> m_latency_stats;
 
   bool try_delay_write(uint64_t object_no, uint64_t object_off,
-                       ceph::bufferlist&& data, const ::SnapContext &snapc,
+                       ceph::bufferlist&& data, IOContext io_context,
                        int op_flags, int object_dispatch_flags,
                        Context* on_dispatched);
   bool intersects(uint64_t object_no, uint64_t object_off, uint64_t len) const;
index be47abbaa6e5be19eae8f16a05d3ce8ddfbe0c63..1c42573664f24e55205a4d02577f6994c5ec3c0e 100644 (file)
@@ -80,7 +80,7 @@ void ObjectDispatch<I>::shut_down(Context* on_finish) {
 template <typename I>
 bool ObjectDispatch<I>::discard(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
-    const ::SnapContext &snapc, int discard_flags,
+    IOContext io_context, int discard_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -107,7 +107,7 @@ bool ObjectDispatch<I>::discard(
 template <typename I>
 bool ObjectDispatch<I>::write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags, int write_flags,
+    IOContext io_context, int op_flags, int write_flags,
     std::optional<uint64_t> assert_version,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -136,7 +136,7 @@ template <typename I>
 bool ObjectDispatch<I>::write_same(
     uint64_t object_no, uint64_t object_off, uint64_t object_len,
     io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-    const ::SnapContext &snapc, int op_flags,
+    IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
     uint64_t* journal_tid, io::DispatchResult* dispatch_result,
     Context** on_finish, Context* on_dispatched) {
@@ -163,7 +163,7 @@ bool ObjectDispatch<I>::write_same(
 template <typename I>
 bool ObjectDispatch<I>::compare_and_write(
     uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-    ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+    ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
     const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
     int* object_dispatch_flags, uint64_t* journal_tid,
     io::DispatchResult* dispatch_result, Context** on_finish,
index f4426be3e28baf7226d14ee95a82cdc4aa7bf901..2342200867e565c856f4ab20c70071bcc52c6718 100644 (file)
@@ -7,7 +7,6 @@
 #include "include/int_types.h"
 #include "include/buffer.h"
 #include "include/rados/librados.hpp"
-#include "common/snap_types.h"
 #include "common/zipkin_trace.h"
 #include "librbd/io/Types.h"
 #include "librbd/io/ObjectDispatchInterface.h"
@@ -38,7 +37,7 @@ public:
   void shut_down(Context* on_finish) override;
 
   bool read(
-      uint64_t object_no, const io::Extents &extents, librados::snap_t snap_id,
+      uint64_t object_no, const io::Extents &extents, IOContext io_context,
       int op_flags, const ZTracer::Trace &parent_trace,
       ceph::bufferlist* read_data, io::Extents* extent_map,
       uint64_t* version, int* object_dispatch_flags,
@@ -49,14 +48,14 @@ public:
 
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
@@ -65,14 +64,14 @@ public:
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       io::LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* object_dispatch_flags,
       uint64_t* journal_tid, io::DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override;
 
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* object_dispatch_flags, uint64_t* journal_tid,
       io::DispatchResult* dispatch_result, Context** on_finish,
index 6d94b5da84722507ca76841adc7565ed3fc13ed0..2ecdf4ec81f126d9b327282ae75a07a0c88bc712 100644 (file)
@@ -29,8 +29,8 @@ template <typename I>
 class C_FlattenObject : public C_AsyncObjectThrottle<I> {
 public:
   C_FlattenObject(AsyncObjectThrottle<I> &throttle, I *image_ctx,
-                  ::SnapContext snapc, uint64_t object_no)
-    : C_AsyncObjectThrottle<I>(throttle, *image_ctx), m_snapc(snapc),
+                  IOContext io_context, uint64_t object_no)
+    : C_AsyncObjectThrottle<I>(throttle, *image_ctx), m_io_context(io_context),
       m_object_no(object_no) {
   }
 
@@ -56,7 +56,7 @@ public:
 
     bufferlist bl;
     auto req = new io::ObjectWriteRequest<I>(&image_ctx, m_object_no, 0,
-                                             std::move(bl), m_snapc, 0, 0,
+                                             std::move(bl), m_io_context, 0, 0,
                                              std::nullopt, {}, this);
     if (!req->has_parent()) {
       // stop early if the parent went away - it just means
@@ -70,7 +70,7 @@ public:
   }
 
 private:
-  ::SnapContext m_snapc;
+  IOContext m_io_context;
   uint64_t m_object_no;
 };
 
@@ -104,7 +104,8 @@ void FlattenRequest<I>::flatten_objects() {
     &FlattenRequest<I>::handle_flatten_objects>(this);
   typename AsyncObjectThrottle<I>::ContextFactory context_factory(
     boost::lambda::bind(boost::lambda::new_ptr<C_FlattenObject<I> >(),
-      boost::lambda::_1, &image_ctx, m_snapc, boost::lambda::_2));
+      boost::lambda::_1, &image_ctx, image_ctx.get_data_io_context(),
+      boost::lambda::_2));
   AsyncObjectThrottle<I> *throttle = new AsyncObjectThrottle<I>(
     this, image_ctx, context_factory, ctx, &m_prog_ctx, 0, m_overlap_objects);
   throttle->start_ops(
index 78730963cd64fc9654a75626aa0957a7e16e0a79..cdbb4c9e794fe786f530547777a579b304f446a3 100644 (file)
@@ -4,7 +4,6 @@
 #define CEPH_LIBRBD_OPERATION_FLATTEN_REQUEST_H
 
 #include "librbd/operation/Request.h"
-#include "common/snap_types.h"
 
 namespace librbd {
 
@@ -18,11 +17,9 @@ class FlattenRequest : public Request<ImageCtxT>
 {
 public:
   FlattenRequest(ImageCtxT &image_ctx, Context *on_finish,
-                 uint64_t overlap_objects, const ::SnapContext &snapc,
-                 ProgressContext &prog_ctx)
+                 uint64_t overlap_objects, ProgressContext &prog_ctx)
     : Request<ImageCtxT>(image_ctx, on_finish),
-      m_overlap_objects(overlap_objects),
-      m_snapc(snapc), m_prog_ctx(prog_ctx) {
+      m_overlap_objects(overlap_objects), m_prog_ctx(prog_ctx) {
   }
 
 protected:
@@ -55,7 +52,6 @@ private:
    */
 
   uint64_t m_overlap_objects;
-  ::SnapContext m_snapc;
   ProgressContext &m_prog_ctx;
 
   void flatten_objects();
index 1e5f9ff0f442e0e668ecd084998eefe764cb3ce1..eb87c5046acf182e7663d787f048ae39192955b8 100644 (file)
@@ -33,8 +33,8 @@ template <typename I>
 class C_MigrateObject : public C_AsyncObjectThrottle<I> {
 public:
   C_MigrateObject(AsyncObjectThrottle<I> &throttle, I *image_ctx,
-                  ::SnapContext snapc, uint64_t object_no)
-    : C_AsyncObjectThrottle<I>(throttle, *image_ctx), m_snapc(snapc),
+                  IOContext io_context, uint64_t object_no)
+    : C_AsyncObjectThrottle<I>(throttle, *image_ctx), m_io_context(io_context),
       m_object_no(object_no) {
   }
 
@@ -54,7 +54,7 @@ public:
   }
 
 private:
-  ::SnapContext m_snapc;
+  IOContext m_io_context;
   uint64_t m_object_no;
 
   io::AsyncOperation *m_async_op = nullptr;
@@ -118,8 +118,8 @@ private:
     if (is_within_overlap_bounds()) {
       bufferlist bl;
       auto req = new io::ObjectWriteRequest<I>(&image_ctx, m_object_no, 0,
-                                               std::move(bl), m_snapc, 0, 0,
-                                               std::nullopt, {}, ctx);
+                                               std::move(bl), m_io_context, 0,
+                                               0, std::nullopt, {}, ctx);
 
       ldout(cct, 20) << "copyup object req " << req << ", object_no "
                      << m_object_no << dendl;
@@ -192,7 +192,8 @@ void MigrateRequest<I>::migrate_objects() {
 
   typename AsyncObjectThrottle<I>::ContextFactory context_factory(
     boost::lambda::bind(boost::lambda::new_ptr<C_MigrateObject<I> >(),
-      boost::lambda::_1, &image_ctx, image_ctx.snapc, boost::lambda::_2));
+      boost::lambda::_1, &image_ctx, image_ctx.get_data_io_context(),
+      boost::lambda::_2));
   AsyncObjectThrottle<I> *throttle = new AsyncObjectThrottle<I>(
     this, image_ctx, context_factory, ctx, &m_prog_ctx, 0, overlap_objects);
   throttle->start_ops(
index 99f3b012d2cbc0bd0f5e8198f1d45ca269e260d2..a143b579ca9f0f09159901c33299696b02e990f9 100644 (file)
@@ -4,7 +4,6 @@
 #define CEPH_LIBRBD_OPERATION_MIGRATE_REQUEST_H
 
 #include "librbd/operation/Request.h"
-#include "common/snap_types.h"
 #include "librbd/Types.h"
 
 namespace librbd {
index 63c0b232bbd9491b9f429b5d8d442c7b6d0abe3a..b8ecf10acf1c1576538269c55e1123bde12d4965 100644 (file)
@@ -30,8 +30,8 @@ template <typename I>
 class C_CopyupObject : public C_AsyncObjectThrottle<I> {
 public:
   C_CopyupObject(AsyncObjectThrottle<I> &throttle, I *image_ctx,
-                 ::SnapContext snapc, uint64_t object_no)
-    : C_AsyncObjectThrottle<I>(throttle, *image_ctx), m_snapc(snapc),
+                 IOContext io_context, uint64_t object_no)
+    : C_AsyncObjectThrottle<I>(throttle, *image_ctx), m_io_context(io_context),
       m_object_no(object_no)
   {
   }
@@ -47,13 +47,13 @@ public:
 
     auto object_dispatch_spec = io::ObjectDispatchSpec::create_discard(
       &image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, m_object_no, 0,
-      image_ctx.layout.object_size, m_snapc,
+      image_ctx.layout.object_size, m_io_context,
       io::OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE, 0, {}, this);
     object_dispatch_spec->send();
     return 0;
   }
 private:
-  ::SnapContext m_snapc;
+  IOContext m_io_context;
   uint64_t m_object_no;
 };
 
@@ -221,13 +221,13 @@ void TrimRequest<I>::send_copyup_objects() {
   I &image_ctx = this->m_image_ctx;
   ceph_assert(ceph_mutex_is_locked(image_ctx.owner_lock));
 
-  ::SnapContext snapc;
+  IOContext io_context;
   bool has_snapshots;
   uint64_t parent_overlap;
   {
     std::shared_lock image_locker{image_ctx.image_lock};
 
-    snapc = image_ctx.snapc;
+    io_context = image_ctx.get_data_io_context();
     has_snapshots = !image_ctx.snaps.empty();
     int r = image_ctx.get_parent_overlap(CEPH_NOSNAP, &parent_overlap);
     ceph_assert(r == 0);
@@ -255,7 +255,7 @@ void TrimRequest<I>::send_copyup_objects() {
   Context *ctx = this->create_callback_context();
   typename AsyncObjectThrottle<I>::ContextFactory context_factory(
     boost::lambda::bind(boost::lambda::new_ptr<C_CopyupObject<I> >(),
-      boost::lambda::_1, &image_ctx, snapc, boost::lambda::_2));
+      boost::lambda::_1, &image_ctx, io_context, boost::lambda::_2));
   AsyncObjectThrottle<I> *throttle = new AsyncObjectThrottle<I>(
     this, image_ctx, context_factory, ctx, &m_prog_ctx, copyup_start,
     copyup_end);
@@ -329,10 +329,10 @@ void TrimRequest<I>::send_clean_boundary() {
                            << " length=" << delete_len << dendl;
   m_state = STATE_CLEAN_BOUNDARY;
 
-  ::SnapContext snapc;
+  IOContext io_context;
   {
     std::shared_lock image_locker{image_ctx.image_lock};
-    snapc = image_ctx.snapc;
+    io_context = image_ctx.get_data_io_context();
   }
 
   // discard the weird boundary
@@ -355,7 +355,7 @@ void TrimRequest<I>::send_clean_boundary() {
 
     auto object_dispatch_spec = io::ObjectDispatchSpec::create_discard(
       &image_ctx, io::OBJECT_DISPATCH_LAYER_NONE, p->objectno, p->offset,
-      p->length, snapc, 0, 0, {}, req_comp);
+      p->length, io_context, 0, 0, {}, req_comp);
     object_dispatch_spec->send();
   }
   completion->finish_adding_requests();
index 17c5cab9cb260568c4c8cc4e3cc28550042daa27..25db52b494d5a023100bcf7272e0e33a1e1e7103 100644 (file)
@@ -222,6 +222,19 @@ void IOContext::write_snap_context(
   }
 }
 
+bool operator ==(const IOContext& lhs, const IOContext& rhs) {
+  auto l = reinterpret_cast<const IOContextImpl*>(&lhs.impl);
+  auto r = reinterpret_cast<const IOContextImpl*>(&rhs.impl);
+  return (l->oloc == r->oloc &&
+          l->snap_seq == r->snap_seq &&
+          l->snapc.seq == r->snapc.seq &&
+          l->snapc.snaps == r->snapc.snaps);
+}
+
+bool operator !=(const IOContext& lhs, const IOContext& rhs) {
+  return !(lhs == rhs);
+}
+
 Op::Op() {
   static_assert(Op::impl_size >= sizeof(librados::TestObjectOperationImpl*));
   auto& o = *reinterpret_cast<librados::TestObjectOperationImpl**>(&impl);
index d98a56fad59542267df689814bb3d8e11b8d7c56..1185500e332dec330311a88538572fa1414d6046 100644 (file)
@@ -287,7 +287,7 @@ TEST_F(TestMockParentCacheObjectDispatch, test_disble_interface) {
 
   std::string temp_oid("12345");
   ceph::bufferlist temp_bl;
-  ::SnapContext *temp_snapc = nullptr;
+  IOContext io_context = mock_image_ctx.get_data_io_context();
   io::DispatchResult* temp_dispatch_result = nullptr;
   io::Extents temp_buffer_extents;
   int* temp_op_flags = nullptr;
@@ -297,17 +297,20 @@ TEST_F(TestMockParentCacheObjectDispatch, test_disble_interface) {
   ZTracer::Trace* temp_trace = nullptr;
   io::LightweightBufferExtents buffer_extents;
 
-  ASSERT_EQ(mock_parent_image_cache->discard(0, 0, 0, *temp_snapc, 0, *temp_trace, temp_op_flags,
-            temp_journal_tid, temp_dispatch_result, temp_on_finish, temp_on_dispatched), false);
-  ASSERT_EQ(mock_parent_image_cache->write(0, 0, std::move(temp_bl), *temp_snapc, 0, 0, std::nullopt,
+  ASSERT_EQ(mock_parent_image_cache->discard(0, 0, 0, io_context, 0,
             *temp_trace, temp_op_flags, temp_journal_tid, temp_dispatch_result,
             temp_on_finish, temp_on_dispatched), false);
+  ASSERT_EQ(mock_parent_image_cache->write(0, 0, std::move(temp_bl),
+            io_context, 0, 0, std::nullopt, *temp_trace, temp_op_flags,
+            temp_journal_tid, temp_dispatch_result, temp_on_finish,
+            temp_on_dispatched), false);
   ASSERT_EQ(mock_parent_image_cache->write_same(0, 0, 0, std::move(buffer_extents),
-            std::move(temp_bl), *temp_snapc, 0, *temp_trace, temp_op_flags,
+            std::move(temp_bl), io_context, 0, *temp_trace, temp_op_flags,
             temp_journal_tid, temp_dispatch_result, temp_on_finish, temp_on_dispatched), false );
   ASSERT_EQ(mock_parent_image_cache->compare_and_write(0, 0, std::move(temp_bl), std::move(temp_bl),
-            *temp_snapc, 0, *temp_trace, temp_journal_tid, temp_op_flags, temp_journal_tid,
-            temp_dispatch_result, temp_on_finish, temp_on_dispatched), false);
+            io_context, 0, *temp_trace, temp_journal_tid, temp_op_flags,
+            temp_journal_tid, temp_dispatch_result, temp_on_finish,
+            temp_on_dispatched), false);
   ASSERT_EQ(mock_parent_image_cache->flush(io::FLUSH_SOURCE_USER, *temp_trace, temp_journal_tid,
             temp_dispatch_result, temp_on_finish, temp_on_dispatched), false);
   ASSERT_EQ(mock_parent_image_cache->invalidate_cache(nullptr), false);
@@ -358,9 +361,9 @@ TEST_F(TestMockParentCacheObjectDispatch, test_read) {
   C_SaferCond on_dispatched;
   io::DispatchResult dispatch_result;
   ceph::bufferlist read_data;
-  mock_parent_image_cache->read(0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &read_data,
-                                nullptr, nullptr, nullptr, &dispatch_result,
-                                nullptr, &on_dispatched);
+  mock_parent_image_cache->read(
+    0, {{0, 4096}}, mock_image_ctx.get_data_io_context(), 0, {}, &read_data,
+    nullptr, nullptr, nullptr, &dispatch_result, nullptr, &on_dispatched);
   ASSERT_EQ(0, on_dispatched.wait());
 
   mock_parent_image_cache->get_cache_client()->close();
@@ -411,9 +414,9 @@ TEST_F(TestMockParentCacheObjectDispatch, test_read_dne) {
 
   C_SaferCond on_dispatched;
   io::DispatchResult dispatch_result;
-  mock_parent_image_cache->read(0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, nullptr,
-                                nullptr, nullptr, nullptr, &dispatch_result,
-                                nullptr, &on_dispatched);
+  mock_parent_image_cache->read(
+    0, {{0, 4096}}, mock_image_ctx.get_data_io_context(), 0, {}, nullptr,
+    nullptr, nullptr, nullptr, &dispatch_result, nullptr, &on_dispatched);
   ASSERT_EQ(0, on_dispatched.wait());
 
   mock_parent_image_cache->get_cache_client()->close();
index 6fc8491aae9560f6096d90fa9496acfdfb31e702..8ae7c1d39aea5a6248a08efb30f539a465ca0f73 100644 (file)
@@ -123,8 +123,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, Flush) {
 TEST_F(TestMockCryptoCryptoObjectDispatch, Discard) {
   expect_object_write_same();
   ASSERT_TRUE(mock_crypto_object_dispatch->discard(
-          0, 0, 4096, mock_image_ctx->snapc, 0, {}, &object_dispatch_flags,
-          nullptr, &dispatch_result, &on_finish, on_dispatched));
+          0, 0, 4096, mock_image_ctx->get_data_io_context(), 0, {},
+          &object_dispatch_flags, nullptr, &dispatch_result, &on_finish,
+          on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
 
   ASSERT_EQ(ETIMEDOUT, dispatched_cond.wait_for(0));
@@ -135,8 +136,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, Discard) {
 TEST_F(TestMockCryptoCryptoObjectDispatch, ReadFail) {
   expect_object_read();
   ASSERT_TRUE(mock_crypto_object_dispatch->read(
-      0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &data, &extent_map, nullptr,
-      &object_dispatch_flags, &dispatch_result, &on_finish, on_dispatched));
+      0, {{0, 4096}}, mock_image_ctx->get_data_io_context(), 0, {}, &data,
+      &extent_map, nullptr, &object_dispatch_flags, &dispatch_result,
+      &on_finish, on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish, &finished_cond);
 
@@ -148,9 +150,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, ReadFail) {
 TEST_F(TestMockCryptoCryptoObjectDispatch, Read) {
   expect_object_read();
   ASSERT_TRUE(mock_crypto_object_dispatch->read(
-          0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &data, &extent_map, nullptr,
-          &object_dispatch_flags, &dispatch_result, &on_finish,
-          on_dispatched));
+          0, {{0, 4096}}, mock_image_ctx->get_data_io_context(), 0, {}, &data,
+          &extent_map, nullptr, &object_dispatch_flags, &dispatch_result,
+          &on_finish, on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish, &finished_cond);
   ASSERT_EQ(ETIMEDOUT, dispatched_cond.wait_for(0));
@@ -163,8 +165,9 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, Read) {
 TEST_F(TestMockCryptoCryptoObjectDispatch, Write) {
   expect_encrypt();
   ASSERT_TRUE(mock_crypto_object_dispatch->write(
-        0, 0, std::move(data), mock_image_ctx->snapc, 0, 0, std::nullopt, {},
-        nullptr, nullptr, &dispatch_result, &on_finish, on_dispatched));
+        0, 0, std::move(data), mock_image_ctx->get_data_io_context(), 0, 0,
+        std::nullopt, {}, nullptr, nullptr, &dispatch_result, &on_finish,
+        on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_CONTINUE);
   ASSERT_EQ(on_finish, &finished_cond); // not modified
   on_finish->complete(0);
@@ -177,8 +180,8 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, CompareAndWrite) {
   expect_encrypt(2);
   ASSERT_TRUE(mock_crypto_object_dispatch->compare_and_write(
           0, 0, std::move(cmp_data), std::move(data),
-          mock_image_ctx->snapc, 0, {}, nullptr, nullptr, nullptr,
-          &dispatch_result, &on_finish, on_dispatched));
+          mock_image_ctx->get_data_io_context(), 0, {}, nullptr, nullptr,
+          nullptr, &dispatch_result, &on_finish, on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_CONTINUE);
   ASSERT_EQ(on_finish, &finished_cond); // not modified
   on_finish->complete(0);
@@ -191,8 +194,8 @@ TEST_F(TestMockCryptoCryptoObjectDispatch, WriteSame) {
   expect_object_write();
   ASSERT_TRUE(mock_crypto_object_dispatch->write_same(
           0, 0, 4096, std::move(buffer_extents), std::move(data),
-          mock_image_ctx->snapc, 0, {}, nullptr, nullptr, &dispatch_result,
-          &on_finish, on_dispatched));
+          mock_image_ctx->get_data_io_context(), 0, {}, nullptr, nullptr,
+          &dispatch_result, &on_finish, on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
 
   ASSERT_EQ(ETIMEDOUT, dispatched_cond.wait_for(0));
index abe300941053e195888747e3339d4c3908148acf..76072fcdfd62aa3e953724d54e06a6fa5053c7b8 100644 (file)
@@ -361,7 +361,8 @@ TEST_F(TestMockIoObjectRequest, Read) {
   C_SaferCond ctx;
   uint64_t version;
   auto req = MockObjectReadRequest::create(
-          &mock_image_ctx, 0, {{0, 4096}, {8192, 4096}}, CEPH_NOSNAP, 0, {},
+          &mock_image_ctx, 0, {{0, 4096}, {8192, 4096}},
+          mock_image_ctx.get_data_io_context(), 0, {},
           &bl, &extent_map, &version, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
@@ -401,7 +402,8 @@ TEST_F(TestMockIoObjectRequest, SparseReadThreshold) {
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
     &mock_image_ctx, 0,
-    {{0, ictx->sparse_read_threshold_bytes}}, CEPH_NOSNAP, 0, {}, &bl,
+    {{0, ictx->sparse_read_threshold_bytes}},
+    mock_image_ctx.get_data_io_context(), 0, {}, &bl,
     &extent_map, nullptr, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
@@ -428,7 +430,8 @@ TEST_F(TestMockIoObjectRequest, ReadError) {
   Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
-    &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map,
+    &mock_image_ctx, 0, {{0, 4096}},
+    mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map,
     nullptr, &ctx);
   req->send();
   ASSERT_EQ(-EPERM, ctx.wait());
@@ -474,7 +477,8 @@ TEST_F(TestMockIoObjectRequest, ParentRead) {
   Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
-    &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map,
+    &mock_image_ctx, 0, {{0, 4096}},
+    mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map,
     nullptr, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
@@ -520,7 +524,8 @@ TEST_F(TestMockIoObjectRequest, ParentReadError) {
   Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
-    &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map,
+    &mock_image_ctx, 0, {{0, 4096}},
+    mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map,
     nullptr, &ctx);
   req->send();
   ASSERT_EQ(-EPERM, ctx.wait());
@@ -571,7 +576,8 @@ TEST_F(TestMockIoObjectRequest, CopyOnRead) {
   Extents extent_map;
   C_SaferCond ctx;
   auto req = MockObjectReadRequest::create(
-    &mock_image_ctx, 0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, &bl, &extent_map,
+    &mock_image_ctx, 0, {{0, 4096}},
+    mock_image_ctx.get_data_io_context(), 0, {}, &bl, &extent_map,
     nullptr, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
@@ -606,8 +612,8 @@ TEST_F(TestMockIoObjectRequest, Write) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -644,7 +650,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithCreateExclusiveFlag) {
 
     C_SaferCond ctx;
     auto req = MockObjectWriteRequest::create_write(
-            &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0,
+            &mock_image_ctx, 0, 0, std::move(bl),
+            mock_image_ctx.get_data_io_context(), 0,
             OBJECT_WRITE_FLAG_CREATE_EXCLUSIVE, std::nullopt, {}, &ctx);
     req->send();
     ASSERT_EQ(0, ctx.wait());
@@ -663,7 +670,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithCreateExclusiveFlag) {
 
     C_SaferCond ctx;
     auto req = MockObjectWriteRequest::create_write(
-            &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0,
+            &mock_image_ctx, 0, 0, std::move(bl),
+            mock_image_ctx.get_data_io_context(), 0,
             OBJECT_WRITE_FLAG_CREATE_EXCLUSIVE, std::nullopt, {}, &ctx);
     req->send();
     ASSERT_EQ(-EEXIST, ctx.wait());
@@ -702,7 +710,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) {
 
     C_SaferCond ctx;
     auto req = MockObjectWriteRequest::create_write(
-            &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
+            &mock_image_ctx, 0, 0, std::move(bl),
+            mock_image_ctx.get_data_io_context(), 0, 0,
             std::nullopt, {}, &ctx);
     req->send();
     ASSERT_EQ(0, ctx.wait());
@@ -722,7 +731,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) {
 
     C_SaferCond ctx;
     auto req = MockObjectWriteRequest::create_write(
-            &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
+            &mock_image_ctx, 0, 0, std::move(bl),
+            mock_image_ctx.get_data_io_context(), 0, 0,
             std::make_optional(1), {}, &ctx);
     req->send();
     ASSERT_EQ(0, ctx.wait());
@@ -741,7 +751,8 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) {
 
     C_SaferCond ctx;
     auto req = MockObjectWriteRequest::create_write(
-            &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
+            &mock_image_ctx, 0, 0, std::move(bl),
+            mock_image_ctx.get_data_io_context(), 0, 0,
             std::make_optional(1), {}, &ctx);
     req->send();
     ASSERT_EQ(-ERANGE, ctx.wait());
@@ -760,8 +771,9 @@ TEST_F(TestMockIoObjectRequest, WriteWithAssertVersion) {
 
     C_SaferCond ctx;
     auto req = MockObjectWriteRequest::create_write(
-            &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-            std::make_optional(3), {}, &ctx);
+            &mock_image_ctx, 0, 0, std::move(bl),
+            mock_image_ctx.get_data_io_context(), 0, 0, std::make_optional(3),
+            {}, &ctx);
     req->send();
     ASSERT_EQ(-EOVERFLOW, ctx.wait());
   }
@@ -796,8 +808,8 @@ TEST_F(TestMockIoObjectRequest, WriteFull) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -830,8 +842,8 @@ TEST_F(TestMockIoObjectRequest, WriteObjectMap) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -852,8 +864,8 @@ TEST_F(TestMockIoObjectRequest, WriteError) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(-EPERM, ctx.wait());
 }
@@ -906,8 +918,8 @@ TEST_F(TestMockIoObjectRequest, Copyup) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -962,8 +974,8 @@ TEST_F(TestMockIoObjectRequest, CopyupRestart) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1010,8 +1022,8 @@ TEST_F(TestMockIoObjectRequest, CopyupOptimization) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1051,8 +1063,8 @@ TEST_F(TestMockIoObjectRequest, CopyupError) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(-EPERM, ctx.wait());
 }
@@ -1086,7 +1098,7 @@ TEST_F(TestMockIoObjectRequest, DiscardRemove) {
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
     &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(),
-    mock_image_ctx.snapc, 0, {}, &ctx);
+    mock_image_ctx.get_data_io_context(), 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1136,7 +1148,8 @@ TEST_F(TestMockIoObjectRequest, DiscardRemoveTruncate) {
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
     &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(),
-    mock_image_ctx.snapc, OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx);
+    mock_image_ctx.get_data_io_context(),
+    OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1192,7 +1205,8 @@ TEST_F(TestMockIoObjectRequest, DiscardTruncateAssertExists) {
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
     &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(),
-    mock_image_ctx.snapc, OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx);
+    mock_image_ctx.get_data_io_context(),
+    OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1227,7 +1241,7 @@ TEST_F(TestMockIoObjectRequest, DiscardTruncate) {
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
     &mock_image_ctx, 0, 1, mock_image_ctx.get_object_size() - 1,
-    mock_image_ctx.snapc, 0, {}, &ctx);
+    mock_image_ctx.get_data_io_context(), 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1258,7 +1272,8 @@ TEST_F(TestMockIoObjectRequest, DiscardZero) {
 
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
-    &mock_image_ctx, 0, 1, 1, mock_image_ctx.snapc, 0, {}, &ctx);
+    &mock_image_ctx, 0, 1, 1, mock_image_ctx.get_data_io_context(), 0, {},
+    &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1287,7 +1302,7 @@ TEST_F(TestMockIoObjectRequest, DiscardDisableObjectMapUpdate) {
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
     &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(),
-    mock_image_ctx.snapc,
+    mock_image_ctx.get_data_io_context(),
     OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE |
       OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE, {}, &ctx);
   req->send();
@@ -1318,7 +1333,7 @@ TEST_F(TestMockIoObjectRequest, DiscardNoOp) {
   C_SaferCond ctx;
   auto req = MockObjectDiscardRequest::create_discard(
     &mock_image_ctx, 0, 0, mock_image_ctx.get_object_size(),
-    mock_image_ctx.snapc,
+    mock_image_ctx.get_data_io_context(),
     OBJECT_DISCARD_FLAG_DISABLE_CLONE_REMOVE |
       OBJECT_DISCARD_FLAG_DISABLE_OBJECT_MAP_UPDATE, {},
     &ctx);
@@ -1355,7 +1370,8 @@ TEST_F(TestMockIoObjectRequest, WriteSame) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteSameRequest::create_write_same(
-    &mock_image_ctx, 0, 0, 4096, std::move(bl), mock_image_ctx.snapc, 0, {}, &ctx);
+    &mock_image_ctx, 0, 0, 4096, std::move(bl),
+    mock_image_ctx.get_data_io_context(), 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1395,7 +1411,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWrite) {
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
     &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl),
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1435,7 +1451,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteFull) {
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
     &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl),
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1497,7 +1513,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteCopyup) {
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
     &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl),
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(0, ctx.wait());
 }
@@ -1536,7 +1552,7 @@ TEST_F(TestMockIoObjectRequest, CompareAndWriteMismatch) {
   uint64_t mismatch_offset;
   auto req = MockObjectWriteSameRequest::create_compare_and_write(
     &mock_image_ctx, 0, 0, std::move(cmp_bl), std::move(bl),
-    mock_image_ctx.snapc, &mismatch_offset, 0, {}, &ctx);
+    mock_image_ctx.get_data_io_context(), &mismatch_offset, 0, {}, &ctx);
   req->send();
   ASSERT_EQ(-EILSEQ, ctx.wait());
   ASSERT_EQ(1ULL, mismatch_offset);
@@ -1570,8 +1586,8 @@ TEST_F(TestMockIoObjectRequest, ObjectMapError) {
 
   C_SaferCond ctx;
   auto req = MockObjectWriteRequest::create_write(
-    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.snapc, 0, 0,
-    std::nullopt, {}, &ctx);
+    &mock_image_ctx, 0, 0, std::move(bl), mock_image_ctx.get_data_io_context(),
+    0, 0, std::nullopt, {}, &ctx);
   req->send();
   ASSERT_EQ(-EBLOCKLISTED, ctx.wait());
 }
index 852dcc120f3a292788ac4f11fc6473da554f75ff..febbfdb8bdbb124878d5f2ad5ca953d6e969df2f 100644 (file)
@@ -132,8 +132,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Read) {
   C_SaferCond cond;
   Context *on_finish = &cond;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.read(
-      0, {{0, 4096}}, CEPH_NOSNAP, 0, {}, nullptr, nullptr, nullptr, nullptr,
-      nullptr, &on_finish, nullptr));
+      0, {{0, 4096}}, mock_image_ctx.get_data_io_context(), 0, {}, nullptr,
+      nullptr, nullptr, nullptr, nullptr, &on_finish, nullptr));
   ASSERT_EQ(on_finish, &cond); // not modified
   on_finish->complete(0);
   ASSERT_EQ(0, cond.wait());
@@ -150,8 +150,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Discard) {
   C_SaferCond cond;
   Context *on_finish = &cond;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.discard(
-      0, 0, 4096, mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr,
-      &on_finish, nullptr));
+      0, 0, 4096, mock_image_ctx.get_data_io_context(), 0, {}, nullptr, nullptr,
+      nullptr, &on_finish, nullptr));
   ASSERT_NE(on_finish, &cond);
   on_finish->complete(0);
   ASSERT_EQ(0, cond.wait());
@@ -171,8 +171,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Write) {
   C_SaferCond cond;
   Context *on_finish = &cond;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr,
+      &on_finish, nullptr));
   ASSERT_NE(on_finish, &cond);
   on_finish->complete(0);
   ASSERT_EQ(0, cond.wait());
@@ -192,8 +193,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteSame) {
   Context *on_finish = &cond;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write_same(
       0, 0, 4096, std::move(buffer_extents), std::move(data),
-      mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr, &on_finish,
-      nullptr));
+      mock_image_ctx.get_data_io_context(), 0, {}, nullptr, nullptr, nullptr,
+      &on_finish, nullptr));
   ASSERT_NE(on_finish, &cond);
   on_finish->complete(0);
   ASSERT_EQ(0, cond.wait());
@@ -212,8 +213,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, CompareAndWrite) {
   C_SaferCond cond;
   Context *on_finish = &cond;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.compare_and_write(
-      0, 0, std::move(cmp_data), std::move(write_data), mock_image_ctx.snapc, 0,
-      {}, nullptr, nullptr, nullptr, nullptr, &on_finish, nullptr));
+      0, 0, std::move(cmp_data), std::move(write_data),
+      mock_image_ctx.get_data_io_context(), 0, {}, nullptr, nullptr, nullptr,
+      nullptr, &on_finish, nullptr));
   ASSERT_NE(on_finish, &cond);
   on_finish->complete(0);
   ASSERT_EQ(0, cond.wait());
@@ -256,8 +258,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayed) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   Context *timer_task = nullptr;
@@ -268,9 +271,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayed) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
@@ -303,8 +306,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayedFlush) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   Context *timer_task = nullptr;
@@ -315,9 +319,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteDelayedFlush) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
@@ -359,8 +363,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   Context *timer_task = nullptr;
@@ -374,9 +379,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched2;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched2));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched2));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
@@ -388,9 +393,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) {
   Context *on_finish3 = &cond3;
   C_SaferCond on_dispatched3;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish3,
-      &on_dispatched3));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish3, &on_dispatched3));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish3, &cond3);
 
@@ -401,9 +406,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) {
   Context *on_finish4 = &cond4;
   C_SaferCond on_dispatched4;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {},&object_dispatch_flags, nullptr, &dispatch_result, &on_finish4,
-      &on_dispatched4));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {},&object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish4, &on_dispatched4));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish4, &cond4);
 
@@ -414,9 +419,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) {
   Context *on_finish5 = &cond5;
   C_SaferCond on_dispatched5;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish5,
-      &on_dispatched5));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish5, &on_dispatched5));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish5, &cond5);
 
@@ -427,9 +432,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteMerged) {
   Context *on_finish6 = &cond6;
   C_SaferCond on_dispatched6;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish6,
-      &on_dispatched6));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish6, &on_dispatched6));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish6, &cond6);
 
@@ -475,8 +480,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteNonSequential) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   Context *timer_task = nullptr;
@@ -490,9 +496,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteNonSequential) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched2;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched2));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched2));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
@@ -506,9 +512,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, WriteNonSequential) {
   C_SaferCond cond3;
   Context *on_finish3 = &cond3;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish3,
-      nullptr));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish3, nullptr));
   ASSERT_NE(on_finish3, &cond3);
 
   on_finish1->complete(0);
@@ -539,8 +545,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   // write (2) 0~10 (delayed)
@@ -555,9 +562,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched2;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched2));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched2));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
@@ -571,9 +578,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   Context *on_finish3 = &cond3;
   C_SaferCond on_dispatched3;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish3,
-      &on_dispatched3));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish3, &on_dispatched3));
   ASSERT_NE(on_finish3, &cond3);
 
   // discard (1) (non-seq io)
@@ -584,8 +591,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   C_SaferCond cond4;
   Context *on_finish4 = &cond4;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.discard(
-      0, 4096, 4096, mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr,
-      &on_finish4, nullptr));
+      0, 4096, 4096, mock_image_ctx.get_data_io_context(), 0, {}, nullptr,
+      nullptr, nullptr, &on_finish4, nullptr));
   ASSERT_NE(on_finish4, &cond4);
   ASSERT_EQ(0, on_dispatched2.wait());
   ASSERT_EQ(0, on_dispatched3.wait());
@@ -601,9 +608,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   Context *on_finish5 = &cond5;
   C_SaferCond on_dispatched5;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish5,
-      &on_dispatched5));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish5, &on_dispatched5));
   ASSERT_NE(on_finish5, &cond5);
   ASSERT_NE(timer_task, nullptr);
 
@@ -615,8 +622,8 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   C_SaferCond cond6;
   Context *on_finish6 = &cond6;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.discard(
-      0, 4096, 4096, mock_image_ctx.snapc, 0, {}, nullptr, nullptr, nullptr,
-      &on_finish6, nullptr));
+      0, 4096, 4096, mock_image_ctx.get_data_io_context(), 0, {}, nullptr,
+      nullptr, nullptr, &on_finish6, nullptr));
   ASSERT_NE(on_finish6, &cond6);
   ASSERT_EQ(0, on_dispatched5.wait());
 
@@ -631,9 +638,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Mixed) {
   Context *on_finish7 = &cond7;
   C_SaferCond on_dispatched7;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, object_off, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish7,
-      &on_dispatched7));
+      0, object_off, std::move(data), mock_image_ctx.get_data_io_context(), 0,
+      0, std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish7, &on_dispatched7));
   ASSERT_NE(on_finish7, &cond7);
   ASSERT_NE(timer_task, nullptr);
 
@@ -694,8 +701,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   Context *timer_task = nullptr;
@@ -707,9 +715,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched2;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched2));
+      object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched2));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
@@ -721,8 +729,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) {
   C_SaferCond cond3;
   Context *on_finish3 = &cond3;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, nullptr, &on_finish3, nullptr));
+      object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish3,
+      nullptr));
   ASSERT_NE(on_finish3, &cond3);
 
   data.clear();
@@ -730,9 +739,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, DispatchQueue) {
   Context *on_finish4 = &cond4;
   C_SaferCond on_dispatched4;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      object_no, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt,
-      {}, &object_dispatch_flags, nullptr, &dispatch_result, &on_finish4,
-      &on_dispatched4));
+      object_no, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish4, &on_dispatched4));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish4, &cond4);
 
@@ -777,8 +786,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Timer) {
   C_SaferCond cond1;
   Context *on_finish1 = &cond1;
   ASSERT_FALSE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, nullptr, &on_finish1, nullptr));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, nullptr, &on_finish1,
+      nullptr));
   ASSERT_NE(on_finish1, &cond1);
 
   Context *timer_task = nullptr;
@@ -790,9 +800,9 @@ TEST_F(TestMockIoSimpleSchedulerObjectDispatch, Timer) {
   Context *on_finish2 = &cond2;
   C_SaferCond on_dispatched;
   ASSERT_TRUE(mock_simple_scheduler_object_dispatch.write(
-      0, 0, std::move(data), mock_image_ctx.snapc, 0, 0, std::nullopt, {},
-      &object_dispatch_flags, nullptr, &dispatch_result, &on_finish2,
-      &on_dispatched));
+      0, 0, std::move(data), mock_image_ctx.get_data_io_context(), 0, 0,
+      std::nullopt, {}, &object_dispatch_flags, nullptr, &dispatch_result,
+      &on_finish2, &on_dispatched));
   ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
   ASSERT_NE(on_finish2, &cond2);
   ASSERT_NE(timer_task, nullptr);
index 9c7bf951fc9700c76bf446868c1d49979e9b0393..743b9c633e97c5a6302906175325ddf85cc8b752 100644 (file)
@@ -39,9 +39,13 @@ void MockImageCtx::wait_for_async_ops() {
 IOContext MockImageCtx::get_data_io_context() {
   auto ctx = std::make_shared<neorados::IOContext>(
     data_ctx.get_id(), data_ctx.get_namespace());
-  ctx->read_snap(snap_id);
-  ctx->write_snap_context(
-    {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}});
+  if (snap_id != CEPH_NOSNAP) {
+    ctx->read_snap(snap_id);
+  }
+  if (!snapc.snaps.empty()) {
+    ctx->write_snap_context(
+      {{snapc.seq, {snapc.snaps.begin(), snapc.snaps.end()}}});
+  }
   return ctx;
 }
 
index e16be79ef437d8a322c75e0159a5c9d40363f7c6..0b940bd86d584f7939102a9beca9e5ef0cca9302 100644 (file)
@@ -25,45 +25,45 @@ public:
   MOCK_METHOD1(shut_down, void(Context*));
 
   MOCK_METHOD8(execute_read,
-               bool(uint64_t, const Extents&, librados::snap_t,
+               bool(uint64_t, const Extents&, IOContext io_context,
                     ceph::bufferlist*, Extents*, uint64_t*,
                     DispatchResult*, Context*));
   bool read(
-      uint64_t object_no, const Extents& extents, librados::snap_t snap_id,
+      uint64_t object_no, const Extents& extents, IOContext io_context,
       int op_flags, const ZTracer::Trace& parent_trace,
       ceph::bufferlist* read_data, Extents* extent_map, uint64_t* version,
       int* dispatch_flags, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) {
-    return execute_read(object_no, extents, snap_id, read_data, extent_map,
+    return execute_read(object_no, extents, io_context, read_data, extent_map,
                         version, dispatch_result, on_dispatched);
   }
 
   MOCK_METHOD9(execute_discard,
-               bool(uint64_t, uint64_t, uint64_t, const ::SnapContext &, int,
+               bool(uint64_t, uint64_t, uint64_t, IOContext, int,
                     int*, uint64_t*, DispatchResult*, Context*));
   bool discard(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
-      const ::SnapContext &snapc, int discard_flags,
+      IOContext io_context, int discard_flags,
       const ZTracer::Trace &parent_trace, int* dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) {
-    return execute_discard(object_no, object_off, object_len, snapc,
+    return execute_discard(object_no, object_off, object_len, io_context,
                            discard_flags, dispatch_flags, journal_tid,
                            dispatch_result, on_dispatched);
   }
 
   MOCK_METHOD10(execute_write,
                bool(uint64_t, uint64_t, const ceph::bufferlist&,
-                    const ::SnapContext &, int, std::optional<uint64_t>, int*,
+                    IOContext, int, std::optional<uint64_t>, int*,
                     uint64_t*, DispatchResult*, Context *));
   bool write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags, int write_flags,
+      IOContext io_context, int op_flags, int write_flags,
       std::optional<uint64_t> assert_version,
       const ZTracer::Trace &parent_trace, int* dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context** on_finish, Context* on_dispatched) override {
-    return execute_write(object_no, object_off, data, snapc, write_flags,
+    return execute_write(object_no, object_off, data, io_context, write_flags,
                          assert_version, dispatch_flags, journal_tid,
                          dispatch_result, on_dispatched);
   }
@@ -71,17 +71,17 @@ public:
   MOCK_METHOD10(execute_write_same,
                 bool(uint64_t, uint64_t, uint64_t,
                      const LightweightBufferExtents&,
-                     const ceph::bufferlist&, const ::SnapContext &, int*,
+                     const ceph::bufferlist&, IOContext, int*,
                      uint64_t*, DispatchResult*, Context *));
   bool write_same(
       uint64_t object_no, uint64_t object_off, uint64_t object_len,
       LightweightBufferExtents&& buffer_extents, ceph::bufferlist&& data,
-      const ::SnapContext &snapc, int op_flags,
+      IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, int* dispatch_flags,
       uint64_t* journal_tid, DispatchResult* dispatch_result,
       Context* *on_finish, Context* on_dispatched) override {
     return execute_write_same(object_no, object_off, object_len, buffer_extents,
-                              data, snapc, dispatch_flags, journal_tid,
+                              data, io_context, dispatch_flags, journal_tid,
                               dispatch_result, on_dispatched);
   }
 
@@ -91,7 +91,7 @@ public:
                     DispatchResult*, Context *));
   bool compare_and_write(
       uint64_t object_no, uint64_t object_off, ceph::bufferlist&& cmp_data,
-      ceph::bufferlist&& write_data, const ::SnapContext &snapc, int op_flags,
+      ceph::bufferlist&& write_data, IOContext io_context, int op_flags,
       const ZTracer::Trace &parent_trace, uint64_t* mismatch_offset,
       int* dispatch_flags, uint64_t* journal_tid,
       DispatchResult* dispatch_result, Context** on_finish,