osd: cancel_generate_backlog on activate

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.
This commit is contained in:
Sage Weil 2008-12-22 11:39:18 -08:00
parent c8f31fb2fa
commit 6d41141b1c
3 changed files with 12 additions and 2 deletions

View File

@ -2098,8 +2098,7 @@ void OSD::advance_map(ObjectStore::Transaction& t, interval_set<snapid_t>& remov
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);
@ -3130,6 +3129,13 @@ void OSD::queue_generate_backlog(PG *pg)
}
}
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();

View File

@ -539,6 +539,7 @@ private:
} backlog_wq;
void queue_generate_backlog(PG *pg);
void cancel_generate_backlog(PG *pg);
void generate_backlog(PG *pg);

View File

@ -1282,6 +1282,9 @@ void PG::activate(ObjectStore::Transaction& t,
// 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);