From: Yan, Zheng Date: Wed, 25 Nov 2015 13:28:58 +0000 (+0800) Subject: mds: scrub fragstat.mtime and rstat.rctime X-Git-Tag: v10.1.0~176^2~1^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f2de29e3a1a6322c8d0f70bf9b14067174f3d7e1;p=ceph.git mds: scrub fragstat.mtime and rstat.rctime Signed-off-by: Yan, Zheng --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 6866943e5117..f49970046e37 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -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; diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 8a643277d303..ad73d1ca3d99 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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 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 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; } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 0f6649b2b2af..712687f16ebd 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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); diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 2d424be12b3f..c42d62110029 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -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 &&