From 439cd5e1b4725e594786785189a37184243828d9 Mon Sep 17 00:00:00 2001 From: John Spray Date: Tue, 6 Sep 2016 13:16:04 +0100 Subject: [PATCH] mds: log path with CDir damage messages Previously you just got the inode number, which wasn't terribly useful for e.g. a missing fragment object, as you couldn't readily resolve the parent path. Fixes: http://tracker.ceph.com/issues/16973 Signed-off-by: John Spray --- src/mds/CDir.cc | 27 +++++++++++++++++---------- src/mds/CDir.h | 4 ++++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index b5ef08b64718a..cb74fa02609c1 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -78,9 +78,7 @@ boost::pool<> CDir::pool(sizeof(CDir)); ostream& operator<<(ostream& out, const CDir& dir) { - string path; - dir.get_inode()->make_path_string_projected(path); - out << "[dir " << dir.dirfrag() << " " << path << "/" + out << "[dir " << dir.dirfrag() << " " << dir.get_path() << "/" << " [" << dir.first << ",head]"; if (dir.is_auth()) { out << " auth"; @@ -1729,7 +1727,9 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, if (hdrbl.length() == 0) { dout(0) << "_fetched missing object for " << *this << dendl; - clog->error() << "dir " << dirfrag() << " object missing on disk; some files may be lost\n"; + + clog->error() << "dir " << dirfrag() << " object missing on disk; some " + "files may be lost (" << get_path() << ")"; go_bad(complete); return; @@ -1744,13 +1744,14 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, derr << "Corrupt fnode in dirfrag " << dirfrag() << ": " << err << dendl; clog->warn() << "Corrupt fnode header in " << dirfrag() << ": " - << err; + << err << " (" << get_path() << ")"; go_bad(complete); return; } if (!p.end()) { clog->warn() << "header buffer of dir " << dirfrag() << " has " - << hdrbl.length() - p.get_off() << " extra bytes\n"; + << hdrbl.length() - p.get_off() << " extra bytes (" + << get_path() << ")"; go_bad(complete); return; } @@ -1809,7 +1810,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map& omap, } catch (const buffer::error &err) { cache->mds->clog->warn() << "Corrupt dentry '" << dname << "' in " "dir frag " << dirfrag() << ": " - << err; + << err << "(" << get_path() << ")"; // Remember that this dentry is damaged. Subsequent operations // that try to act directly on it will get their EIOs, but this @@ -2869,9 +2870,7 @@ void CDir::dump(Formatter *f) const { assert(f != NULL); - string path; - get_inode()->make_path_string_projected(path); - f->dump_stream("path") << path; + f->dump_stream("path") << get_path(); f->dump_stream("dirfrag") << dirfrag(); f->dump_int("snapid_first", first); @@ -3134,3 +3133,11 @@ bool CDir::scrub_local() } return rval; } + +std::string CDir::get_path() const +{ + std::string path; + get_inode()->make_path_string_projected(path); + return path; +} + diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 7db2a7d77e234..a914afb790d25 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -41,6 +41,8 @@ struct ObjectOperation; ostream& operator<<(ostream& out, const class CDir& dir); class CDir : public MDSCacheObject { + friend ostream& operator<<(ostream& out, const class CDir& dir); + /* * This class uses a boost::pool to handle allocation. This is *not* * thread-safe, so don't do allocations from multiple threads! @@ -509,6 +511,8 @@ private: */ mds_authority_t dir_auth; + std::string get_path() const; + public: mds_authority_t authority() const; mds_authority_t get_dir_auth() const { return dir_auth; } -- 2.39.5