]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: implement command 'merge_dir path frag'
authorSage Weil <sage@newdream.net>
Wed, 27 Oct 2010 02:08:14 +0000 (19:08 -0700)
committerSage Weil <sage@newdream.net>
Wed, 27 Oct 2010 02:19:04 +0000 (19:19 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/MDCache.cc
src/mds/MDS.cc

index 7f59f564905f045cb2c8d7ff7fc4fefb0141e427..3531d80e52b58e141159ef4e0a4bc043f614dec6 100644 (file)
@@ -8609,6 +8609,11 @@ void MDCache::merge_dir(CInode *diri, frag_t frag)
     return;
   }
 
+  if (diri->dirfragtree.is_leaf(frag)) {
+    dout(10) << " " << frag << " already a leaf for " << *diri << dendl;
+    return;
+  }
+
   if (!can_fragment(diri, dirs))
     return;
   if (!can_fragment_lock(diri)) {
index 3f64d91c319292055cfd42ebcfee05de2e48ef0e..a3d5bcb081b54f41a1967101db3c8f90cb5da12e 100644 (file)
@@ -691,26 +691,35 @@ void MDS::handle_command(MMonCommand *m)
       locker->try_eval(ino, mask);
       dout(20) << "try_eval(" << inum << ", " << mask << ")" << dendl;
     } else dout(15) << "inode " << inum << " not in mdcache!" << dendl;
-  } else if (m->cmd[0] == "fragment_dir" ||
-            m->cmd[0] == "merge_dir") {
+  } else if (m->cmd[0] == "fragment_dir") {
     if (m->cmd.size() == 4) {
       filepath fp(m->cmd[1].c_str());
       CInode *in = mdcache->cache_traverse(fp);
       if (in) {
-       frag_t fg = frag_t(atoi(m->cmd[2].c_str()));   // FIXME: need to parse a frag_t...
-       CDir *dir = in->get_dirfrag(fg);
-       if (dir) {
-         if (dir->is_auth()) {
-           int by = atoi(m->cmd[3].c_str());
-           if (by) {
-             if (m->cmd[0] == "fragment_dir")
+       frag_t fg;
+       if (fg.parse(m->cmd[2].c_str())) {
+         CDir *dir = in->get_dirfrag(fg);
+         if (dir) {
+           if (dir->is_auth()) {
+             int by = atoi(m->cmd[3].c_str());
+             if (by)
                mdcache->split_dir(dir, by);
-             //else
-             //mdcache->merge_dir(dir, by);
-           } else
-             dout(0) << "need to split by >0 bits" << dendl;
-         } else dout(0) << "dir " << dir->dirfrag() << " not auth" << dendl;
-       } else dout(0) << "dir " << in->ino() << " " << fg << " dne" << dendl;
+             else
+               dout(0) << "need to split by >0 bits" << dendl;
+           } else dout(0) << "dir " << dir->dirfrag() << " not auth" << dendl;
+         } else dout(0) << "dir " << in->ino() << " " << fg << " dne" << dendl;
+       } else dout(0) << " frag " << m->cmd[2] << " does not parse" << dendl;
+      } else dout(0) << "path " << fp << " not found" << dendl;
+    } else dout(0) << "bad syntax" << dendl;
+  } else if (m->cmd[0] == "merge_dir") {
+    if (m->cmd.size() == 3) {
+      filepath fp(m->cmd[1].c_str());
+      CInode *in = mdcache->cache_traverse(fp);
+      if (in) {
+       frag_t fg;
+       if (fg.parse(m->cmd[2].c_str())) {
+         mdcache->merge_dir(in, fg);
+       } else dout(0) << " frag " << m->cmd[2] << " does not parse" << dendl;
       } else dout(0) << "path " << fp << " not found" << dendl;
     } else dout(0) << "bad syntax" << dendl;
   } else if (m->cmd[0] == "export_dir") {