]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
OSD: cancel_pending_splits needs to cancel all descendants
authorSamuel Just <sam.just@inktank.com>
Wed, 1 May 2013 21:56:25 +0000 (14:56 -0700)
committerSamuel Just <sam.just@inktank.com>
Wed, 1 May 2013 21:56:25 +0000 (14:56 -0700)
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>
src/osd/OSD.cc
src/osd/OSD.h

index e63361b8ddda8c6c1276773b95eb4fe0153d488c..d4b75d88c10c41aabca781975d31509cf3270901 100644 (file)
@@ -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);
 }
index f894768fbe5f6059246443a32b1dce742538d1cb..a0b05f0818bd514492e87242e16432db42eafc51 100644 (file)
@@ -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);