]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: lock pg when requeuing requests
authorSage Weil <sage.weil@dreamhost.com>
Mon, 21 Nov 2011 19:15:38 +0000 (11:15 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Mon, 21 Nov 2011 19:15:38 +0000 (11:15 -0800)
The op queue is shut down, so this is mostly safe, unless someone comes
through and does requeue_ops() from a callback or something.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/osd/OSD.cc

index 791f57639615c719f62a8fe3ffab2b1fc79469b3..492f7881626451a59e829c14a71962605dc10d0e 100644 (file)
@@ -3175,17 +3175,18 @@ void OSD::handle_osd_map(MOSDMap *m)
   list<Message*> rq;
   while (!op_queue.empty()) {
     PG *pg = op_queue.back();
+    pg->lock();
     op_queue.pop_back();
     pending_ops--;
-    logger->set(l_osd_opq, pending_ops);
-
     Message *mess = pg->op_queue.back();
     pg->op_queue.pop_back();
+    pg->unlock();
     pg->put();
     dout(15) << " will requeue " << *mess << dendl;
     rq.push_front(mess);
   }
   assert(pending_ops == 0);  // we paused the wq, and just emptied out the queue
+  logger->set(l_osd_opq, pending_ops);
   push_waiters(rq);  // requeue under osd_lock!
   op_wq.unlock();