Instead, pass into get_map.
Signed-off-by: Samuel Just <sjust@redhat.com>
update_stats();
}},
asok{seastar::make_lw_shared<crimson::admin::AdminSocket>()},
- osdmap_gate("OSD::osdmap_gate", std::make_optional(std::ref(shard_services))),
+ osdmap_gate("OSD::osdmap_gate"),
log_client(cluster_msgr.get(), LogClient::NO_FLAGS),
clog(log_client.create_channel())
{
OSD_OSDMapGate::OSDMapBlocker::BlockingEvent;
return opref.template with_blocking_event<OSDMapBlockingEvent>(
[this, &opref](auto &&trigger) {
- return osdmap_gate.wait_for_map(std::move(trigger),
- opref.get_epoch());
+ return osdmap_gate.wait_for_map(
+ std::move(trigger),
+ opref.get_epoch(),
+ &shard_services
+ );
});
}).then([&logger, &opref](auto epoch) {
logger.debug("{}: got map {}, entering get_pg", opref, epoch);
return with_blocking_event<
PG_OSDMapGate::OSDMapBlocker::BlockingEvent
>([this, &pg] (auto&& trigger) {
- return pg.osdmap_gate.wait_for_map(std::move(trigger),
- m->get_min_epoch());
+ return pg.osdmap_gate.wait_for_map(
+ std::move(trigger),
+ m->get_min_epoch());
});
}).then_interruptible([this, this_instance_id, &pg](auto map) {
logger().debug("{}.{}: after wait_for_map", *this, this_instance_id);
template <OSDMapGateType OSDMapGateTypeV>
seastar::future<epoch_t> OSDMapGate<OSDMapGateTypeV>::wait_for_map(
typename OSDMapBlocker::BlockingEvent::TriggerI&& trigger,
- epoch_t epoch)
+ epoch_t epoch,
+ ShardServices *shard_services)
{
if (__builtin_expect(stopping, false)) {
return seastar::make_exception_future<epoch_t>(
auto fut = blocker.promise.get_shared_future();
if (shard_services) {
return trigger.maybe_record_blocking(
- (*shard_services).get().osdmap_subscribe(current, true).then(
+ shard_services->osdmap_subscribe(current, true).then(
[fut=std::move(fut)]() mutable {
return std::move(fut);
}),
const char *blocker_type;
waiting_peering_t waiting_peering;
epoch_t current = 0;
- std::optional<std::reference_wrapper<ShardServices>> shard_services;
bool stopping = false;
public:
- OSDMapGate(
- const char *blocker_type,
- std::optional<std::reference_wrapper<ShardServices>> shard_services)
- : blocker_type(blocker_type), shard_services(shard_services) {}
-
- // wait for an osdmap whose epoch is greater or equal to given epoch
- // TODO: define me!
+ OSDMapGate(const char *blocker_type)
+ : blocker_type(blocker_type) {}
+
+ /**
+ * wait_for_map
+ *
+ * Wait for an osdmap whose epoch is greater or equal to given epoch.
+ * If shard_services is non-null, request map if not present.
+ */
seastar::future<epoch_t>
- wait_for_map(typename OSDMapBlocker::BlockingEvent::TriggerI&& trigger,
- epoch_t epoch);
+ wait_for_map(
+ typename OSDMapBlocker::BlockingEvent::TriggerI&& trigger,
+ epoch_t epoch,
+ ShardServices *shard_services=nullptr
+ );
void got_map(epoch_t epoch);
seastar::future<> stop();
};
pg_whoami{pg_shard},
coll_ref{coll_ref},
pgmeta_oid{pgid.make_pgmeta_oid()},
- osdmap_gate("PG::osdmap_gate", std::nullopt),
+ osdmap_gate("PG::osdmap_gate"),
shard_services{shard_services},
osdmap{osdmap},
backend(