]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: queue waiters in MDCache::force_dir_fragment() 1793/head
authorYan, Zheng <zheng.z.yan@intel.com>
Sun, 18 May 2014 06:44:33 +0000 (14:44 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Sun, 18 May 2014 07:06:23 +0000 (15:06 +0800)
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/MDCache.cc

index 8cac24b8729f6a897f0404ea4411f6a2ef3cf96f..b6e5c250a762c18ff99b50df494916fa927a972d 100644 (file)
@@ -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;
 }