From 6d41141b1c7eea15f24a49afe66d3dde229f6dde Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Dec 2008 11:39:18 -0800 Subject: [PATCH] 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. --- src/osd/OSD.cc | 10 ++++++++-- src/osd/OSD.h | 1 + src/osd/PG.cc | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 832ec3fc27e49..d11a0d4758215 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2098,8 +2098,7 @@ void OSD::advance_map(ObjectStore::Transaction& t, interval_set& 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(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 4d61aa33b65cf..1f32bec053d02 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -539,6 +539,7 @@ private: } backlog_wq; void queue_generate_backlog(PG *pg); + void cancel_generate_backlog(PG *pg); void generate_backlog(PG *pg); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index b9e134e046477..36ab5cf4d9665 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -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); -- 2.39.5