logger().debug("{}: start", *this);
IRef ref = this;
- return get_pg().then([this](Ref<PG> pg) {
+ return [this] {
+ if (delay) {
+ return seastar::sleep(std::chrono::milliseconds(
+ std::lround(delay*1000)));
+ } else {
+ return seastar::now();
+ }
+ }().then([this] {
+ return get_pg();
+ }).then([this](Ref<PG> pg) {
if (!pg) {
logger().warn("{}: pg absent, did not create", *this);
on_pg_absent();
PeeringCtx ctx;
pg_shard_t from;
spg_t pgid;
+ float delay = 0;
PGPeeringEvent evt;
const pg_shard_t get_from() const {
pgid(pgid),
evt(std::forward<Args>(args)...)
{}
-
+ template <typename... Args>
+ PeeringEvent(
+ ShardServices &shard_services, const pg_shard_t &from, const spg_t &pgid,
+ float delay, Args&&... args) :
+ shard_services(shard_services),
+ ctx{ceph_release_t::octopus},
+ from(from),
+ pgid(pgid),
+ delay(delay),
+ evt(std::forward<Args>(args)...)
+ {}
void print(std::ostream &) const final;
void dump_detail(ceph::Formatter* f) const final;
}
template <typename T>
- void start_peering_event_operation(T &&evt) {
+ void start_peering_event_operation(T &&evt, float delay = 0) {
shard_services.start_operation<LocalPeeringEvent>(
this,
shard_services,
pg_whoami,
pgid,
+ delay,
std::forward<T>(evt));
}
void schedule_event_after(
PGPeeringEventRef event,
float delay) final {
- // TODO: this is kind of a hack -- once the start_operation call
- // happens, the operation will be registered, but during the delay
- // it's just a dangling future. It would be nice for the
- // operation machinery to have something to take care of this.
- (void)seastar::sleep(std::chrono::milliseconds(std::lround(delay*1000))).then(
- [this, event=std::move(event)]() {
- start_peering_event_operation(std::move(*event));
- });
+ start_peering_event_operation(std::move(*event), delay);
}
std::vector<pg_shard_t> get_replica_recovery_order() const final {
return peering_state.get_replica_recovery_order();