]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: don't requeue pg removal if already removing
authorSage Weil <sage@newdream.net>
Wed, 11 Nov 2009 18:19:28 +0000 (10:19 -0800)
committerSage Weil <sage@newdream.net>
Thu, 12 Nov 2009 00:09:36 +0000 (16:09 -0800)
src/osd/OSD.cc
src/osd/PG.h

index b4825a168b6760d1913655c2d66a495359e9f88e..a8fed43913034eae456b47238ca7ff071c4a155e 100644 (file)
@@ -3239,11 +3239,15 @@ void OSD::handle_pg_remove(MOSDPGRemove *m)
 
     pg = _lookup_lock_pg(pgid);
     if (pg->info.history.same_acting_since <= m->get_epoch()) {
-      dout(10) << *pg << " removing." << dendl;
-      assert(pg->get_role() == -1);
-      assert(pg->get_primary() == m->get_source().num());
-      pg->deleting = true;
-      remove_wq.queue(pg);
+      if (pg->deleting) {
+       dout(10) << *pg << " already removing." << dendl;
+      } else {
+       dout(10) << *pg << " removing." << dendl;
+       assert(pg->get_role() == -1);
+       assert(pg->get_primary() == m->get_source().num());
+       pg->deleting = true;
+       remove_wq.queue(pg);
+      }
     } else {
       dout(10) << *pg << " ignoring remove request, pg changed in epoch "
               << pg->info.history.same_acting_since << " > " << m->get_epoch() << dendl;
index 57e24551ff6d2718a83a5edbf28228dfe3a6c7a8..b41a3e5e6b326c21e6837c470db45c5f7b8f27ca 100644 (file)
@@ -586,9 +586,9 @@ protected:
   Cond _cond;
   atomic_t ref;
 
+public:
   bool deleting;  // true while RemoveWQ should be chewing on us
 
-public:
   void lock(bool no_lockdep=false) {
     //generic_dout(0) << this << " " << info.pgid << " lock" << dendl;
     _lock.Lock(no_lockdep);
@@ -1053,6 +1053,9 @@ inline ostream& operator<<(ostream& out, const PG& pg)
   }
   if (pg.info.snap_trimq.size())
     out << " snaptrimq=" << pg.info.snap_trimq;
+
+  if (pg.deleting)
+    out << " DELETING";
   out << "]";