From 15c5e0c248f95b34ea9a2b997445e4010c64d6d9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 5 Jan 2011 11:51:30 -0800 Subject: [PATCH] mds: add mds_debug_frag option Verify dirfragtree matches any open dirfrags. Signed-off-by: Sage Weil --- src/config.cc | 1 + src/config.h | 1 + src/mds/CInode.cc | 15 +++++++++++++++ src/mds/CInode.h | 2 ++ src/mds/MDCache.cc | 3 +++ src/vstart.sh | 1 + 6 files changed, 23 insertions(+) diff --git a/src/config.cc b/src/config.cc index e883c29ab7162..159faf0df65eb 100644 --- a/src/config.cc +++ b/src/config.cc @@ -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), diff --git a/src/config.h b/src/config.h index 50676e68375d1..a45d74bbfe8d7 100644 --- a/src/config.h +++ b/src/config.h @@ -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; diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 6424d5fe5993e..bf3ee85b2bdd5 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -460,6 +460,19 @@ bool CInode::get_dirfrags_under(frag_t fg, list& ls) return all; } +void CInode::verify_dirfrags() +{ + bool bad = false; + for (map::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; diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 872ef39c2f5a2..2b37eed531e88 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -379,6 +379,8 @@ public: void close_dirfrags(); bool has_subtree_root_dirfrag(); + void verify_dirfrags(); + void get_stickydirs(); void put_stickydirs(); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index cbe48415d1509..94e509d9e061a 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -8833,6 +8833,9 @@ void MDCache::adjust_dir_fragments(CInode *diri, resultfrags.push_back(f); } + + if (g_conf.mds_debug_frag) + diri->verify_dirfrags(); } diff --git a/src/vstart.sh b/src/vstart.sh index 320649af04cf0..0c71362916805 100755 --- a/src/vstart.sh +++ b/src/vstart.sh @@ -264,6 +264,7 @@ EOF cat <> $conf [mds] $CMDSDEBUG + mds debug frag = true [osd] osd class tmp = out osd scrub load threshold = 5.0 -- 2.39.5