]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/librbd/io/ObjectDispatchSpec.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / librbd / io / ObjectDispatchSpec.h
index 654ed3dd31cd0473aff13b31d1cf97f13c8b31b6..a0d4b49a46345c84134e86d21a91e1b33b1fbe4f 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>
 
@@ -36,35 +36,31 @@ private:
 public:
   struct RequestBase {
     uint64_t object_no;
-    uint64_t object_off;
 
-    RequestBase(uint64_t object_no, uint64_t object_off)
-      : object_no(object_no), object_off(object_off) {
+    RequestBase(uint64_t object_no)
+      : object_no(object_no) {
     }
   };
 
   struct ReadRequest : public RequestBase {
-    uint64_t object_len;
-    librados::snap_t snap_id;
-    ceph::bufferlist* read_data;
-    ExtentMap* extent_map;
-
-    ReadRequest(uint64_t object_no, uint64_t object_off, uint64_t object_len,
-                librados::snap_t snap_id, ceph::bufferlist* read_data,
-                ExtentMap* extent_map)
-      : RequestBase(object_no, object_off),
-        object_len(object_len), snap_id(snap_id), read_data(read_data),
-        extent_map(extent_map) {
+    ReadExtents* extents;
+    int read_flags;
+    uint64_t* version;
+
+    ReadRequest(uint64_t object_no, ReadExtents* extents, int read_flags,
+                uint64_t* version)
+      : RequestBase(object_no), extents(extents), read_flags(read_flags),
+        version(version) {
     }
   };
 
   struct WriteRequestBase : public RequestBase {
-    ::SnapContext snapc;
+    uint64_t object_off;
     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), snapc(snapc),
+                     uint64_t journal_tid)
+      : RequestBase(object_no), object_off(object_off),
         journal_tid(journal_tid) {
     }
   };
@@ -74,21 +70,23 @@ 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) {
     }
   };
 
   struct WriteRequest : public WriteRequestBase {
     ceph::bufferlist data;
+    int write_flags;
+    std::optional<uint64_t> assert_version;
 
     WriteRequest(uint64_t object_no, uint64_t object_off,
-                 ceph::bufferlist&& data, const ::SnapContext& snapc,
-                 uint64_t journal_tid)
-      : WriteRequestBase(object_no, object_off, snapc, journal_tid),
-        data(std::move(data)) {
+                 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) {
     }
   };
 
@@ -100,9 +98,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)) {
     }
@@ -116,8 +113,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) {
     }
@@ -132,65 +129,83 @@ public:
     }
   };
 
+  struct ListSnapsRequest : public RequestBase {
+    Extents extents;
+    SnapIds snap_ids;
+    int list_snaps_flags;
+    SnapshotDelta* snapshot_delta;
+
+    ListSnapsRequest(uint64_t object_no, Extents&& extents,
+                     SnapIds&& snap_ids, int list_snaps_flags,
+                     SnapshotDelta* snapshot_delta)
+      : RequestBase(object_no), extents(std::move(extents)),
+        snap_ids(std::move(snap_ids)),list_snaps_flags(list_snaps_flags),
+        snapshot_delta(snapshot_delta) {
+    }
+  };
+
   typedef boost::variant<ReadRequest,
                          DiscardRequest,
                          WriteRequest,
                          WriteSameRequest,
                          CompareAndWriteRequest,
-                         FlushRequest> Request;
+                         FlushRequest,
+                         ListSnapsRequest> Request;
 
   C_Dispatcher dispatcher_ctx;
 
   ObjectDispatcherInterface* object_dispatcher;
-  ObjectDispatchLayer object_dispatch_layer;
+  ObjectDispatchLayer dispatch_layer;
   int object_dispatch_flags = 0;
   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, uint64_t object_off, uint64_t object_len,
-      librados::snap_t snap_id, int op_flags,
-      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, Context* on_finish) {
+      uint64_t object_no, ReadExtents* extents, IOContext io_context,
+      int op_flags, int read_flags, const ZTracer::Trace &parent_trace,
+      uint64_t* version, Context* on_finish) {
     return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
                                   object_dispatch_layer,
-                                  ReadRequest{object_no, object_off,
-                                              object_len, snap_id, read_data,
-                                              extent_map},
-                                  op_flags, parent_trace, on_finish);
+                                  ReadRequest{object_no, extents,
+                                              read_flags, version},
+                                  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, uint64_t journal_tid,
+      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,
-                                               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>
@@ -198,23 +213,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,
@@ -224,8 +240,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>
@@ -235,8 +252,24 @@ 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);
+  }
+
+  template <typename ImageCtxT>
+  static ObjectDispatchSpec* create_list_snaps(
+      ImageCtxT* image_ctx, ObjectDispatchLayer object_dispatch_layer,
+      uint64_t object_no, Extents&& extents, SnapIds&& snap_ids,
+      int list_snaps_flags, const ZTracer::Trace &parent_trace,
+      SnapshotDelta* snapshot_delta, Context* on_finish) {
+    return new ObjectDispatchSpec(image_ctx->io_object_dispatcher,
+                                  object_dispatch_layer,
+                                  ListSnapsRequest{object_no,
+                                                   std::move(extents),
+                                                   std::move(snap_ids),
+                                                   list_snaps_flags,
+                                                   snapshot_delta},
+                                  {}, 0, parent_trace, on_finish);
   }
 
   void send();
@@ -247,11 +280,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),
-      object_dispatch_layer(object_dispatch_layer), request(std::move(request)),
-      op_flags(op_flags), parent_trace(parent_trace) {
+      dispatch_layer(object_dispatch_layer), request(std::move(request)),
+      io_context(io_context), op_flags(op_flags), parent_trace(parent_trace) {
   }
 
 };