summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-08-05 13:51:05 -0700
committerSamuel Just <sam.just@inktank.com>2013-08-06 13:51:51 -0700
commit95b3604befe1a66bc8f764e8e9636e5bdca9cef2 (patch)
tree348a990516c73aeaa172fdd92f56df346a483898
parent321f57de97c00c44077f7007eeae20b033a38c3d (diff)
downloadceph-95b3604befe1a66bc8f764e8e9636e5bdca9cef2.tar.gz
OSD: also suspend timeout while grabbing recovery_tp lock
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/osd/OSD.cc4
-rw-r--r--src/osd/OSD.h6
2 files changed, 5 insertions, 5 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index e4653dc1f70..1d51e02ad43 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -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;
diff --git a/src/osd/OSD.h b/src/osd/OSD.h
index 5196a1dc1f3..ae77644eeeb 100644
--- a/src/osd/OSD.h
+++ b/src/osd/OSD.h
@@ -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