]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: log path with CDir damage messages 11418/head
authorJohn Spray <john.spray@redhat.com>
Tue, 6 Sep 2016 12:16:04 +0000 (13:16 +0100)
committerLoic Dachary <ldachary@redhat.com>
Tue, 11 Oct 2016 08:55:20 +0000 (10:55 +0200)
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 <john.spray@redhat.com>
(cherry picked from commit 439cd5e1b4725e594786785189a37184243828d9)

Conflicts:
src/mds/CDir.cc: the go_bad() prototype which is part of the
        context of the patch has changed.

src/mds/CDir.cc
src/mds/CDir.h

index fcae684f677fd3d1e4d6b48a27d84c9ca69477e9..8b241e3b1a2a3a2969327c6756b878d9bd52b115 100644 (file)
@@ -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";
@@ -1753,7 +1751,9 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
     }
 
     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();
     return;
@@ -1768,13 +1768,14 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
       derr << "Corrupt fnode in dirfrag " << dirfrag()
         << ": " << err << dendl;
       clog->warn() << "Corrupt fnode header in " << dirfrag() << ": "
-                 << err;
+                 << err << " (" << get_path() << ")";
       go_bad();
       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();
       return;
     }
@@ -1833,7 +1834,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& 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
@@ -2887,9 +2888,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);
@@ -3152,3 +3151,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;
+}
+
index 7b6d4888f867f33ce6222b4820ff8adb84ed044b..8533ba8c1d2464933b7f41fddc6094f3f3471d8b 100644 (file)
@@ -42,6 +42,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!
@@ -510,6 +512,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; }