]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add more verify_scatter asserts
authorSage Weil <sage@newdream.net>
Sat, 6 Nov 2010 00:06:10 +0000 (17:06 -0700)
committerSage Weil <sage@newdream.net>
Sat, 6 Nov 2010 00:06:10 +0000 (17:06 -0700)
For catchings fragstat errors sooner.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/MDCache.cc

index c6b9e0b2a48133253548f40ca8dec34995880517..38ae101ec3e1756e925c2b2c4df41aef697e361d 100644 (file)
@@ -1629,7 +1629,10 @@ void MDCache::project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accou
     dout(20) << " projecting to [" << first << "," << last << "] " << pi->rstat << dendl;
     pi->rstat.add(delta);
     dout(20) << "        result [" << first << "," << last << "] " << pi->rstat << dendl;
-    
+
+    if (pi->rstat.rbytes < 0)
+      assert(!"negative rstat rbytes" == g_conf.mds_verify_scatter);
+
     last = first-1;
   }
 }
@@ -1855,6 +1858,24 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob,
       if (touched_mtime)
        pi->mtime = pi->ctime = pi->dirstat.mtime;
       dout(20) << "predirty_journal_parents     gives " << pi->dirstat << " on " << *pin << dendl;
+
+      if (pi->dirstat.size() < 0)
+       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()) {
+         stringstream ss;
+         ss << "unmatched fragstat size on single dirfrag " << parent->dirfrag()
+            << ", inode has " << pi->dirstat << ", dirfrag has " << pf->fragstat;
+         mds->logclient.log(LOG_ERROR, ss);
+         
+         // 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);
+       }
+      }
     }
 
     /*