From 12af68c24d2ea0cfd540f4da0a4f765b8212396d Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Wed, 29 Mar 2023 16:42:09 +0000 Subject: [PATCH] crimson/osd/heartbeat: add latest epoch sent concept Signed-off-by: Matan Breizman --- src/crimson/osd/heartbeat.cc | 23 +++++++++++++++++++++++ src/crimson/osd/heartbeat.h | 9 +++++++++ 2 files changed, 32 insertions(+) diff --git a/src/crimson/osd/heartbeat.cc b/src/crimson/osd/heartbeat.cc index a557772d62c64..a728c327fcc86 100644 --- a/src/crimson/osd/heartbeat.cc +++ b/src/crimson/osd/heartbeat.cc @@ -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) { diff --git a/src/crimson/osd/heartbeat.h b/src/crimson/osd/heartbeat.h index 325c9c3e57580..73fcdf7885f7c 100644 --- a/src/crimson/osd/heartbeat.h +++ b/src/crimson/osd/heartbeat.h @@ -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 { -- 2.39.5