]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: PGMap blocker does support new tracking infra
authorRadosław Zarzyński <rzarzyns@redhat.com>
Wed, 13 Apr 2022 07:19:33 +0000 (09:19 +0200)
committerRadosław Zarzyński <rzarzyns@redhat.com>
Thu, 5 May 2022 02:06:31 +0000 (04:06 +0200)
Signed-off-by: Radosław Zarzyński <rzarzyns@redhat.com>
src/crimson/osd/osd.cc
src/crimson/osd/osd.h
src/crimson/osd/pg_map.cc
src/crimson/osd/pg_map.h

index a1e71de3bbe870e7840c4cd4a7adfcc90a490782..6a49fa820ee03af7006746e5327e6c20a6d6068f 100644 (file)
@@ -1436,6 +1436,12 @@ blocking_future<Ref<PG>> OSD::wait_for_pg(
   return pg_map.wait_for_pg(pgid).first;
 }
 
+seastar::future<Ref<PG>> OSD::wait_for_pg(
+  PGMap::PGCreationBlockingEvent::TriggerI&& trigger, spg_t pgid)
+{
+  return pg_map.wait_for_pg(std::move(trigger), pgid).first;
+}
+
 Ref<PG> OSD::get_pg(spg_t pgid)
 {
   return pg_map.get_pg(pgid);
index 3c4f894405d73ae040ddf1a8b879374bd32e4621..e144b6d89436426414b66019020b7df85929a656 100644 (file)
@@ -242,6 +242,8 @@ public:
     std::unique_ptr<PGCreateInfo> info);
   blocking_future<Ref<PG>> wait_for_pg(
     spg_t pgid);
+  seastar::future<Ref<PG>> wait_for_pg(
+    PGMap::PGCreationBlockingEvent::TriggerI&&, spg_t pgid);
   Ref<PG> get_pg(spg_t pgid);
   seastar::future<> send_beacon();
 
index 6a542aeba1dd94e943930f72e2fe6534efce7f5e..6c8d5754c4ce69b04027a6522b49242355a0c848 100644 (file)
@@ -37,6 +37,20 @@ std::pair<blocking_future<Ref<PG>>, bool> PGMap::wait_for_pg(spg_t pgid)
   }
 }
 
+std::pair<seastar::future<Ref<PG>>, bool>
+PGMap::wait_for_pg(PGCreationBlockingEvent::TriggerI&& trigger, spg_t pgid)
+{
+  if (auto pg = get_pg(pgid)) {
+    return make_pair(seastar::make_ready_future<Ref<PG>>(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<PG> PGMap::get_pg(spg_t pgid)
 {
   if (auto pg = pgs.find(pgid); pg != pgs.end()) {
index bef82edbca6f2a0192c78c5d3fa7f21e777a1595..1a06ee5c22e103fd4c8137c060ba48f22c28cff8 100644 (file)
@@ -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<blocking_future<Ref<PG>>, bool> wait_for_pg(spg_t pgid);
+  std::pair<seastar::future<Ref<PG>>, bool>
+  wait_for_pg(PGCreationBlockingEvent::TriggerI&&, spg_t pgid);
 
   /**
    * get PG in non-blocking manner