pg_shard_t from;
spg_t pgid; ///< target spg_t
- epoch_t map_epoch;
+ epoch_t map_epoch, min_epoch;
list<pair<hobject_t, eversion_t> > objects; ///< objects to remove
private:
epoch_t get_map_epoch() const override {
return map_epoch;
}
+ epoch_t get_min_epoch() const override {
+ return min_epoch;
+ }
spg_t get_spg() const override {
return pgid;
}
: MOSDFastDispatchOp(MSG_OSD_PG_RECOVERY_DELETE, HEAD_VERSION,
COMPAT_VERSION) {}
- MOSDPGRecoveryDelete(pg_shard_t from, spg_t pgid, epoch_t map_epoch)
+ MOSDPGRecoveryDelete(pg_shard_t from, spg_t pgid, epoch_t map_epoch,
+ epoch_t min_epoch)
: MOSDFastDispatchOp(MSG_OSD_PG_RECOVERY_DELETE, HEAD_VERSION,
COMPAT_VERSION),
from(from),
pgid(pgid),
- map_epoch(map_epoch) {}
+ map_epoch(map_epoch),
+ min_epoch(min_epoch) {}
private:
~MOSDPGRecoveryDelete() {}
public:
const char *get_type_name() const { return "recovery_delete"; }
void print(ostream& out) const {
- out << "MOSDPGRecoveryDelete(" << pgid << " e" << map_epoch << " " << objects << ")";
+ out << "MOSDPGRecoveryDelete(" << pgid << " e" << map_epoch << ","
+ << min_epoch << " " << objects << ")";
}
void encode_payload(uint64_t features) {
::encode(from, payload);
::encode(pgid, payload);
::encode(map_epoch, payload);
+ ::encode(min_epoch, payload);
::encode(cost, payload);
::encode(objects, payload);
}
::decode(from, p);
::decode(pgid, p);
::decode(map_epoch, p);
+ ::decode(min_epoch, p);
::decode(cost, p);
::decode(objects, p);
}
pg_shard_t from;
spg_t pgid;
- epoch_t map_epoch;
+ epoch_t map_epoch, min_epoch;
list<pair<hobject_t, eversion_t> > objects;
epoch_t get_map_epoch() const override {
return map_epoch;
}
+ epoch_t get_min_epoch() const override {
+ return min_epoch;
+ }
spg_t get_spg() const override {
return pgid;
}
bufferlist::iterator p = payload.begin();
::decode(pgid.pgid, p);
::decode(map_epoch, p);
+ ::decode(min_epoch, p);
::decode(objects, p);
::decode(pgid.shard, p);
::decode(from, p);
void encode_payload(uint64_t features) override {
::encode(pgid.pgid, payload);
::encode(map_epoch, payload);
+ ::encode(min_epoch, payload);
::encode(objects, payload);
::encode(pgid.shard, payload);
::encode(from, payload);
void print(ostream& out) const override {
out << "MOSDPGRecoveryDeleteReply(" << pgid
- << " e" << map_epoch << " " << objects << ")";
+ << " e" << map_epoch << "," << min_epoch << " " << objects << ")";
}
const char *get_type_name() const override { return "recovery_delete_reply"; }
void PGBackend::send_recovery_deletes(int prio,
const map<pg_shard_t, vector<pair<hobject_t, eversion_t> > > &deletes)
{
+ epoch_t min_epoch = get_parent()->get_last_peering_reset_epoch();
for (const auto& p : deletes) {
const auto& shard = p.first;
const auto& objects = p.second;
MOSDPGRecoveryDelete *msg =
new MOSDPGRecoveryDelete(get_parent()->whoami_shard(),
target_pg,
- get_osdmap()->get_epoch());
+ get_osdmap()->get_epoch(),
+ min_epoch);
msg->set_priority(prio);
while (it != objects.end() &&
reply->set_priority(m->get_priority());
reply->pgid = spg_t(get_parent()->get_info().pgid.pgid, m->from.shard);
reply->map_epoch = m->map_epoch;
+ reply->min_epoch = m->min_epoch;
reply->objects = m->objects;
ConnectionRef conn = m->get_connection();