]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix fragstat/rstat verification
authorYan, Zheng <zyan@redhat.com>
Wed, 27 Apr 2016 03:54:34 +0000 (11:54 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 27 Apr 2016 07:32:25 +0000 (15:32 +0800)
difrags with 'version == 0' have invalid fragstat/rstat. So we can't
trust the accumulated fragstat/rstat if there are 'version 0' dirfrags

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CInode.cc

index 718c0bc2f8d982c43ff6a722f4f94eb9eaf4f91c..ea58d3831536d06545522ef8b4c050b6a6c2637a 100644 (file)
@@ -1969,6 +1969,7 @@ void CInode::finish_scatter_gather_update(int type)
     {
       fragtree_t tmpdft = dirfragtree;
       struct frag_info_t dirstat;
+      bool dirstat_valid = true;
 
       // adjust summation
       assert(is_auth());
@@ -1984,7 +1985,13 @@ void CInode::finish_scatter_gather_update(int type)
        CDir *dir = p->second;
        dout(20) << fg << " " << *dir << dendl;
 
-       bool update = dir->is_auth() && dir->get_version() != 0 &&  !dir->is_frozen();
+       bool update;
+       if (dir->get_version() != 0) {
+         update = dir->is_auth() && !dir->is_frozen();
+       } else {
+         update = false;
+         dirstat_valid = false;
+       }
 
        fnode_t *pf = dir->get_projected_fnode();
        if (update)
@@ -2023,16 +2030,15 @@ void CInode::finish_scatter_gather_update(int type)
        pi->mtime = pi->ctime = pi->dirstat.mtime;
       dout(20) << " final dirstat " << pi->dirstat << dendl;
 
-      if (!dirstat.same_sums(pi->dirstat)) {
-       bool all = true;
+      if (dirstat_valid && !dirstat.same_sums(pi->dirstat)) {
        list<frag_t> ls;
        tmpdft.get_leaves_under(frag_t(), ls);
        for (list<frag_t>::iterator p = ls.begin(); p != ls.end(); ++p)
          if (!dirfrags.count(*p)) {
-           all = false;
+           dirstat_valid = false;
            break;
          }
-       if (all) {
+       if (dirstat_valid) {
          if (state_test(CInode::STATE_REPAIRSTATS)) {
            dout(20) << " dirstat mismatch, fixing" << dendl;
          } else {
@@ -2068,6 +2074,7 @@ void CInode::finish_scatter_gather_update(int type)
       fragtree_t tmpdft = dirfragtree;
       nest_info_t rstat;
       rstat.rsubdirs = 1;
+      bool rstat_valid = true;
 
       // adjust summation
       assert(is_auth());
@@ -2081,7 +2088,13 @@ void CInode::finish_scatter_gather_update(int type)
        CDir *dir = p->second;
        dout(20) << fg << " " << *dir << dendl;
 
-       bool update = dir->is_auth() && dir->get_version() != 0 && !dir->is_frozen();
+       bool update;
+       if (dir->get_version() != 0) {
+         update = dir->is_auth() && !dir->is_frozen();
+       } else {
+         update = false;
+         rstat_valid = false;
+       }
 
        fnode_t *pf = dir->get_projected_fnode();
        if (update)
@@ -2122,16 +2135,15 @@ void CInode::finish_scatter_gather_update(int type)
       }
       dout(20) << " final rstat " << pi->rstat << dendl;
 
-      if (!rstat.same_sums(pi->rstat)) {
-       bool all = true;
+      if (rstat_valid && !rstat.same_sums(pi->rstat)) {
        list<frag_t> ls;
        tmpdft.get_leaves_under(frag_t(), ls);
        for (list<frag_t>::iterator p = ls.begin(); p != ls.end(); ++p)
          if (!dirfrags.count(*p)) {
-           all = false;
+           rstat_valid = false;
            break;
          }
-       if (all) {
+       if (rstat_valid) {
          if (state_test(CInode::STATE_REPAIRSTATS)) {
            dout(20) << " rstat mismatch, fixing" << dendl;
          } else {