return;
}
- if (cur->last >= floor)
- _project_rstat_inode_to_frag(*curi, MAX(first, floor), cur->last, parent, linkunlink);
+ if (cur->last >= floor) {
+ bool update = true;
+ if (cur->state_test(CInode::STATE_AMBIGUOUSAUTH) && cur->is_auth()) {
+ // rename src inode is not projected in the slave rename prep case. so we should
+ // avoid updateing the inode.
+ assert(linkunlink < 0);
+ assert(cur->is_frozen_inode());
+ update = false;
+ }
+ _project_rstat_inode_to_frag(*curi, MAX(first, floor), cur->last, parent,
+ linkunlink, update);
+ }
if (g_conf->mds_snap_rstat) {
for (compact_set<snapid_t>::iterator p = cur->dirty_old_rstats.begin();
if (q == snaps.end() || *q > *p)
continue;
if (*p >= floor)
- _project_rstat_inode_to_frag(old.inode, ofirst, *p, parent, 0);
+ _project_rstat_inode_to_frag(old.inode, ofirst, *p, parent, 0, false);
}
}
cur->dirty_old_rstats.clear();
void MDCache::_project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
- CDir *parent, int linkunlink)
+ CDir *parent, int linkunlink, bool update_inode)
{
dout(10) << "_project_rstat_inode_to_frag [" << ofirst << "," << last << "]" << dendl;
dout(20) << " inode rstat " << inode.rstat << dendl;
}
dout(20) << " delta " << delta << dendl;
- inode.accounted_rstat = inode.rstat;
+ if (update_inode)
+ inode.accounted_rstat = inode.rstat;
while (last >= ofirst) {
/*
dout(20) << " project to [" << first << "," << last << "] " << *prstat << dendl;
assert(last >= first);
prstat->add(delta);
- inode.accounted_rstat = inode.rstat;
+ if (update_inode)
+ inode.accounted_rstat = inode.rstat;
dout(20) << " result [" << first << "," << last << "] " << *prstat << " " << *parent << dendl;
last = first-1;
void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first,
int linkunlink, SnapRealm *prealm);
void _project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
- CDir *parent, int linkunlink=0);
+ CDir *parent, int linkunlink, bool update_inode);
void project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accounted_rstat,
snapid_t ofirst, snapid_t last,
CInode *pin, bool cow_head);
if (srcdn && srcdn->authority().first == whoami) {
nest_info_t blah;
_rollback_repair_dir(mut, srcdir, rollback.orig_src, rollback.ctime,
- in ? in->is_dir() : false, 1, pi ? pi->rstat : blah);
+ in ? in->is_dir() : false, 1, pi ? pi->accounted_rstat : blah);
}
// repair dest