From f36bd19a33b7d4237f21af1c6433dfd7eb8c475c Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Tue, 5 Mar 2019 20:55:45 +0800 Subject: [PATCH] crimson/osd/pg: add peer_activated add facilities for updating peer_activated. it is used for tracking the peers has activated and committed. once all of them ack the activation proposed by primary, the PG is considered activated. Signed-off-by: Kefu Chai --- src/crimson/osd/pg.cc | 19 +++++++++++++++++++ src/crimson/osd/pg.h | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 7310b49314b..bc53e4c995d 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -524,6 +524,25 @@ pg_notify_t PG::get_notify(epoch_t query_epoch) const info}; } +bool PG::is_last_activated_peer(pg_shard_t peer) +{ + if (!acting_recovery_backfill.count(peer)) + return false; + if (!peer_activated.insert(peer).second) + return false; + logger().info("peer osd.{} activated and committed", peer); + return peer_activated.size() == acting_recovery_backfill.size(); +} + + +void PG::clear_primary_state() +{ + peer_info.clear(); + want_acting.clear(); + need_up_thru = 0; + peer_activated.clear(); +} + seastar::future<> PG::do_peering_event(std::unique_ptr evt) { // todo diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index f39e806e0c3..1f3ec6dc0af 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -80,6 +80,9 @@ public: // peering/recovery bool should_send_notify() const; pg_notify_t get_notify(epoch_t query_epoch) const; + bool is_last_activated_peer(pg_shard_t peer); + void clear_primary_state(); + seastar::future<> do_peering_event(std::unique_ptr evt); seastar::future<> handle_advance_map(cached_map_t next_map); seastar::future<> handle_activate_map(); @@ -99,8 +102,10 @@ private: bool should_notify_primary = false; + using pg_shard_set_t = std::set; // peer_info -- projected (updates _before_ replicas ack) peer_info_t peer_info; //< info from peers (stray or prior) + pg_shard_set_t peer_activated; //< pg state pg_info_t info; @@ -108,7 +113,6 @@ private: pg_info_t last_written_info; PastIntervals past_intervals; // primary state - using pg_shard_set_t = std::set; pg_shard_t primary, up_primary; std::vector acting, up; pg_shard_set_t actingset, upset; -- 2.39.5