]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/heartbeat: add latest epoch sent concept 50227/head
authorMatan Breizman <mbreizma@redhat.com>
Wed, 29 Mar 2023 16:42:09 +0000 (16:42 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 27 Apr 2023 16:12:05 +0000 (16:12 +0000)
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
src/crimson/osd/heartbeat.cc
src/crimson/osd/heartbeat.h

index a557772d62c64ddba0e2121478121b87db43b85b..a728c327fcc867730ce901ddc4acf3599f29050d 100644 (file)
@@ -304,6 +304,29 @@ seastar::future<> Heartbeat::maybe_share_osdmap(
 {
   const osd_id_t from = m->get_source().num();
   const epoch_t osdmap_epoch = service.get_map()->get_epoch();
+  const epoch_t peer_epoch = m->map_epoch;
+  auto found = peers.find(from);
+  if (found == peers.end()) {
+    return seastar::now();
+  }
+  auto& peer = found->second;
+
+  if (peer_epoch > peer.get_last_epoch_sent()) {
+    logger().debug("{} updating session's last epoch sent "
+                   "from {} to peer's (id: {}) map epoch of {}",
+                   __func__, peer.get_last_epoch_sent(),
+                   from, peer_epoch);
+    peer.set_last_epoch_sent(peer_epoch);
+  }
+
+  if (osdmap_epoch <= peer.get_last_epoch_sent()) {
+    logger().info("{} latest epoch sent {} is already later "
+                  "than osdmap epoch of {}",
+                  __func__ , peer.get_last_epoch_sent(),
+                  osdmap_epoch);
+    return seastar::now();
+  }
+
   logger().info("{} peer id: {} epoch is {} while osdmap is {}",
                 __func__ , from, m->map_epoch, osdmap_epoch);
   if (osdmap_epoch > m->map_epoch) {
index 325c9c3e575804a5c9927640f64b42ea4c536502..73fcdf7885f7c83c58d81893917148383ffc3d82 100644 (file)
@@ -276,6 +276,10 @@ class Heartbeat::Session {
 
   void set_epoch_added(epoch_t epoch_) { epoch = epoch_; }
   epoch_t get_epoch_added() const { return epoch; }
+
+  void set_last_epoch_sent(epoch_t epoch_) { last_sent_epoch = epoch_; }
+  epoch_t get_last_epoch_sent() const { return last_sent_epoch; }
+
   bool is_started() const { return connected; }
   bool pinged() const {
     if (clock::is_zero(first_tx)) {
@@ -385,6 +389,8 @@ class Heartbeat::Session {
   clock::time_point last_rx_back;
   // most recent epoch we wanted this peer
   epoch_t epoch; // rename me to epoch_added
+  // last epoch sent
+  epoch_t last_sent_epoch = 0;
 
   struct reply_t {
     clock::time_point deadline;
@@ -408,6 +414,9 @@ class Heartbeat::Peer final : private Heartbeat::ConnectionListener {
   void set_epoch_added(epoch_t epoch) { session.set_epoch_added(epoch); }
   epoch_t get_epoch_added() const { return session.get_epoch_added(); }
 
+  void set_last_epoch_sent(epoch_t epoch) { session.set_last_epoch_sent(epoch); }
+  epoch_t get_last_epoch_sent() const { return session.get_last_epoch_sent(); }
+
   // if failure, return time_point since last active
   // else, return clock::zero()
   clock::time_point failed_since(clock::time_point now) const {