]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: cancel_generate_backlog on activate
authorSage Weil <sage@newdream.net>
Mon, 22 Dec 2008 19:39:18 +0000 (11:39 -0800)
committerSage Weil <sage@newdream.net>
Tue, 23 Dec 2008 20:19:06 +0000 (12:19 -0800)
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
src/osd/OSD.h
src/osd/PG.cc

index 832ec3fc27e4962df31e4ad0147ceefe6fc98d04..d11a0d475821518b0728e2d47736f1e1fa952040 100644 (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();
index 4d61aa33b65cf1a389ee93ca9d7a4660c9b03012..1f32bec053d02e118450508a9942ff576f95d7b9 100644 (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);
 
 
index b9e134e046477f256077361a14f407df49186314..36ab5cf4d9665275200ff66588d9c37ad490a986 100644 (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);