]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/messages/MOSDRepOp.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / messages / MOSDRepOp.h
index 9d087f391e6351572475a4964553ca7ddeaebc41..cd8f2a5a575f9d8c74719c94855c1e0d77e0f18c 100644 (file)
  * OSD sub op - for internal ops on pobjects between primary and replicas(/stripes/whatever)
  */
 
-class MOSDRepOp : public MessageInstance<MOSDRepOp, MOSDFastDispatchOp> {
-public:
-  friend factory;
+class MOSDRepOp : public MOSDFastDispatchOp {
 private:
-  static constexpr int HEAD_VERSION = 2;
+  static constexpr int HEAD_VERSION = 3;
   static constexpr int COMPAT_VERSION = 1;
 
 public:
@@ -37,7 +35,7 @@ public:
 
   spg_t pgid;
 
-  bufferlist::const_iterator p;
+  ceph::buffer::list::const_iterator p;
   // Decoding flags. Decoding is only needed for messages caught by pipe reader.
   bool final_decode_needed;
 
@@ -48,7 +46,7 @@ public:
   __u8 acks_wanted;
 
   // transaction to exec
-  bufferlist logbl;
+  ceph::buffer::list logbl;
   pg_stat_t pg_stats;
 
   // subop metadata
@@ -56,14 +54,13 @@ public:
 
   // piggybacked osd/og state
   eversion_t pg_trim_to;   // primary->replica: trim to here
-  eversion_t pg_roll_forward_to;   // primary->replica: trim rollback
-                                    // info to here
+  eversion_t min_last_complete_ondisk; // lower bound on committed version
 
   hobject_t new_temp_oid;      ///< new temp object that we must now start tracking
   hobject_t discard_temp_oid;  ///< previously used temp object that we can now stop tracking
 
   /// non-empty if this transaction involves a hit_set history update
-  boost::optional<pg_hit_set_history_t> updated_hit_set_history;
+  std::optional<pg_hit_set_history_t> updated_hit_set_history;
 
   epoch_t get_map_epoch() const override {
     return map_epoch;
@@ -80,6 +77,7 @@ public:
   }
 
   void decode_payload() override {
+    using ceph::decode;
     p = payload.cbegin();
     // split to partial and final
     decode(map_epoch, p);
@@ -94,6 +92,7 @@ public:
   }
 
   void finish_decode() {
+    using ceph::decode;
     if (!final_decode_needed)
       return; // Message is already final decoded
     decode(poid, p);
@@ -110,7 +109,15 @@ public:
 
     decode(from, p);
     decode(updated_hit_set_history, p);
-    decode(pg_roll_forward_to, p);
+
+    if (header.version >= 3) {
+      decode(min_last_complete_ondisk, p);
+    } else {
+      /* This field used to mean pg_roll_foward_to, but ReplicatedBackend
+       * simply assumes that we're rolling foward to version. */
+      eversion_t pg_roll_forward_to;
+      decode(pg_roll_forward_to, p);
+    }
     final_decode_needed = false;
   }
 
@@ -137,17 +144,17 @@ public:
     encode(discard_temp_oid, payload);
     encode(from, payload);
     encode(updated_hit_set_history, payload);
-    encode(pg_roll_forward_to, payload);
+    encode(min_last_complete_ondisk, payload);
   }
 
   MOSDRepOp()
-    : MessageInstance(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION),
+    : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
       map_epoch(0),
       final_decode_needed(true), acks_wanted (0) {}
   MOSDRepOp(osd_reqid_t r, pg_shard_t from,
            spg_t p, const hobject_t& po, int aw,
            epoch_t mape, epoch_t min_epoch, ceph_tid_t rtid, eversion_t v)
-    : MessageInstance(MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION),
+    : MOSDFastDispatchOp{MSG_OSD_REPOP, HEAD_VERSION, COMPAT_VERSION},
       map_epoch(mape),
       min_epoch(min_epoch),
       reqid(r),
@@ -159,22 +166,34 @@ public:
       version(v) {
     set_tid(rtid);
   }
+
+  void set_rollback_to(const eversion_t &rollback_to) {
+    header.version = 2;
+    min_last_complete_ondisk = rollback_to;
+  }
 private:
   ~MOSDRepOp() override {}
 
 public:
   std::string_view get_type_name() const override { return "osd_repop"; }
-  void print(ostream& out) const override {
+  void print(std::ostream& out) const override {
     out << "osd_repop(" << reqid
        << " " << pgid << " e" << map_epoch << "/" << min_epoch;
     if (!final_decode_needed) {
       out << " " << poid << " v " << version;
       if (updated_hit_set_history)
         out << ", has_updated_hit_set_history";
+      if (header.version < 3) {
+       out << ", rollback_to(legacy)=" << min_last_complete_ondisk;
+      } else {
+       out << ", mlcod=" << min_last_complete_ondisk;
+      }
     }
     out << ")";
   }
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
 };
 
-
 #endif