{
if (qi.is_peering()) {
dout(20) << __func__ << " " << pgid
- << " no pg, peering, item epoch is "
+ << " peering, item epoch is "
<< qi.get_map_epoch()
<< ", will wait on " << qi << dendl;
slot.waiting_peering[qi.get_map_epoch()].push_back(std::move(qi));
} else {
dout(20) << __func__ << " " << pgid
- << " no pg, item epoch is "
+ << " item epoch is "
<< qi.get_map_epoch()
<< ", will wait on " << qi << dendl;
slot.waiting.push_back(std::move(qi));
sdata->sdata_op_ordering_lock.Unlock();
return;
}
+ if (qi.is_peering()) {
+ OSDMapRef osdmap = sdata->waiting_for_pg_osdmap;
+ if (qi.get_map_epoch() > osdmap->get_epoch()) {
+ _add_slot_waiter(token, slot, std::move(qi));
+ sdata->sdata_op_ordering_lock.Unlock();
+ pg->unlock();
+ return;
+ }
+ }
sdata->sdata_op_ordering_lock.Unlock();
if (pushes_to_free) {
{
dout(10) << "take_waiters" << dendl;
requeue_map_waiters();
- for (auto i = peering_waiters.rbegin();
- i != peering_waiters.rend();
- ++i) {
- osd->osd->enqueue_peering_evt_front(info.pgid, *i);
- }
- peering_waiters.clear();
}
void PG::do_peering_event(PGPeeringEventRef evt, RecoveryCtx *rctx)
{
dout(10) << __func__ << ": " << evt->get_desc() << dendl;
- if (!have_same_or_newer_map(evt->get_epoch_sent())) {
- dout(10) << "deferring event " << evt->get_desc() << dendl;
- peering_waiters.push_back(evt);
- } else if (old_peering_evt(evt)) {
+ assert(have_same_or_newer_map(evt->get_epoch_sent()));
+ if (old_peering_evt(evt)) {
dout(10) << "discard old " << evt->get_desc() << dendl;
} else {
recovery_state.handle_event(evt, rctx);
};
- list<PGPeeringEventRef> peering_waiters;
-
struct QueryState : boost::statechart::event< QueryState > {
Formatter *f;
explicit QueryState(Formatter *f) : f(f) {}