summaryrefslogtreecommitdiff
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
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>
-rw-r--r--src/osd/OSD.cc6
-rw-r--r--src/osd/OSD.h1
2 files changed, 7 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);
}
diff --git a/src/osd/OSD.h b/src/osd/OSD.h
index f894768fbe5..a0b05f0818b 100644
--- a/src/osd/OSD.h
+++ b/src/osd/OSD.h
@@ -398,6 +398,7 @@ public:
void mark_split_in_progress(pg_t parent, const set<pg_t> &pgs);
void complete_split(const set<pg_t> &pgs);
void cancel_pending_splits_for_parent(pg_t parent);
+ void _cancel_pending_splits_for_parent(pg_t parent);
bool splitting(pg_t pgid);
void expand_pg_num(OSDMapRef old_map,
OSDMapRef new_map);