From 94b39c1c696c48665d069c57e6611ec64616aede Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 18 Jul 2019 14:28:33 -0500 Subject: [PATCH] osd/PeeringState: take HeartbeatStamps refs for current interval Signed-off-by: Sage Weil --- src/osd/PG.cc | 5 +++++ src/osd/PG.h | 1 + src/osd/PeeringState.cc | 25 +++++++++++++++++++++++++ src/osd/PeeringState.h | 4 ++++ 4 files changed, 35 insertions(+) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index a829a778c85..160639f7435 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1805,6 +1805,11 @@ ceph::signedspan PG::get_mnow() return osd->get_mnow(); } +HeartbeatStampsRef PG::get_hb_stamps(int peer) +{ + return osd->get_hb_stamps(peer); +} + void PG::rebuild_missing_set_with_deletes(PGLog &pglog) { pglog.rebuild_missing_set_with_deletes( diff --git a/src/osd/PG.h b/src/osd/PG.h index 6c5963f7638..b146081c515 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -479,6 +479,7 @@ public: void send_pg_created(pg_t pgid) override; ceph::signedspan get_mnow() override; + HeartbeatStampsRef get_hb_stamps(int peer) override; void rebuild_missing_set_with_deletes(PGLog &pglog) override; diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 1ef59e15374..e8a7af1f059 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -686,6 +686,8 @@ void PeeringState::on_new_interval() pg_log.get_missing().may_include_deletes == !perform_deletes_during_peering()); + init_hb_stamps(); + pl->on_new_interval(); } @@ -738,6 +740,29 @@ void PeeringState::init_primary_up_acting( } } +void PeeringState::init_hb_stamps() +{ + if (is_primary()) { + // we care about all other osds in the acting set + hb_stamps.resize(acting.size() - 1); + unsigned i = 0; + for (auto p : acting) { + if (p == CRUSH_ITEM_NONE || p == get_primary().osd) { + continue; + } + hb_stamps[i++] = pl->get_hb_stamps(p); + } + hb_stamps.resize(i); + } else if (is_replica()) { + // we care about just the primary + hb_stamps.resize(1); + hb_stamps[0] = pl->get_hb_stamps(get_primary().osd); + } else { + hb_stamps.clear(); + } +} + + void PeeringState::clear_recovery_state() { async_recovery_targets.clear(); diff --git a/src/osd/PeeringState.h b/src/osd/PeeringState.h index d28d3350b93..bb70ecfba73 100644 --- a/src/osd/PeeringState.h +++ b/src/osd/PeeringState.h @@ -218,6 +218,7 @@ public: virtual void send_pg_created(pg_t pgid) = 0; virtual ceph::signedspan get_mnow() = 0; + virtual HeartbeatStampsRef get_hb_stamps(int peer) = 0; // ============ Flush state ================== /** @@ -1330,6 +1331,8 @@ public: /// union of acting, recovery, and backfill targets set acting_recovery_backfill; + vector hb_stamps; + bool send_notify = false; ///< True if a notify needs to be sent to the primary bool dirty_info = false; ///< small info structu on disk out of date @@ -1616,6 +1619,7 @@ public: const vector &newacting, int new_up_primary, int new_acting_primary); + void init_hb_stamps(); /// Set initial role void set_role(int r) { -- 2.39.5