]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/PeeringState: piggyback pg_lease on MOSDPGLog
authorSage Weil <sage@redhat.com>
Tue, 6 Aug 2019 03:22:15 +0000 (22:22 -0500)
committerSage Weil <sage@redhat.com>
Sat, 28 Sep 2019 16:51:18 +0000 (11:51 -0500)
We only do this for primary -> replica, so we only need to proc_lease()
from the replica states.

Signed-off-by: Sage Weil <sage@redhat.com>
src/messages/MOSDPGLog.h
src/osd/PGPeeringEvent.cc
src/osd/PGPeeringEvent.h
src/osd/PeeringState.cc

index de3a50e0c0924b79805f9dd8b34f85fdf6bcde1b..0fdc65862a7ea6ec096bf69fba791ff946205f36 100644 (file)
@@ -21,7 +21,7 @@
 
 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;
@@ -38,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); }
@@ -89,6 +90,9 @@ public:
     // swapped out by OSD code.
     out << "log " << log
        << " pi " << past_intervals;
+    if (lease) {
+      out << " " << *lease;
+    }
   }
 
   void encode_payload(uint64_t features) override {
@@ -106,6 +110,7 @@ public:
     encode(past_intervals, payload);
     encode(to, payload);
     encode(from, payload);
+    encode(lease, payload);
   }
   void decode_payload() override {
     using ceph::decode;
@@ -118,6 +123,9 @@ public:
     decode(past_intervals, p);
     decode(to, p);
     decode(from, p);
+    if (header.version >= 6) {
+      decode(lease, p);
+    }
   }
 private:
   template<class T, typename... Args>
index 79c21b826b959ff3d434ddb5c5ba093cdaa4db06..2d28c6f84abb68bdc9c56430776ba8a2f11530e5 100644 (file)
@@ -7,5 +7,11 @@
 
 MEMPOOL_DEFINE_OBJECT_FACTORY(PGPeeringEvent, pg_peering_evt, osd);
 
-MLogRec::MLogRec(pg_shard_t from, MOSDPGLog *msg) :
-  from(from), msg(msg) {}
+MLogRec::MLogRec(pg_shard_t from, MOSDPGLog *msg)
+  : from(from), msg(msg) {}
+
+void MLogRec::print(std::ostream *out) const
+{
+  *out << "MLogRec from " << from << " ";
+  msg->inner_print(*out);
+}
index efe191d35cb8ceff3096085a81936290309b6989..2828880f6565aca4a9b9701ebc9e6c7892d5f429 100644 (file)
@@ -95,9 +95,7 @@ struct MLogRec : boost::statechart::event< MLogRec > {
   pg_shard_t from;
   boost::intrusive_ptr<MOSDPGLog> msg;
   MLogRec(pg_shard_t from, MOSDPGLog *msg);
-  void print(std::ostream *out) const {
-    *out << "MLogRec from " << from;
-  }
+  void print(std::ostream *out) const;
 };
 
 struct MNotifyRec : boost::statechart::event< MNotifyRec > {
index a3293e8301567aceeea87ac3a41b1a3fd0b5a745..105341698a9d25165d5f6b0900d1a67536f63b2b 100644 (file)
@@ -2498,8 +2498,9 @@ void PeeringState::activate(
       }
 
       if (m) {
-       dout(10) << "activate peer osd." << peer << " sending " << m->log << dendl;
-       //m->log.print(cout);
+       dout(10) << "activate peer osd." << peer << " sending " << m->log
+                << dendl;
+       m->lease = get_lease();
        pl->send_cluster_message(peer.osd, m, get_osdmap_epoch());
       }
 
@@ -5959,6 +5960,9 @@ boost::statechart::result PeeringState::ReplicaActive::react(const MLogRec& loge
   ObjectStore::Transaction &t = context<PeeringMachine>().get_cur_transaction();
   ps->merge_log(t, logevt.msg->info, logevt.msg->log, logevt.from);
   ceph_assert(ps->pg_log.get_head() == ps->info.last_update);
+  if (logevt.msg->lease) {
+    ps->proc_lease(*logevt.msg->lease);
+  }
 
   return discard_event();
 }
@@ -6060,6 +6064,9 @@ boost::statechart::result PeeringState::Stray::react(const MLogRec& logevt)
   } else {
     ps->merge_log(t, msg->info, msg->log, logevt.from);
   }
+  if (logevt.msg->lease) {
+    ps->proc_lease(*logevt.msg->lease);
+  }
 
   ceph_assert(ps->pg_log.get_head() == ps->info.last_update);