]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG,OSD: move dequeueing into on_shutdown
authorSamuel Just <sam.just@inktank.com>
Mon, 18 Mar 2013 20:45:40 +0000 (13:45 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 22 Mar 2013 01:37:34 +0000 (18:37 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/OSD.cc
src/osd/ReplicatedPG.cc

index 576aeed08e290cf69200cd9b3765420cd915f99d..ede9636c6ff5021a5d9af0d9c068dca0f459a3f9 100644 (file)
@@ -5733,17 +5733,6 @@ void OSD::_remove_pg(PG *pg)
                      *i, pg->osr, deleting));
   }
 
-  recovery_wq.dequeue(pg);
-  scrub_wq.dequeue(pg);
-  scrub_finalize_wq.dequeue(pg);
-  snap_trim_wq.dequeue(pg);
-  pg_stat_queue_dequeue(pg);
-  op_wq.dequeue(pg);
-  peering_wq.dequeue(pg);
-
-  pg->deleting = true;
-
-  pg->unreg_next_scrub();
 
   // remove from map
   pg_map.erase(pg->info.pgid);
index f87e334f48f3934d59bce80828b8f3a13ab292fe..50318fc5869de8ae7bc23a873c7e408fb3db5684 100644 (file)
@@ -6162,21 +6162,36 @@ void ReplicatedPG::apply_and_flush_repops(bool requeue)
 void ReplicatedPG::on_removal()
 {
   dout(10) << "on_removal" << dendl;
-  apply_and_flush_repops(false);
-  context_registry_on_change();
 
-  clear_primary_state();
-  osd->remove_want_pg_temp(info.pgid);
-  cancel_recovery();
-  osd->remote_reserver.cancel_reservation(info.pgid);
-  osd->local_reserver.cancel_reservation(info.pgid);
+  on_shutdown();
 }
 
 void ReplicatedPG::on_shutdown()
 {
   dout(10) << "on_shutdown" << dendl;
+
+  // remove from queues
+  osd->recovery_wq.dequeue(this);
+  osd->scrub_wq.dequeue(this);
+  osd->scrub_finalize_wq.dequeue(this);
+  osd->snap_trim_wq.dequeue(this);
+  osd->pg_stat_queue_dequeue(this);
+  osd->dequeue_pg(this, 0);
+  osd->peering_wq.dequeue(this);
+
+  // handles queue races
+  deleting = true;
+
+  unreg_next_scrub();
   apply_and_flush_repops(false);
   context_registry_on_change();
+
+  osd->remote_reserver.cancel_reservation(info.pgid);
+  osd->local_reserver.cancel_reservation(info.pgid);
+
+  clear_primary_state();
+  osd->remove_want_pg_temp(info.pgid);
+  cancel_recovery();
 }
 
 void ReplicatedPG::on_flushed()