From d776ec43a1d87705d1dc7197b058cbed5f0c7505 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Sun, 18 May 2014 14:44:33 +0800 Subject: [PATCH] mds: queue waiters in MDCache::force_dir_fragment() Signed-off-by: Yan, Zheng --- src/mds/MDCache.cc | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 8cac24b8729f..b6e5c250a762 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -10546,9 +10546,10 @@ CDir *MDCache::force_dir_fragment(CInode *diri, frag_t fg, bool replay) src.push_back(pdir); adjust_dir_fragments(diri, src, parent, split, result, waiters, replay); dir = diri->get_dirfrag(fg); - if (dir) - dout(10) << "force_dir_fragment result " << *dir << dendl; - return dir; + if (dir) { + dout(10) << "force_dir_fragment result " << *dir << dendl; + break; + } } if (parent == frag_t()) break; @@ -10557,16 +10558,20 @@ CDir *MDCache::force_dir_fragment(CInode *diri, frag_t fg, bool replay) dout(10) << " " << last << " parent is " << parent << dendl; } - // hoover up things under fg? - diri->get_dirfrags_under(fg, src); - if (src.empty()) { - dout(10) << "force_dir_fragment no frags under " << fg << dendl; - return NULL; + if (!dir) { + // hoover up things under fg? + diri->get_dirfrags_under(fg, src); + if (src.empty()) { + dout(10) << "force_dir_fragment no frags under " << fg << dendl; + } else { + dout(10) << " will combine frags under " << fg << ": " << src << dendl; + adjust_dir_fragments(diri, src, fg, 0, result, waiters, replay); + dir = result.front(); + dout(10) << "force_dir_fragment result " << *dir << dendl; + } } - dout(10) << " will combine frags under " << fg << ": " << src << dendl; - adjust_dir_fragments(diri, src, fg, 0, result, waiters, replay); - dir = result.front(); - dout(10) << "force_dir_fragment result " << *dir << dendl; + if (!replay) + mds->queue_waiters(waiters); return dir; } -- 2.47.3