From 8dc68d3c1abc0ca60519558a1f93e58210776eed Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sun, 6 Sep 2020 14:47:01 +0800 Subject: [PATCH] crimson/osd: add OSD::get_pg() for implementing asock commands. and add `PGMap::get_pg()` as a helper Signed-off-by: Kefu Chai --- src/crimson/osd/osd.cc | 21 +++++++++++++++------ src/crimson/osd/osd.h | 1 + src/crimson/osd/pg_map.cc | 17 ++++++++++++----- src/crimson/osd/pg_map.h | 7 ++++++- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 427bb15ba0275..d271f289ea41e 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -1294,18 +1294,27 @@ OSD::get_or_create_pg( epoch_t epoch, std::unique_ptr info) { - auto [fut, creating] = pg_map.get_pg(pgid, bool(info)); - if (!creating && info) { - pg_map.set_creating(pgid); - (void)handle_pg_create_info(std::move(info)); + if (info) { + auto [fut, creating] = pg_map.wait_for_pg(pgid); + if (!creating) { + pg_map.set_creating(pgid); + (void)handle_pg_create_info(std::move(info)); + } + return std::move(fut); + } else { + return make_ready_blocking_future>(pg_map.get_pg(pgid)); } - return std::move(fut); } blocking_future> OSD::wait_for_pg( spg_t pgid) { - return pg_map.get_pg(pgid).first; + return pg_map.wait_for_pg(pgid).first; +} + +Ref OSD::get_pg(spg_t pgid) +{ + return pg_map.get_pg(pgid); } seastar::future<> OSD::prepare_to_stop() diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index ba9bdf575d946..48df70f6233e1 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -232,6 +232,7 @@ public: std::unique_ptr info); blocking_future> wait_for_pg( spg_t pgid); + Ref get_pg(spg_t pgid); bool should_restart() const; seastar::future<> restart(); diff --git a/src/crimson/osd/pg_map.cc b/src/crimson/osd/pg_map.cc index 93d99ce9982ed..08071f2604fec 100644 --- a/src/crimson/osd/pg_map.cc +++ b/src/crimson/osd/pg_map.cc @@ -23,12 +23,10 @@ void PGMap::PGCreationState::dump_detail(Formatter *f) const f->dump_bool("creating", creating); } -std::pair>, bool> PGMap::get_pg(spg_t pgid, bool wait) +std::pair>, bool> PGMap::wait_for_pg(spg_t pgid) { - if (auto pg = pgs.find(pgid); pg != pgs.end()) { - return make_pair(make_ready_blocking_future>(pg->second), true); - } else if (!wait) { - return make_pair(make_ready_blocking_future>(nullptr), true); + if (auto pg = get_pg(pgid)) { + return make_pair(make_ready_blocking_future>(pg), true); } else { auto &state = pgs_creating.emplace(pgid, pgid).first->second; return make_pair( @@ -37,6 +35,15 @@ std::pair>, bool> PGMap::get_pg(spg_t pgid, bool wait) } } +Ref PGMap::get_pg(spg_t pgid) +{ + if (auto pg = pgs.find(pgid); pg != pgs.end()) { + return pg->second; + } else { + return nullptr; + } +} + void PGMap::set_creating(spg_t pgid) { logger().debug("Creating {}", pgid); diff --git a/src/crimson/osd/pg_map.h b/src/crimson/osd/pg_map.h index 67f1a6a505b99..b3fe4b562db03 100644 --- a/src/crimson/osd/pg_map.h +++ b/src/crimson/osd/pg_map.h @@ -45,7 +45,12 @@ public: * Get future for pg with a bool indicating whether it's already being * created. */ - std::pair>, bool> get_pg(spg_t pgid, bool wait=true); + std::pair>, bool> wait_for_pg(spg_t pgid); + + /** + * get PG in non-blocking manner + */ + Ref get_pg(spg_t pgid); /** * Set creating -- 2.39.5