]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/messages/MOSDPGLog.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / messages / MOSDPGLog.h
index 6c9728ef405b8f9305152755ba208578b497c220..0fdc65862a7ea6ec096bf69fba791ff946205f36 100644 (file)
 #define CEPH_MOSDPGLOG_H
 
 #include "messages/MOSDPeeringOp.h"
+#include "osd/PGPeeringEvent.h"
 
-class MOSDPGLog : public MessageInstance<MOSDPGLog, MOSDPeeringOp> {
-public:
-  friend factory;
+class MOSDPGLog : public MOSDPeeringOp {
 private:
-  static constexpr int HEAD_VERSION = 5;
+  static constexpr int HEAD_VERSION = 6;
   static constexpr int COMPAT_VERSION = 5;
 
   epoch_t epoch = 0;
@@ -39,6 +38,7 @@ public:
   pg_log_t log;
   pg_missing_t missing;
   PastIntervals past_intervals;
+  std::optional<pg_lease_t> lease;
 
   epoch_t get_epoch() const { return epoch; }
   spg_t get_pgid() const { return spg_t(info.pgid.pgid, to); }
@@ -68,12 +68,12 @@ public:
        false));
   }
 
-  MOSDPGLog() : MessageInstance(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION) {
+  MOSDPGLog() : MOSDPeeringOp{MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION} {
     set_priority(CEPH_MSG_PRIO_HIGH); 
   }
   MOSDPGLog(shard_id_t to, shard_id_t from,
-           version_t mv, pg_info_t& i, epoch_t query_epoch)
-    : MessageInstance(MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION),
+           version_t mv, const pg_info_t& i, epoch_t query_epoch)
+    : MOSDPeeringOp{MSG_OSD_PG_LOG, HEAD_VERSION, COMPAT_VERSION},
       epoch(mv), query_epoch(query_epoch),
       to(to), from(from),
       info(i)  {
@@ -85,11 +85,14 @@ private:
 
 public:
   std::string_view get_type_name() const override { return "PGlog"; }
-  void inner_print(ostream& out) const override {
+  void inner_print(std::ostream& out) const override {
     // NOTE: log is not const, but operator<< doesn't touch fields
     // swapped out by OSD code.
     out << "log " << log
        << " pi " << past_intervals;
+    if (lease) {
+      out << " " << *lease;
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -97,7 +100,7 @@ public:
     encode(epoch, payload);
     encode(info, payload);
     encode(log, payload);
-    encode(missing, payload);
+    encode(missing, payload, features);
     if (!HAVE_FEATURE(features, SERVER_NAUTILUS)) {
       // pre-nautilus OSDs do not set last_peering_reset properly
       encode(epoch, payload);
@@ -107,8 +110,10 @@ public:
     encode(past_intervals, payload);
     encode(to, payload);
     encode(from, payload);
+    encode(lease, payload);
   }
   void decode_payload() override {
+    using ceph::decode;
     auto p = payload.cbegin();
     decode(epoch, p);
     decode(info, p);
@@ -118,7 +123,13 @@ public:
     decode(past_intervals, p);
     decode(to, p);
     decode(from, p);
+    if (header.version >= 6) {
+      decode(lease, p);
+    }
   }
+private:
+  template<class T, typename... Args>
+  friend boost::intrusive_ptr<T> ceph::make_message(Args&&... args);
 };
 
 #endif