]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add mds_debug_frag option
authorSage Weil <sage@newdream.net>
Wed, 5 Jan 2011 19:51:30 +0000 (11:51 -0800)
committerSage Weil <sage@newdream.net>
Thu, 6 Jan 2011 00:48:04 +0000 (16:48 -0800)
Verify dirfragtree matches any open dirfrags.

Signed-off-by: Sage Weil <sage@newdream.net>
src/config.cc
src/config.h
src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc
src/vstart.sh

index e883c29ab7162c585f32d63da5a72986c97fb716..159faf0df65eb53fcc18752daa5382b84bf02b2b 100644 (file)
@@ -514,6 +514,7 @@ static struct config_option config_optionsp[] = {
        OPTION(mds_hack_log_expire_for_better_stats, 0, OPT_BOOL, false),
        OPTION(mds_verify_scatter, 0, OPT_BOOL, false),
        OPTION(mds_debug_scatterstat, 0, OPT_BOOL, false),
+       OPTION(mds_debug_frag, 0, OPT_BOOL, false),
        OPTION(mds_kill_mdstable_at, 0, OPT_INT, 0),
        OPTION(mds_kill_export_at, 0, OPT_INT, 0),
        OPTION(mds_kill_import_at, 0, OPT_INT, 0),
index 50676e68375d139c76f39fe642a8d2a63ad46630..a45d74bbfe8d70efd08a58a8294bf91504b4196e 100644 (file)
@@ -334,6 +334,7 @@ struct md_config_t {
   // set these to non-zero to specify kill points
   bool mds_verify_scatter;
   bool mds_debug_scatterstat;
+  bool mds_debug_frag;
   int mds_kill_mdstable_at;
   int mds_kill_export_at;
   int mds_kill_import_at;
index 6424d5fe5993ec23f2155a010cb2d115d041a188..bf3ee85b2bdd5da70d2b302a910c1b6028750ed0 100644 (file)
@@ -460,6 +460,19 @@ bool CInode::get_dirfrags_under(frag_t fg, list<CDir*>& ls)
   return all;
 }
 
+void CInode::verify_dirfrags()
+{
+  bool bad = false;
+  for (map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
+    if (!dirfragtree.is_leaf(p->first)) {
+      dout(0) << "have open dirfrag " << p->first << " but not leaf in " << dirfragtree
+             << ": " << *p->second << dendl;
+      bad = true;
+    }
+  }
+  assert(!bad);
+}
+
 CDir *CInode::get_approx_dirfrag(frag_t fg)
 {
   CDir *dir = get_dirfrag(fg);
@@ -1293,6 +1306,8 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
            dirfragtree.force_to_leaf(p->first);
          }
       }
+      if (g_conf.mds_debug_frag)
+       verify_dirfrags();
     }
     break;
 
index 872ef39c2f5a283b9649a462ff5ab149c84b3f82..2b37eed531e887d8dbbcfeb641143805e612101a 100644 (file)
@@ -379,6 +379,8 @@ public:
   void close_dirfrags();
   bool has_subtree_root_dirfrag();
 
+  void verify_dirfrags();
+
   void get_stickydirs();
   void put_stickydirs();  
 
index cbe48415d1509ee1ce26edcb3c0aef0e531203c1..94e509d9e061aa1477e7dba4e440e46f127366ae 100644 (file)
@@ -8833,6 +8833,9 @@ void MDCache::adjust_dir_fragments(CInode *diri,
 
     resultfrags.push_back(f);
   }
+
+  if (g_conf.mds_debug_frag)
+    diri->verify_dirfrags();
 }
 
 
index 320649af04cf0131886bdc9e3a16580e0baf287e..0c71362916805c960cc042d2b69f803af880fbd1 100755 (executable)
@@ -264,6 +264,7 @@ EOF
                        cat <<EOF >> $conf
 [mds]
 $CMDSDEBUG
+        mds debug frag = true
 [osd]
         osd class tmp = out
         osd scrub load threshold = 5.0