}
-blocking_future<Ref<PG>>
-OSD::get_or_create_pg(
- spg_t pgid,
- epoch_t epoch,
- std::unique_ptr<PGCreateInfo> 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<Ref<PG>>(pg_map.get_pg(pgid));
- }
-}
-
seastar::future<Ref<PG>>
OSD::get_or_create_pg(
PGMap::PGCreationBlockingEvent::TriggerI&& trigger,
}
}
-blocking_future<Ref<PG>> OSD::wait_for_pg(
- spg_t pgid)
-{
- return pg_map.wait_for_pg(pgid).first;
-}
-
seastar::future<Ref<PG>> OSD::wait_for_pg(
PGMap::PGCreationBlockingEvent::TriggerI&& trigger, spg_t pgid)
{
friend class RemotePeeringEvent;
public:
- blocking_future<Ref<PG>> get_or_create_pg(
- spg_t pgid,
- epoch_t epoch,
- std::unique_ptr<PGCreateInfo> info);
seastar::future<Ref<PG>> get_or_create_pg(
PGMap::PGCreationBlockingEvent::TriggerI&&,
spg_t pgid,
epoch_t epoch,
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);
f->dump_bool("creating", creating);
}
-std::pair<blocking_future<Ref<PG>>, bool> PGMap::wait_for_pg(spg_t pgid)
-{
- if (auto pg = get_pg(pgid)) {
- return make_pair(make_ready_blocking_future<Ref<PG>>(pg), true);
- } else {
- auto &state = pgs_creating.emplace(pgid, pgid).first->second;
- return make_pair(
- state.make_blocking_future(state.promise.get_shared_future()),
- state.creating);
- }
-}
-
std::pair<seastar::future<Ref<PG>>, bool>
PGMap::wait_for_pg(PGCreationBlockingEvent::TriggerI&& trigger, spg_t pgid)
{
* 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);