]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: queue pg removal under pg's epoch
authorSage Weil <sage@newdream.net>
Sat, 11 Feb 2012 17:28:14 +0000 (09:28 -0800)
committerSage Weil <sage@newdream.net>
Sat, 11 Feb 2012 19:48:27 +0000 (11:48 -0800)
The PG may be doing work relative to a different epoch than what the osd
has.  Make sure the PG removal message is queued under that epoch to avoid
confusing/crashing the recipient like so:

2012-02-10 23:26:35.691793 7f387281f700 osd.3 514 queue_pg_for_deletion: 0.0
osd/OSD.cc: In function 'void OSD::handle_pg_remove(OpRequest*)' thread 7f387281f700 time 2012-02-10 23:26:35.691820
osd/OSD.cc: 4860: FAILED assert(pg->get_primary() == m->get_source().num())

Signed-off-by: Sage Weil <sage@newdream.net>
src/osd/OSD.h
src/osd/PG.cc

index 9e0930e00c57a3aa2277f65950b0078df7f7611f..7656bc69ca9797bec237aab02b8508d2c8e1e5fe 100644 (file)
@@ -746,9 +746,9 @@ protected:
   Mutex remove_list_lock;
   map<epoch_t, map<int, vector<pg_t> > > remove_list;
 
-  void queue_for_removal(int osd, pg_t pgid) {
+  void queue_for_removal(epoch_t epoch, int osd, pg_t pgid) {
     remove_list_lock.Lock();
-    remove_list[osdmap->get_epoch()][osd].push_back(pgid);
+    remove_list[epoch][osd].push_back(pgid);
     remove_list_lock.Unlock();
   }
 
index 5907dd1969aa23c11a2ccf54484d85876d2d58fd..26c4a7cfee575daad062fad0961088c18c78cfc9 100644 (file)
@@ -1607,7 +1607,7 @@ void PG::purge_strays()
        p++) {
     if (get_osdmap()->is_up(*p)) {
       dout(10) << "sending PGRemove to osd." << *p << dendl;
-      osd->queue_for_removal(*p, info.pgid);
+      osd->queue_for_removal(get_osdmap()->get_epoch(), *p, info.pgid);
       stray_purged.insert(*p);
     } else {
       dout(10) << "not sending PGRemove to down osd." << *p << dendl;