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
}
// 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;
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);
}
// 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;
}
}
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);
}
// 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;
}
}
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;
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);
}
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;
}
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 &&