From cc71d8afe9de7fc9d31e8defe21d98bad098bd15 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Wed, 13 Apr 2022 09:19:33 +0200 Subject: [PATCH] crimson/osd: PGMap blocker does support new tracking infra MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Radosław Zarzyński --- src/crimson/osd/osd.cc | 6 ++++++ src/crimson/osd/osd.h | 2 ++ src/crimson/osd/pg_map.cc | 14 ++++++++++++++ src/crimson/osd/pg_map.h | 4 ++++ 4 files changed, 26 insertions(+) diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index a1e71de3bbe87..6a49fa820ee03 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 3c4f894405d73..e144b6d894364 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 6a542aeba1dd9..6c8d5754c4ce6 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 bef82edbca6f2..1a06ee5c22e10 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 -- 2.39.5