From: Samuel Just Date: Wed, 1 May 2013 21:56:25 +0000 (-0700) Subject: OSD: cancel_pending_splits needs to cancel all descendants X-Git-Tag: v0.61~19^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3e0ca62b0fb77eb8b6445ff3ec78b7a18705cad8;p=ceph.git 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 --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index e63361b8ddda..d4b75d88c10c 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 &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 >::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 f894768fbe5f..a0b05f0818bd 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 &pgs); void complete_split(const set &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);