public:
pg_t pgid;
epoch_t last_epoch_clean = 0;
+ bool ready = true;
MOSDPGReadyToMerge()
: MessageInstance(MSG_OSD_PG_READY_TO_MERGE, 0)
{}
- MOSDPGReadyToMerge(pg_t p, epoch_t lec, epoch_t v)
+ MOSDPGReadyToMerge(pg_t p, epoch_t lec, bool r, epoch_t v)
: MessageInstance(MSG_OSD_PG_READY_TO_MERGE, v),
pgid(p),
- last_epoch_clean(lec)
+ last_epoch_clean(lec),
+ ready(r)
{}
void encode_payload(uint64_t features) override {
using ceph::encode;
paxos_encode();
encode(pgid, payload);
encode(last_epoch_clean, payload);
+ encode(ready, payload);
}
void decode_payload() override {
bufferlist::const_iterator p = payload.begin();
paxos_decode(p);
decode(pgid, p);
decode(last_epoch_clean, p);
+ decode(ready, p);
}
const char *get_type_name() const override { return "osd_pg_ready_to_merge"; }
void print(ostream &out) const {
out << get_type_name()
<< "(" << pgid << " lec " << last_epoch_clean
+ << (ready ? " ready" : " NOT READY")
<< " v" << version << ")";
}
};
return true;
}
- p.dec_pg_num(m->last_epoch_clean);
- p.last_change = pending_inc.epoch;
+ if (m->ready) {
+ p.dec_pg_num(m->last_epoch_clean);
+ p.last_change = pending_inc.epoch;
+ } else {
+ // back off the merge attempt!
+ p.set_pg_num_pending(p.get_pg_num());
+ }
// force pre-nautilus clients to resend their ops, since they
// don't understand pg_num_pending changes form a new interval
pending_inc.new_pools[m->pgid.pool()] = p;
auto prob = g_conf().get_val<double>("mon_inject_pg_merge_bounce_probability");
- if (prob > 0 && prob > (double)(rand() % 1000)/1000.0) {
+ if (m->ready &&
+ prob > 0 &&
+ prob > (double)(rand() % 1000)/1000.0) {
derr << __func__ << " injecting pg merge pg_num bounce" << dendl;
auto n = new MMonCommand(mon->monmap->get_fsid());
n->set_connection(m->get_connection());
monc->send_mon_message(new MOSDPGReadyToMerge(
src,
p->second, // PG's last_epoch_clean
+ true,
osdmap->get_epoch()));
sent_ready_to_merge_source.insert(src);
}