From: Kefu Chai Date: Thu, 28 Feb 2019 13:48:27 +0000 (+0800) Subject: crimson/osd: init primary state in PG::read_state() X-Git-Tag: v15.0.0~187^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9e130c2aada5af035d724288b2f29910ae96647a;p=ceph-ci.git crimson/osd: init primary state in PG::read_state() Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 7473a595164..6cc04c30ff4 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -27,12 +27,56 @@ seastar::future<> PG::read_state(ceph::os::CyanStore* store) { return PGMeta{store, pgid}.load().then( [this](pg_info_t pg_info_, PastIntervals past_intervals_) { - last_written_info = std::move(pg_info_); + info = std::move(pg_info_); + last_written_info = info; past_intervals = std::move(past_intervals_); + // initialize current mapping + { + vector new_up, new_acting; + int new_up_primary, new_acting_primary; + osdmap->pg_to_up_acting_osds(pgid.pgid, + &new_up, &new_up_primary, + &new_acting, &new_acting_primary); + update_primary_state(new_up, new_up_primary, + new_acting, new_acting_primary); + } return seastar::now(); }); } +void +PG::update_primary_state(const std::vector& new_up, + int new_up_primary, + const std::vector& new_acting, + int new_acting_primary) +{ + auto collect_pg_shards = + [is_erasure=pool.is_erasure()](const std::vector& osds, + int osd_primary) { + int8_t index = 0; + pg_shard_set_t collected; + pg_shard_t pg_primary; + for (auto osd : osds) { + if (osd != CRUSH_ITEM_NONE) { + pg_shard_t pg_shard{ + osd, is_erasure ? shard_id_t{index} : shard_id_t::NO_SHARD}; + if (osd == osd_primary) { + pg_primary = pg_shard; + } + collected.insert(pg_shard); + } + index++; + } + return std::make_pair(collected, pg_primary); + }; + acting = new_acting; + std::tie(actingset, primary) = collect_pg_shards(acting, new_acting_primary); + ceph_assert(primary.osd == new_acting_primary); + up = new_up; + std::tie(upset, up_primary) = collect_pg_shards(up, new_up_primary); + ceph_assert(up_primary.osd == new_up_primary); +} + epoch_t PG::get_osdmap_epoch() const { return osdmap->get_epoch(); @@ -52,3 +96,13 @@ const PastIntervals& PG::get_past_intervals() const { return past_intervals; } + +pg_shard_t PG::get_primary() const +{ + return primary; +} + +bool PG::is_primary() const +{ + return whoami == primary; +} diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index ce770825f24..bb7fcdfacf6 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -40,10 +40,17 @@ public: epoch_t get_osdmap_epoch() const; const pg_info_t& get_info() const; const PastIntervals& get_past_intervals() const; + pg_shard_t get_primary() const; + bool is_primary() const; pg_shard_t get_whoami() const; seastar::future<> read_state(ceph::os::CyanStore* store); +private: + void update_primary_state(const std::vector& new_up, + int new_up_primary, + const std::vector& new_acting, + int new_acting_primary); private: const spg_t pgid; pg_shard_t whoami; @@ -53,6 +60,11 @@ private: //< last written info, for fast info persistence 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; cached_map_t osdmap; ceph::net::Messenger* msgr = nullptr;