]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: scrub fragstat.mtime and rstat.rctime
authorYan, Zheng <zyan@redhat.com>
Wed, 25 Nov 2015 13:28:58 +0000 (21:28 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 7 Mar 2016 07:59:13 +0000 (15:59 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CDir.cc
src/mds/CInode.cc
src/mds/MDCache.cc
src/mds/mdstypes.h

index 6866943e511717eb2d357eb171ec7e4ddf47e0ad..f49970046e370ffbed2c79c130d71185e3665135 100644 (file)
@@ -249,8 +249,7 @@ bool CDir::check_rstats(bool scrub)
 
   bool good = true;
   // fragstat
-  if(!(frag_info.nfiles == fnode.fragstat.nfiles) ||
-     !(frag_info.nsubdirs == fnode.fragstat.nsubdirs)) {
+  if(!frag_info.same_sums(fnode.fragstat)) {
     dout(1) << "mismatch between head items and fnode.fragstat! printing dentries" << dendl;
     dout(1) << "get_num_head_items() = " << get_num_head_items()
              << "; fnode.fragstat.nfiles=" << fnode.fragstat.nfiles
@@ -263,9 +262,7 @@ bool CDir::check_rstats(bool scrub)
   }
 
   // rstat
-  if ((!(nest_info.rbytes == fnode.rstat.rbytes)) ||
-      (!(nest_info.rfiles == fnode.rstat.rfiles)) ||
-      (!(nest_info.rsubdirs == fnode.rstat.rsubdirs))) {
+  if (!nest_info.same_sums(fnode.rstat)) {
     dout(1) << "mismatch between child accounted_rstats and my rstats!" << dendl;
     dout(1) << "total of child dentrys: " << nest_info << dendl;
     dout(1) << "my rstats:              " << fnode.rstat << dendl;
index 8a643277d3036a3e9b634f43deebb4b9c7fa3610..ad73d1ca3d99e10c9d327ef1d61b52353ec820c3 100644 (file)
@@ -2033,8 +2033,7 @@ void CInode::finish_scatter_gather_update(int type)
        pi->mtime = pi->ctime = pi->dirstat.mtime;
       dout(20) << " final dirstat " << pi->dirstat << dendl;
 
-      if (dirstat.nfiles != pi->dirstat.nfiles ||
-         dirstat.nsubdirs != pi->dirstat.nsubdirs) {
+      if (!dirstat.same_sums(pi->dirstat)) {
        bool all = true;
        list<frag_t> ls;
        tmpdft.get_leaves_under(frag_t(), ls);
@@ -2053,6 +2052,8 @@ void CInode::finish_scatter_gather_update(int type)
          }
          // trust the dirfrags for now
          version_t v = pi->dirstat.version;
+         if (pi->dirstat.mtime > dirstat.mtime)
+           dirstat.mtime = pi->dirstat.mtime;
          pi->dirstat = dirstat;
          pi->dirstat.version = v;
        }
@@ -2131,9 +2132,7 @@ void CInode::finish_scatter_gather_update(int type)
       }
       dout(20) << " final rstat " << pi->rstat << dendl;
 
-      if (rstat.rfiles != pi->rstat.rfiles ||
-         rstat.rsubdirs != pi->rstat.rsubdirs ||
-         rstat.rbytes != pi->rstat.rbytes) {
+      if (!rstat.same_sums(pi->rstat)) {
        bool all = true;
        list<frag_t> ls;
        tmpdft.get_leaves_under(frag_t(), ls);
@@ -2152,6 +2151,8 @@ void CInode::finish_scatter_gather_update(int type)
          }
          // trust the dirfrag for now
          version_t v = pi->rstat.version;
+         if (pi->rstat.rctime > rstat.rctime)
+           rstat.rctime = pi->rstat.rctime;
          pi->rstat = rstat;
          pi->rstat.version = v;
        }
index 0f6649b2b2af1d41d44eef64fc192cc2196d4048..712687f16ebd7fddf37f14be7bd6d495df6f0d40 100644 (file)
@@ -11909,16 +11909,9 @@ void MDCache::repair_dirfrag_stats_work(MDRequestRef& mdr)
   }
 
   fnode_t *pf = dir->get_projected_fnode();
-  bool bad_fragstat = false, bad_rstat = false;
-  if (frag_info.nfiles != pf->fragstat.nfiles ||
-      frag_info.nsubdirs != pf->fragstat.nsubdirs)
-    bad_fragstat = true;
-  if (nest_info.rfiles != pf->rstat.rfiles ||
-      nest_info.rsubdirs != pf->rstat.rsubdirs ||
-      nest_info.rbytes != pf->rstat.rbytes)
-    bad_rstat = true;
-
-  if (!bad_fragstat || !bad_rstat) {
+  bool good_fragstat = frag_info.same_sums(pf->fragstat);
+  bool good_rstat = nest_info.same_sums(pf->rstat);
+  if (good_fragstat && good_rstat) {
     dout(10) << __func__ << " no corruption found" << dendl;
     mds->server->respond_to_request(mdr, 0);
     return;
@@ -11932,15 +11925,18 @@ void MDCache::repair_dirfrag_stats_work(MDRequestRef& mdr)
   EUpdate *le = new EUpdate(mds->mdlog, "repair_dirfrag");
   mds->mdlog->start_entry(le);
 
-  if (bad_fragstat) {
-    pf->fragstat.nfiles = frag_info.nfiles;
-    pf->fragstat.nsubdirs = frag_info.nsubdirs;
+  if (!good_fragstat) {
+    if (pf->fragstat.mtime > frag_info.mtime)
+      frag_info.mtime = pf->fragstat.mtime;
+    pf->fragstat = frag_info;
     mds->locker->mark_updated_scatterlock(&diri->filelock);
     mdr->ls->dirty_dirfrag_dir.push_back(&diri->item_dirty_dirfrag_dir);
     mdr->add_updated_lock(&diri->filelock);
   }
 
-  if (bad_rstat) {
+  if (!good_rstat) {
+    if (pf->rstat.rctime > nest_info.rctime)
+      nest_info.rctime = pf->rstat.rctime;
     pf->rstat = nest_info;
     mds->locker->mark_updated_scatterlock(&diri->nestlock);
     mdr->ls->dirty_dirfrag_nest.push_back(&diri->item_dirty_dirfrag_nest);
index 2d424be12b3f41e5d7d2107eeb6226909aaf018d..c42d6211002948e0f691a8cc6437230f2fa2cd08 100644 (file)
@@ -162,7 +162,9 @@ struct frag_info_t : public scatter_info_t {
   }
 
   bool same_sums(const frag_info_t &o) const {
-    return nfiles == o.nfiles && nsubdirs == o.nsubdirs;
+    return mtime <= o.mtime &&
+       nfiles == o.nfiles &&
+       nsubdirs == o.nsubdirs;
   }
 
   void encode(bufferlist &bl) const;
@@ -218,7 +220,7 @@ struct nest_info_t : public scatter_info_t {
   }
 
   bool same_sums(const nest_info_t &o) const {
-    return rctime == o.rctime &&
+    return rctime <= o.rctime &&
         rbytes == o.rbytes &&
         rfiles == o.rfiles &&
         rsubdirs == o.rsubdirs &&