GRANT = 1, // replica->primary: ok, i reserved it
REJECT = 2, // replica->primary: sorry, try again later (*)
RELEASE = 3, // primary->replcia: release the slot i reserved before
+ TOOFULL = 4, // replica->primary: too full, stop backfilling
// (*) NOTE: prior to luminous, REJECT was overloaded to also mean release
};
uint32_t type;
case RELEASE:
out << "RELEASE ";
break;
+ case TOOFULL:
+ out << "TOOFULL ";
+ break;
}
out << " pgid: " << pgid << ", query_epoch: " << query_epoch;
if (type == REQUEST) out << ", prio: " << priority;
header.compat_version = 3;
::encode(pgid.pgid, payload);
::encode(query_epoch, payload);
- ::encode(type == RELEASE ? REJECT : type, payload);
+ ::encode((type == RELEASE || type == TOOFULL) ?
+ REJECT : type, payload);
::encode(priority, payload);
::encode(pgid.shard, payload);
return;
// NOTE: this is replica -> primary "i reject your request"
// and also primary -> replica "cancel my previously-granted request"
// (for older peers)
+ // and also replica -> primary "i revoke your reservation"
+ // (for older peers)
evt = PG::CephPeeringEvtRef(
new PG::CephPeeringEvt(
m->query_epoch,
m->query_epoch,
m->query_epoch,
PG::RemoteReservationCanceled()));
+ } else if (m->type == MBackfillReserve::TOOFULL) {
+ evt = PG::CephPeeringEvtRef(
+ new PG::CephPeeringEvt(
+ m->query_epoch,
+ m->query_epoch,
+ PG::RemoteReservationRevokedTooFull()));
} else {
ceph_abort();
}
}
boost::statechart::result
-PG::RecoveryState::Backfilling::react(const RemoteReservationRejected &)
+PG::RecoveryState::Backfilling::react(const RemoteReservationRevokedTooFull &)
{
PG *pg = context< RecoveryMachine >().pg;
pg->osd->local_reserver.cancel_reservation(pg->info.pgid);
PG::RecoveryState::RepRecovering::react(const BackfillTooFull &)
{
PG *pg = context< RecoveryMachine >().pg;
- pg->reject_reservation();
+ pg->osd->send_message_osd_cluster(
+ pg->primary.osd,
+ new MBackfillReserve(
+ MBackfillReserve::TOOFULL,
+ spg_t(pg->info.pgid.pgid, pg->primary.shard),
+ pg->get_osdmap()->get_epoch()),
+ pg->get_osdmap()->get_epoch());
return discard_event();
}
TrivialEvent(RejectRemoteReservation)
public:
TrivialEvent(RemoteReservationRejected)
+ TrivialEvent(RemoteReservationRevokedTooFull)
TrivialEvent(RemoteReservationCanceled)
TrivialEvent(RequestBackfill)
TrivialEvent(RecoveryDone)
boost::statechart::transition< Backfilled, Recovered >,
boost::statechart::custom_reaction< DeferBackfill >,
boost::statechart::custom_reaction< UnfoundBackfill >,
- boost::statechart::custom_reaction< RemoteReservationRejected >
+ boost::statechart::custom_reaction< RemoteReservationRejected >,
+ boost::statechart::custom_reaction< RemoteReservationRevokedTooFull>
> reactions;
explicit Backfilling(my_context ctx);
- boost::statechart::result react(const RemoteReservationRejected& evt);
+ boost::statechart::result react(const RemoteReservationRejected& evt) {
+ // for compat with old peers
+ post_event(RemoteReservationRevokedTooFull());
+ return discard_event();
+ }
+ boost::statechart::result react(const RemoteReservationRevokedTooFull& evt);
boost::statechart::result react(const DeferBackfill& evt);
boost::statechart::result react(const UnfoundBackfill& evt);
void exit();