diff options
author | Samuel Just <sam.just@inktank.com> | 2013-05-01 14:56:25 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-05-01 14:56:25 -0700 |
commit | 3e0ca62b0fb77eb8b6445ff3ec78b7a18705cad8 (patch) | |
tree | 1c11e6afb08e83cfd5e39a352641d2fa9542edcd /src/osd/OSD.cc | |
parent | dfacd1bd805ebb730b5206c9830b28f47cc7f9cf (diff) | |
download | ceph-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.cc | 6 |
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); } |