mirror of
https://github.com/ceph/ceph
synced 2025-02-06 02:14:01 +00:00
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:
parent
c8f31fb2fa
commit
6d41141b1c
@ -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();
|
||||
|
@ -539,6 +539,7 @@ private:
|
||||
} backlog_wq;
|
||||
|
||||
void queue_generate_backlog(PG *pg);
|
||||
void cancel_generate_backlog(PG *pg);
|
||||
void generate_backlog(PG *pg);
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user