]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
OSD: also suspend timeout while grabbing recovery_tp lock
authorSamuel Just <sam.just@inktank.com>
Mon, 5 Aug 2013 20:51:05 +0000 (13:51 -0700)
committerSamuel Just <sam.just@inktank.com>
Tue, 6 Aug 2013 20:51:51 +0000 (13:51 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/OSD.cc
src/osd/OSD.h

index e4653dc1f70c7133188608309ab3f9f0649fdbab..1d51e02ad437c29051197cc55137a767bec6fff8 100644 (file)
@@ -6632,7 +6632,7 @@ bool OSD::_recover_now()
   return true;
 }
 
-void OSD::do_recovery(PG *pg)
+void OSD::do_recovery(PG *pg, ThreadPool::TPHandle &handle)
 {
   // see how many we should try to start.  note that this is a bit racy.
   recovery_wq.lock();
@@ -6652,7 +6652,7 @@ void OSD::do_recovery(PG *pg)
     recovery_wq.queue(pg);
     return;
   } else {
-    pg->lock();
+    pg->lock_suspend_timeout(handle);
     if (pg->deleting || !(pg->is_active() && pg->is_primary())) {
       pg->unlock();
       goto out;
index 5196a1dc1f3ca1e23950d008d1fb88cbaa180ceb..ae77644eeeb759bc661974fededcdc066de39764 100644 (file)
@@ -1371,8 +1371,8 @@ protected:
        osd->recovery_queue.push_front(&pg->recovery_item);
       }
     }
-    void _process(PG *pg) {
-      osd->do_recovery(pg);
+    void _process(PG *pg, ThreadPool::TPHandle &handle) {
+      osd->do_recovery(pg, handle);
       pg->put("RecoveryWQ");
     }
     void _clear() {
@@ -1386,7 +1386,7 @@ protected:
 
   void start_recovery_op(PG *pg, const hobject_t& soid);
   void finish_recovery_op(PG *pg, const hobject_t& soid, bool dequeue);
-  void do_recovery(PG *pg);
+  void do_recovery(PG *pg, ThreadPool::TPHandle &handle);
   bool _recover_now();
 
   // replay / delayed pg activation