]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: do not complain/assert about stray inode rstat/fragstat consistency
authorSage Weil <sage.weil@dreamhost.com>
Sun, 21 Aug 2011 03:42:30 +0000 (20:42 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Sun, 21 Aug 2011 03:42:30 +0000 (20:42 -0700)
We instantiate the stray dirfrags without reading the fragstat off of disk
because it's faster, we know the dentry is unique, and we don't care about
the stats.  It can lead to inconsistency between the dirfrag frag/rstat
and the inodes, though.  Silently clean it up when we hit it; that's
simpler than not maintaining it at all for those directories.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/CInode.cc
src/mds/MDCache.cc

index aa306adfcb868d27b2aa813f3d045ea0fb91f3fe..6fcce464eeffc14687de82579c2212fc33afcaab 100644 (file)
@@ -1650,15 +1650,17 @@ void CInode::finish_scatter_gather_update(int type)
 
        if (pf->fragstat.nfiles < 0 ||
            pf->fragstat.nsubdirs < 0) {
-         clog.error() << "bad/negative dir size on "
-             << dir->dirfrag() << " " << pf->fragstat << "\n";
+         if (!is_stray())
+           clog.error() << "bad/negative dir size on "
+                        << dir->dirfrag() << " " << pf->fragstat << "\n";
          
          if (pf->fragstat.nfiles < 0)
            pf->fragstat.nfiles = 0;
          if (pf->fragstat.nsubdirs < 0)
            pf->fragstat.nsubdirs = 0;
 
-         assert(!"bad/negative frag size" == g_conf->mds_verify_scatter);
+         if (!is_stray())
+           assert(!"bad/negative frag size" == g_conf->mds_verify_scatter);
        }
 
        if (update) {
@@ -1669,16 +1671,18 @@ void CInode::finish_scatter_gather_update(int type)
 
        if (fg == frag_t()) { // i.e., we are the only frag
          if (pi->dirstat.size() != pf->fragstat.size()) {
-           clog.error() << "unmatched fragstat size on single "
-              << "dirfrag " << dir->dirfrag() << ", inode has " 
-              << pi->dirstat << ", dirfrag has " << pf->fragstat << "\n";
+           if (!is_stray())
+             clog.error() << "unmatched fragstat size on single "
+                          << "dirfrag " << dir->dirfrag() << ", inode has " 
+                          << pi->dirstat << ", dirfrag has " << pf->fragstat << "\n";
            
            // trust the dirfrag for now
            version_t v = pi->dirstat.version;
            pi->dirstat = pf->fragstat;
            pi->dirstat.version = v;
 
-           assert(!"unmatched fragstat size" == g_conf->mds_verify_scatter);
+           if (!is_stray())
+             assert(!"unmatched fragstat size" == g_conf->mds_verify_scatter);
          }
        }
       }
@@ -1688,15 +1692,17 @@ void CInode::finish_scatter_gather_update(int type)
 
       if (pi->dirstat.nfiles < 0 ||
          pi->dirstat.nsubdirs < 0) {
-       clog.error() << "bad/negative dir size on " << ino()
-           << ", inode has " << pi->dirstat << "\n";
+       if (!is_stray())
+         clog.error() << "bad/negative dir size on " << ino()
+                      << ", inode has " << pi->dirstat << "\n";
 
        if (pi->dirstat.nfiles < 0)
          pi->dirstat.nfiles = 0;
        if (pi->dirstat.nsubdirs < 0)
          pi->dirstat.nsubdirs = 0;
 
-       assert(!"bad/negative dir size" == g_conf->mds_verify_scatter);
+       if (!is_stray())
+         assert(!"bad/negative dir size" == g_conf->mds_verify_scatter);
       }
     }
     break;
@@ -1752,16 +1758,18 @@ void CInode::finish_scatter_gather_update(int type)
 
        if (fg == frag_t()) { // i.e., we are the only frag
          if (pi->rstat.rbytes != pf->rstat.rbytes) { 
-           clog.error() << "unmatched rstat rbytes on single dirfrag "
-               << dir->dirfrag() << ", inode has " << pi->rstat
-               << ", dirfrag has " << pf->rstat << "\n";
+           if (!is_stray())
+             clog.error() << "unmatched rstat rbytes on single dirfrag "
+                          << dir->dirfrag() << ", inode has " << pi->rstat
+                          << ", dirfrag has " << pf->rstat << "\n";
            
            // trust the dirfrag for now
            version_t v = pi->rstat.version;
            pi->rstat = pf->rstat;
            pi->rstat.version = v;
            
-           assert(!"unmatched rstat rbytes" == g_conf->mds_verify_scatter);
+           if (!is_stray())
+             assert(!"unmatched rstat rbytes" == g_conf->mds_verify_scatter);
          }
        }
        if (update)
@@ -1771,15 +1779,17 @@ void CInode::finish_scatter_gather_update(int type)
 
       //assert(pi->rstat.rfiles >= 0);
       if (pi->rstat.rfiles < 0) {
-       clog.error() << "rfiles underflow " << pi->rstat.rfiles
-         << " on " << *this << "\n";
+       if (!is_stray())
+         clog.error() << "rfiles underflow " << pi->rstat.rfiles
+                      << " on " << *this << "\n";
        pi->rstat.rfiles = 0;
       }
 
       //assert(pi->rstat.rsubdirs >= 0);
       if (pi->rstat.rsubdirs < 0) {
-       clog.error() << "rsubdirs underflow " << pi->rstat.rfiles
-         << " on " << *this << "\n";
+       if (!is_stray())
+         clog.error() << "rsubdirs underflow " << pi->rstat.rfiles
+                      << " on " << *this << "\n";
        pi->rstat.rsubdirs = 0;
       }
     }
index e82e3d660d7e89426e6de6949d3b486d4ecc35da..08166d03b5e892036c9d27c1f1413b305ab272d4 100644 (file)
@@ -1769,7 +1769,7 @@ void MDCache::project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accou
     pi->rstat.add(delta);
     dout(20) << "        result [" << first << "," << last << "] " << pi->rstat << dendl;
 
-    if (pi->rstat.rbytes < 0)
+    if (pi->rstat.rbytes < 0 && !pin->is_stray())
       assert(!"negative rstat rbytes" == g_conf->mds_verify_scatter);
 
     last = first-1;
@@ -2004,18 +2004,20 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
        pi->mtime = pi->ctime = pi->dirstat.mtime;
       dout(20) << "predirty_journal_parents     gives " << pi->dirstat << " on " << *pin << dendl;
 
-      if (pi->dirstat.size() < 0)
+      if (pi->dirstat.size() < 0 && !pin->is_stray())
        assert(!"negative dirstat size" == g_conf->mds_verify_scatter);
       if (parent->get_frag() == frag_t()) { // i.e., we are the only frag
        if (pi->dirstat.size() != pf->fragstat.size()) {
-         mds->clog.error() << "unmatched fragstat size on single dirfrag "
-            << parent->dirfrag() << ", inode has " << pi->dirstat
-            << ", dirfrag has " << pf->fragstat << "\n";
+         if (!pin->is_stray())
+           mds->clog.error() << "unmatched fragstat size on single dirfrag "
+                             << parent->dirfrag() << ", inode has " << pi->dirstat
+                             << ", dirfrag has " << pf->fragstat << "\n";
          
          // trust the dirfrag for now
          pi->dirstat = pf->fragstat;
 
-         assert(!"unmatched fragstat size" == g_conf->mds_verify_scatter);
+         if (!pin->is_stray())
+           assert(!"unmatched fragstat size" == g_conf->mds_verify_scatter);
        }
       }
     }
@@ -2054,15 +2056,17 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
       pf->accounted_rstat = pf->rstat;
 
       if (parent->get_frag() == frag_t()) { // i.e., we are the only frag
-       if (pi->rstat.rbytes != pf->rstat.rbytes) { 
-         mds->clog.error() << "unmatched rstat rbytes on single dirfrag "
-             << parent->dirfrag() << ", inode has " << pi->rstat
-             << ", dirfrag has " << pf->rstat << "\n";
+       if (pi->rstat.rbytes != pf->rstat.rbytes) {
+         if (!pin->is_stray())
+           mds->clog.error() << "unmatched rstat rbytes on single dirfrag "
+                             << parent->dirfrag() << ", inode has " << pi->rstat
+                             << ", dirfrag has " << pf->rstat << "\n";
          
          // trust the dirfrag for now
          pi->rstat = pf->rstat;
 
-         assert(!"unmatched rstat rbytes" == g_conf->mds_verify_scatter);
+         if (!pin->is_stray())
+           assert(!"unmatched rstat rbytes" == g_conf->mds_verify_scatter);
        }
       }
     }