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);
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();
}
}
+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()) {
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