]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/librbd/io/ObjectRequest.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / librbd / io / ObjectRequest.h
index b9bd134451e2c394e33f6d35c9901fd4177c8cfd..89ca224cc90e75179d305183944ebd70824e1156 100644 (file)
@@ -6,16 +6,19 @@
 
 #include "include/int_types.h"
 #include "include/buffer.h"
+#include "include/neorados/RADOS.hpp"
 #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>
 
 class Context;
 class ObjectExtent;
 
+namespace neorados { struct WriteOp; }
+
 namespace librbd {
 
 struct ImageCtx;
@@ -35,31 +38,32 @@ 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, uint64_t off, uint64_t len,
-                librados::snap_t snap_id, const char *trace_name,
-                const ZTracer::Trace &parent_trace, Context *completion);
+  ObjectRequest(ImageCtxT *ictx, uint64_t objectno, IOContext io_context,
+                const char *trace_name, const ZTracer::Trace &parent_trace,
+                Context *completion);
   virtual ~ObjectRequest() {
     m_trace.event("finish");
   }
 
   static void add_write_hint(ImageCtxT& image_ctx,
-                             librados::ObjectWriteOperation *wr);
+                             neorados::WriteOp *wr);
 
   virtual void send() = 0;
 
@@ -73,8 +77,8 @@ protected:
   bool compute_parent_extents(Extents *parent_extents, bool read_request);
 
   ImageCtxT *m_ictx;
-  uint64_t m_object_no, m_object_off, m_object_len;
-  librados::snap_t m_snap_id;
+  uint64_t m_object_no;
+  IOContext m_io_context;
   Context *m_completion;
   ZTracer::Trace m_trace;
 
@@ -88,23 +92,20 @@ private:
 template <typename ImageCtxT = ImageCtx>
 class ObjectReadRequest : public ObjectRequest<ImageCtxT> {
 public:
-  typedef std::map<uint64_t, uint64_t> ExtentMap;
-
   static ObjectReadRequest* create(
-      ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
-      librados::snap_t snap_id, int op_flags,
-      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, Context *completion) {
-    return new ObjectReadRequest(ictx, objectno, offset, len,
-                                 snap_id, op_flags, parent_trace, read_data,
-                                 extent_map, completion);
+      ImageCtxT *ictx, uint64_t objectno, ReadExtents* extents,
+      IOContext io_context, int op_flags, int read_flags,
+      const ZTracer::Trace &parent_trace, uint64_t* version,
+      Context *completion) {
+    return new ObjectReadRequest(ictx, objectno, extents, io_context, op_flags,
+                                 read_flags, parent_trace, version, completion);
   }
 
   ObjectReadRequest(
-      ImageCtxT *ictx, uint64_t objectno, uint64_t offset, uint64_t len,
-      librados::snap_t snap_id, int op_flags,
-      const ZTracer::Trace &parent_trace, ceph::bufferlist* read_data,
-      ExtentMap* extent_map, Context *completion);
+      ImageCtxT *ictx, uint64_t objectno, ReadExtents* extents,
+      IOContext io_context, int op_flags, int read_flags,
+      const ZTracer::Trace &parent_trace, uint64_t* version,
+      Context *completion);
 
   void send() override;
 
@@ -134,10 +135,10 @@ private:
    * @endverbatim
    */
 
+  ReadExtents* m_extents;
   int m_op_flags;
-
-  ceph::bufferlist* m_read_data;
-  ExtentMap* m_extent_map;
+  int m_read_flags;
+  uint64_t* m_version;
 
   void read_object();
   void handle_read_object(int r);
@@ -153,7 +154,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 {
@@ -164,7 +165,7 @@ public:
     return OBJECT_EXISTS;
   }
 
-  virtual void add_copyup_ops(librados::ObjectWriteOperation *wr) {
+  virtual void add_copyup_ops(neorados::WriteOp *wr) {
     add_write_ops(wr);
   }
 
@@ -173,6 +174,8 @@ public:
   void send() override;
 
 protected:
+  uint64_t m_object_off;
+  uint64_t m_object_len;
   bool m_full_object = false;
   bool m_copyup_enabled = true;
 
@@ -189,13 +192,17 @@ protected:
     return false;
   }
 
-  virtual void add_write_hint(librados::ObjectWriteOperation *wr);
-  virtual void add_write_ops(librados::ObjectWriteOperation *wr) = 0;
+  virtual void add_write_hint(neorados::WriteOp *wr);
+  virtual void add_write_ops(neorados::WriteOp *wr) = 0;
 
   virtual int filter_write_result(int r) const {
     return r;
   }
 
+  virtual Extents get_copyup_overwrite_extents() const {
+    return {{m_object_off, m_object_len}};
+  }
+
 private:
   /**
    * @verbatim
@@ -228,9 +235,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;
@@ -256,12 +260,14 @@ 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_data(std::move(data)), m_op_flags(op_flags),
+      m_write_flags(write_flags), m_assert_version(assert_version) {
   }
 
   bool is_empty_write_op() const override {
@@ -273,11 +279,14 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(neorados::WriteOp *wr) override;
+  void add_write_hint(neorados::WriteOp *wr) override;
 
 private:
   ceph::bufferlist m_write_data;
   int m_op_flags;
+  int m_write_flags;
+  std::optional<uint64_t> m_assert_version;
 };
 
 template <typename ImageCtxT = ImageCtx>
@@ -285,10 +294,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) {
@@ -300,7 +309,6 @@ public:
         } else {
           m_discard_action = DISCARD_ACTION_TRUNCATE;
         }
-        this->m_object_len = 0;
       } else {
         m_discard_action = DISCARD_ACTION_REMOVE;
       }
@@ -345,29 +353,11 @@ protected:
     return (m_discard_action == DISCARD_ACTION_REMOVE);
   }
 
-  void add_write_hint(librados::ObjectWriteOperation *wr) override {
+  void add_write_hint(neorados::WriteOp *wr) override {
     // no hint for discard
   }
 
-  void add_write_ops(librados::ObjectWriteOperation *wr) override {
-    switch (m_discard_action) {
-    case DISCARD_ACTION_REMOVE:
-      wr->remove();
-      break;
-    case DISCARD_ACTION_REMOVE_TRUNCATE:
-      wr->create(false);
-      // fall through
-    case DISCARD_ACTION_TRUNCATE:
-      wr->truncate(this->m_object_off);
-      break;
-    case DISCARD_ACTION_ZERO:
-      wr->zero(this->m_object_off, this->m_object_len);
-      break;
-    default:
-      ceph_abort();
-      break;
-    }
-  }
+  void add_write_ops(neorados::WriteOp *wr) override;
 
 private:
   enum DiscardAction {
@@ -387,10 +377,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) {
   }
@@ -400,7 +390,7 @@ public:
   }
 
 protected:
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(neorados::WriteOp *wr) override;
 
 private:
   ceph::bufferlist m_write_data;
@@ -413,10 +403,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)),
@@ -427,7 +417,7 @@ public:
     return "compare_and_write";
   }
 
-  void add_copyup_ops(librados::ObjectWriteOperation *wr) override {
+  void add_copyup_ops(neorados::WriteOp *wr) override {
     // no-op on copyup
   }
 
@@ -436,10 +426,14 @@ protected:
     return true;
   }
 
-  void add_write_ops(librados::ObjectWriteOperation *wr) override;
+  void add_write_ops(neorados::WriteOp *wr) override;
 
   int filter_write_result(int r) const override;
 
+  Extents get_copyup_overwrite_extents() const override {
+    return {};
+  }
+
 private:
   ceph::bufferlist m_cmp_bl;
   ceph::bufferlist m_write_bl;
@@ -447,6 +441,52 @@ private:
   int m_op_flags;
 };
 
+template <typename ImageCtxT = ImageCtx>
+class ObjectListSnapsRequest : public ObjectRequest<ImageCtxT> {
+public:
+  static ObjectListSnapsRequest* create(
+      ImageCtxT *ictx, uint64_t objectno, Extents&& object_extents,
+      SnapIds&& snap_ids, int list_snaps_flags,
+      const ZTracer::Trace &parent_trace, SnapshotDelta* snapshot_delta,
+      Context *completion) {
+    return new ObjectListSnapsRequest(ictx, objectno,
+                                      std::move(object_extents),
+                                      std::move(snap_ids), list_snaps_flags,
+                                      parent_trace, snapshot_delta, completion);
+  }
+
+  ObjectListSnapsRequest(
+      ImageCtxT *ictx, uint64_t objectno, Extents&& object_extents,
+      SnapIds&& snap_ids, int list_snaps_flags,
+      const ZTracer::Trace &parent_trace, SnapshotDelta* snapshot_delta,
+      Context *completion);
+
+  void send() override;
+
+  const char *get_op_type() const override {
+    return "snap_list";
+  }
+
+private:
+  Extents m_object_extents;
+  SnapIds m_snap_ids;
+  int m_list_snaps_flags;
+  SnapshotDelta* m_snapshot_delta;
+
+  neorados::SnapSet m_snap_set;
+  boost::system::error_code m_ec;
+
+  SnapshotDelta m_parent_snapshot_delta;
+
+  void list_snaps();
+  void handle_list_snaps(int r);
+
+  void list_from_parent();
+  void handle_list_from_parent(int r);
+
+  void zero_extent(uint64_t snap_id, bool dne);
+};
+
 } // namespace io
 } // namespace librbd
 
@@ -457,5 +497,6 @@ extern template class librbd::io::ObjectWriteRequest<librbd::ImageCtx>;
 extern template class librbd::io::ObjectDiscardRequest<librbd::ImageCtx>;
 extern template class librbd::io::ObjectWriteSameRequest<librbd::ImageCtx>;
 extern template class librbd::io::ObjectCompareAndWriteRequest<librbd::ImageCtx>;
+extern template class librbd::io::ObjectListSnapsRequest<librbd::ImageCtx>;
 
 #endif // CEPH_LIBRBD_IO_OBJECT_REQUEST_H