The mon can put this in the pg_pool_t.
Signed-off-by: Sage Weil <sage@redhat.com>
: public MessageInstance<MOSDPGReadyToMerge, PaxosServiceMessage> {
public:
pg_t pgid;
+ epoch_t last_epoch_clean = 0;
MOSDPGReadyToMerge()
: MessageInstance(MSG_OSD_PG_READY_TO_MERGE, 0)
{}
- MOSDPGReadyToMerge(pg_t p, epoch_t e)
- : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, e),
- pgid(p)
+ MOSDPGReadyToMerge(pg_t p, epoch_t lec, epoch_t v)
+ : MessageInstance(MSG_OSD_PG_READY_TO_MERGE, v),
+ pgid(p),
+ last_epoch_clean(lec)
{}
void encode_payload(uint64_t features) override {
using ceph::encode;
paxos_encode();
encode(pgid, payload);
+ encode(last_epoch_clean, payload);
}
void decode_payload() override {
bufferlist::const_iterator p = payload.begin();
paxos_decode(p);
decode(pgid, p);
+ decode(last_epoch_clean, p);
}
const char *get_type_name() const override { return "osd_pg_ready_to_merge"; }
void print(ostream &out) const {
out << get_type_name()
- << "(" << pgid
+ << "(" << pgid << " lec " << last_epoch_clean
<< " v" << version << ")";
}
};
return true;
}
- p.dec_pg_num();
+ p.dec_pg_num(m->last_epoch_clean);
p.last_change = pending_inc.epoch;
// force pre-nautilus clients to resend their ops, since they
_send_ready_to_merge();
}
-void OSDService::set_ready_to_merge_target(PG *pg)
+void OSDService::set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean)
{
Mutex::Locker l(merge_lock);
dout(10) << __func__ << " " << pg->pg_id << dendl;
- ready_to_merge_target.insert(pg->pg_id.pgid);
+ ready_to_merge_target.insert(make_pair(pg->pg_id.pgid, last_epoch_clean));
_send_ready_to_merge();
}
void OSDService::_send_ready_to_merge()
{
for (auto src : ready_to_merge_source) {
- if (ready_to_merge_target.count(src.get_parent()) &&
+ auto p = ready_to_merge_target.find(src.get_parent());
+ if (p != ready_to_merge_target.end() &&
sent_ready_to_merge_source.count(src) == 0) {
- monc->send_mon_message(new MOSDPGReadyToMerge(src, osdmap->get_epoch()));
+ monc->send_mon_message(new MOSDPGReadyToMerge(
+ src,
+ p->second, // PG's last_epoch_clean
+ osdmap->get_epoch()));
sent_ready_to_merge_source.insert(src);
}
}
// -- pg merge --
Mutex merge_lock = {"OSD::merge_lock"};
set<pg_t> ready_to_merge_source;
- set<pg_t> ready_to_merge_target;
+ map<pg_t,epoch_t> ready_to_merge_target; // pg -> last_epoch_clean
set<pg_t> sent_ready_to_merge_source;
void set_ready_to_merge_source(PG *pg);
- void set_ready_to_merge_target(PG *pg);
+ void set_ready_to_merge_target(PG *pg, epoch_t last_epoch_clean);
void clear_ready_to_merge(PG *pg);
void send_ready_to_merge();
void _send_ready_to_merge();
if (pg->pool.info.is_pending_merge(pg->info.pgid.pgid, &target)) {
if (target) {
ldout(pg->cct, 10) << "ready to merge (target)" << dendl;
- pg->osd->set_ready_to_merge_target(pg);
+ pg->osd->set_ready_to_merge_target(pg,
+ pg->info.history.last_epoch_clean);
} else {
ldout(pg->cct, 10) << "ready to merge (source)" << dendl;
pg->osd->set_ready_to_merge_source(pg);
void set_pgp_num_target(int p) {
pgp_num_target = p;
}
- void dec_pg_num() {
+ void dec_pg_num(epoch_t last_epoch_clean) {
--pg_num;
+ pg_num_dec_last_epoch_clean = last_epoch_clean;
calc_pg_masks();
}