summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-10-15 13:11:29 -0700
committerSamuel Just <sam.just@inktank.com>2013-10-15 15:16:56 -0700
commitc658258d9e2f590054a30c0dee14a579a51bda8c (patch)
tree6b25ecbb1854c6bceb9c75fde26dc41e4efb382b
parent0d508156ca41073063dc3ac5239696efe96af03c (diff)
downloadceph-c658258d9e2f590054a30c0dee14a579a51bda8c.tar.gz
OSD: ping tphandle during pg removal
Fixes: #6528 Signed-off-by: Samuel Just <sam.just@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/osd/OSD.cc15
-rw-r--r--src/osd/OSD.h2
2 files changed, 13 insertions, 4 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index b2aa2ebbcd2..d450fd543e6 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -3278,13 +3278,15 @@ bool remove_dir(
ObjectStore *store, SnapMapper *mapper,
OSDriver *osdriver,
ObjectStore::Sequencer *osr,
- coll_t coll, DeletingStateRef dstate)
+ coll_t coll, DeletingStateRef dstate,
+ ThreadPool::TPHandle &handle)
{
vector<ghobject_t> olist;
int64_t num = 0;
ObjectStore::Transaction *t = new ObjectStore::Transaction;
ghobject_t next;
while (!next.is_max()) {
+ handle.reset_tp_timeout();
store->collection_list_partial(
coll,
next,
@@ -3306,7 +3308,9 @@ bool remove_dir(
C_SaferCond waiter;
store->queue_transaction(osr, t, &waiter);
bool cont = dstate->pause_clearing();
+ handle.suspend_tp_timeout();
waiter.wait();
+ handle.reset_tp_timeout();
if (cont)
cont = dstate->resume_clearing();
delete t;
@@ -3322,14 +3326,18 @@ bool remove_dir(
C_SaferCond waiter;
store->queue_transaction(osr, t, &waiter);
bool cont = dstate->pause_clearing();
+ handle.suspend_tp_timeout();
waiter.wait();
+ handle.reset_tp_timeout();
if (cont)
cont = dstate->resume_clearing();
delete t;
return cont;
}
-void OSD::RemoveWQ::_process(pair<PGRef, DeletingStateRef> item)
+void OSD::RemoveWQ::_process(
+ pair<PGRef, DeletingStateRef> item,
+ ThreadPool::TPHandle &handle)
{
PGRef pg(item.first);
SnapMapper &mapper = pg->snap_mapper;
@@ -3346,7 +3354,8 @@ void OSD::RemoveWQ::_process(pair<PGRef, DeletingStateRef> item)
i != colls_to_remove.end();
++i) {
bool cont = remove_dir(
- pg->cct, store, &mapper, &driver, pg->osr.get(), *i, item.second);
+ pg->cct, store, &mapper, &driver, pg->osr.get(), *i, item.second,
+ handle);
if (!cont)
return;
}
diff --git a/src/osd/OSD.h b/src/osd/OSD.h
index 9346cee6890..f7559da3be5 100644
--- a/src/osd/OSD.h
+++ b/src/osd/OSD.h
@@ -1681,7 +1681,7 @@ protected:
remove_queue.pop_front();
return item;
}
- void _process(pair<PGRef, DeletingStateRef>);
+ void _process(pair<PGRef, DeletingStateRef>, ThreadPool::TPHandle &);
void _clear() {
remove_queue.clear();
}