From: Radosław Zarzyński Date: Wed, 13 Apr 2022 07:19:33 +0000 (+0200) Subject: crimson/osd: PGMap blocker does support new tracking infra X-Git-Tag: v18.0.0~947^2~27 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cc71d8afe9de7fc9d31e8defe21d98bad098bd15;p=ceph.git crimson/osd: PGMap blocker does support new tracking infra Signed-off-by: Radosław Zarzyński --- diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index a1e71de3bbe8..6a49fa820ee0 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -1436,6 +1436,12 @@ blocking_future> OSD::wait_for_pg( return pg_map.wait_for_pg(pgid).first; } +seastar::future> OSD::wait_for_pg( + PGMap::PGCreationBlockingEvent::TriggerI&& trigger, spg_t pgid) +{ + return pg_map.wait_for_pg(std::move(trigger), pgid).first; +} + Ref OSD::get_pg(spg_t pgid) { return pg_map.get_pg(pgid); diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index 3c4f894405d7..e144b6d89436 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -242,6 +242,8 @@ public: std::unique_ptr info); blocking_future> wait_for_pg( spg_t pgid); + seastar::future> wait_for_pg( + PGMap::PGCreationBlockingEvent::TriggerI&&, spg_t pgid); Ref get_pg(spg_t pgid); seastar::future<> send_beacon(); diff --git a/src/crimson/osd/pg_map.cc b/src/crimson/osd/pg_map.cc index 6a542aeba1dd..6c8d5754c4ce 100644 --- a/src/crimson/osd/pg_map.cc +++ b/src/crimson/osd/pg_map.cc @@ -37,6 +37,20 @@ std::pair>, bool> PGMap::wait_for_pg(spg_t pgid) } } +std::pair>, bool> +PGMap::wait_for_pg(PGCreationBlockingEvent::TriggerI&& trigger, spg_t pgid) +{ + if (auto pg = get_pg(pgid)) { + return make_pair(seastar::make_ready_future>(pg), true); + } else { + auto &state = pgs_creating.emplace(pgid, pgid).first->second; + return make_pair( + // TODO: add to blocker Trigger-taking make_blocking_future + trigger.maybe_record_blocking(state.promise.get_shared_future(), state), + state.creating); + } +} + Ref PGMap::get_pg(spg_t pgid) { if (auto pg = pgs.find(pgid); pg != pgs.end()) { diff --git a/src/crimson/osd/pg_map.h b/src/crimson/osd/pg_map.h index bef82edbca6f..1a06ee5c22e1 100644 --- a/src/crimson/osd/pg_map.h +++ b/src/crimson/osd/pg_map.h @@ -40,11 +40,15 @@ class PGMap { pgs_t pgs; public: + using PGCreationBlocker = PGCreationState; + using PGCreationBlockingEvent = PGCreationBlocker::BlockingEvent; /** * Get future for pg with a bool indicating whether it's already being * created. */ std::pair>, bool> wait_for_pg(spg_t pgid); + std::pair>, bool> + wait_for_pg(PGCreationBlockingEvent::TriggerI&&, spg_t pgid); /** * get PG in non-blocking manner