summaryrefslogtreecommitdiff
path: root/src/osd/OSD.cc
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-05-01 14:56:25 -0700
committerSamuel Just <sam.just@inktank.com>2013-05-01 14:56:25 -0700
commit3e0ca62b0fb77eb8b6445ff3ec78b7a18705cad8 (patch)
tree1c11e6afb08e83cfd5e39a352641d2fa9542edcd /src/osd/OSD.cc
parentdfacd1bd805ebb730b5206c9830b28f47cc7f9cf (diff)
downloadceph-3e0ca62b0fb77eb8b6445ff3ec78b7a18705cad8.tar.gz
OSD: cancel_pending_splits needs to cancel all descendants
expand_pg_num() and load_pgs() may result in a pg with children in pending_splits which also have children in pending_splits (etc). Signed-off-by: Samuel Just <sam.just@inktank.com>
Diffstat (limited to 'src/osd/OSD.cc')
-rw-r--r--src/osd/OSD.cc6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index e63361b8ddd..d4b75d88c10 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -234,6 +234,11 @@ void OSDService::mark_split_in_progress(pg_t parent, const set<pg_t> &children)
void OSDService::cancel_pending_splits_for_parent(pg_t parent)
{
Mutex::Locker l(in_progress_split_lock);
+ return _cancel_pending_splits_for_parent(parent);
+}
+
+void OSDService::_cancel_pending_splits_for_parent(pg_t parent)
+{
map<pg_t, set<pg_t> >::iterator piter = rev_pending_splits.find(parent);
if (piter == rev_pending_splits.end())
return;
@@ -244,6 +249,7 @@ void OSDService::cancel_pending_splits_for_parent(pg_t parent)
assert(pending_splits.count(*i));
assert(!in_progress_splits.count(*i));
pending_splits.erase(*i);
+ _cancel_pending_splits_for_parent(*i);
}
rev_pending_splits.erase(piter);
}