This fixes issue where primary requests backlog, finds its missing objects,
activates (by sending a backlog), and replica generates backlog only to
find that it already has it.
pg->on_role_change();
// interrupt backlog generation
- pg->generate_backlog_epoch = 0;
- backlog_wq.dequeue(pg);
+ cancel_generate_backlog(pg);
// take active waiters
take_waiters(pg->waiting_for_active);
}
}
+void OSD::cancel_generate_backlog(PG *pg)
+{
+ dout(10) << *pg << " cancel_generate_backlog" << dendl;
+ pg->generate_backlog_epoch = 0;
+ backlog_wq.dequeue(pg);
+}
+
void OSD::generate_backlog(PG *pg)
{
pg->lock();
} backlog_wq;
void queue_generate_backlog(PG *pg);
+ void cancel_generate_backlog(PG *pg);
void generate_backlog(PG *pg);
// clear prior set (and dependency info)... we are done peering!
clear_prior();
+ // if we are building a backlog, cancel it!
+ osd->cancel_generate_backlog(this);
+
// write pg info, log
write_info(t);
write_log(t);