fnode_t fnode;
snapid_t first;
- map<snapid_t,pair<snapid_t,fnode_t> > dirty_old_fnodes; // [value.first,key]
+ map<snapid_t,old_fnode_t> dirty_old_fnodes; // [value.first,key]
protected:
version_t projected_version;
dout(20) << " accounted_rstat " << p->second->fnode.accounted_rstat << dendl;
frag_t fg = p->second->dirfrag().frag;
::encode(fg, tmp);
+ ::encode(p->second->first, tmp);
::encode(p->second->fnode.rstat, tmp);
::encode(p->second->fnode.accounted_rstat, tmp);
+ ::encode(p->second->dirty_old_fnodes, tmp);
n++;
}
::encode(n, bl);
frag_t fg;
frag_info_t fragstat;
frag_info_t accounted_fragstat;
+ map<snapid_t,old_fnode_t> dirty_old_fnodes;
::decode(fg, p);
::decode(fragstat, p);
::decode(accounted_fragstat, p);
+ ::decode(dirty_old_fnodes, p);
dout(10) << fg << " got changed fragstat " << fragstat << dendl;
dout(20) << fg << " accounted_fragstat " << accounted_fragstat << dendl;
dout(20) << " " << fg << " accounted_fragstat " << accounted_fragstat << dendl;
dir->fnode.fragstat = fragstat;
dir->fnode.accounted_fragstat = accounted_fragstat;
- if (!(fragstat == accounted_fragstat))
+ dir->dirty_old_fnodes.swap(dirty_old_fnodes);
+ if (!(fragstat == accounted_fragstat) ||
+ dirty_old_fnodes.size())
dirlock.set_updated();
} else {
if (dir &&
dir->is_auth() &&
- !(dir->fnode.accounted_fragstat == fragstat)) {
+ (!(dir->fnode.accounted_fragstat == fragstat) ||
+ dirty_old_fnodes.size())) {
dout(10) << " setting accounted_fragstat " << fragstat << " and setting dirty bit on "
<< *dir << dendl;
fnode_t *pf = dir->get_projected_fnode();
pf->accounted_fragstat = fragstat;
if (dir->is_auth())
dir->_set_dirty_flag(); // bit of a hack
+ dir->dirty_old_fnodes.swap(dirty_old_fnodes);
}
}
}
dout(10) << " ...got " << n << " rstats on " << *this << dendl;
while (n--) {
frag_t fg;
+ snapid_t fgfirst;
nest_info_t rstat;
nest_info_t accounted_rstat;
::decode(fg, p);
+ ::decode(fgfirst, p);
::decode(rstat, p);
::decode(accounted_rstat, p);
dout(10) << fg << " got changed rstat " << rstat << dendl;
!(dir->fnode.accounted_rstat == rstat)) {
dout(10) << " setting accounted_rstat " << rstat << " and setting dirty bit on "
<< *dir << dendl;
+ dir->first = fgfirst;
fnode_t *pf = dir->get_projected_fnode();
pf->accounted_rstat = rstat;
if (dir->is_auth())
for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
p++) {
- fnode_t *pf = p->second->get_projected_fnode();
- if (true) { // FIXME pf->accounted_rstat.version == pi->rstat.version) {
- dout(20) << " frag " << p->first << " " << *p->second << dendl;
- dout(20) << " rstat " << pf->rstat << dendl;
- dout(20) << " accounted_rstat " << pf->accounted_rstat << dendl;
- pi->rstat.take_diff(pf->rstat,
- pf->accounted_rstat);
- } else {
- dout(20) << " frag " << p->first << " on " << *p->second << dendl;
- dout(20) << " ignoring OLD accounted_rstat " << pf->accounted_rstat << dendl;
- }
+ CDir *dir = p->second;
+ fnode_t *pf = dir->get_projected_fnode();
+ mdcache->project_rstat_frag_to_inode(*pf, dir->first, CEPH_NOSNAP, this);
+ for (map<snapid_t,old_fnode_t>::iterator q = dir->dirty_old_fnodes.begin();
+ q != dir->dirty_old_fnodes.end();
+ q++)
+ mdcache->project_rstat_frag_to_inode(q->second.fnode, q->second.first, q->first, this);
+ dir->dirty_old_fnodes.clear();
}
pi->rstat.version++;
dout(20) << " final rstat " << pi->rstat << dendl;
<< " " << pf->rstat << "/" << pf->accounted_rstat
<< dendl;
parent->dirty_old_fnodes[first-1].first = parent->first;
- parent->dirty_old_fnodes[first-1].second = *pf;
+ parent->dirty_old_fnodes[first-1].fnode = *pf;
parent->first = first;
}
} else if (last >= parent->first) {
first = parent->first;
parent->dirty_old_fnodes[last].first = first;
- parent->dirty_old_fnodes[last].second = *parent->get_projected_fnode();
- pf = &parent->dirty_old_fnodes[last].second;
+ parent->dirty_old_fnodes[last].fnode = *parent->get_projected_fnode();
+ pf = &parent->dirty_old_fnodes[last].fnode;
dout(10) << " projecting to newly split dirty_old_fnode [" << first << "," << last << "] "
<< " " << pf->rstat << "/" << pf->accounted_rstat << dendl;
} else {
- map<snapid_t,pair<snapid_t,fnode_t> >::iterator p = parent->dirty_old_fnodes.lower_bound(last);
+ map<snapid_t,old_fnode_t>::iterator p = parent->dirty_old_fnodes.lower_bound(last);
if (p == parent->dirty_old_fnodes.end()) {
first = ofirst;
parent->dirty_old_fnodes[last].first = first;
- pf = &parent->dirty_old_fnodes[last].second;
+ pf = &parent->dirty_old_fnodes[last].fnode;
} else {
first = p->second.first;
if (last < p->first) {
parent->dirty_old_fnodes[last] = p->second;
p->second.first = last+1;
}
- pf = &parent->dirty_old_fnodes[last].second;
+ pf = &parent->dirty_old_fnodes[last].fnode;
}
}
dout(10) << " frag head is [" << parent->first << ",head] " << dendl;
dout(10) << " inode update is [" << follows+1 << "," << cur->last << "]" << dendl;
- project_rstat_inode_to_frag(cur->inode, follows+1, cur->last, parent, linkunlink);
+ project_rstat_inode_to_frag(*curi, follows+1, cur->last, parent, linkunlink);
for (set<snapid_t>::iterator p = cur->dirty_old_rstats.begin();
p != cur->dirty_old_rstats.end();
// rstat
if (primary_dn) {
project_rstat_frag_to_inode(*pf, follows+1, CEPH_NOSNAP, pin);
- for (map<snapid_t,pair<snapid_t,fnode_t> >::iterator p = parent->dirty_old_fnodes.begin();
+ for (map<snapid_t,old_fnode_t>::iterator p = parent->dirty_old_fnodes.begin();
p != parent->dirty_old_fnodes.end();
p++)
- project_rstat_frag_to_inode(p->second.second, p->second.first, p->first, pin);
+ project_rstat_frag_to_inode(p->second.fnode, p->second.first, p->first, pin);
parent->dirty_old_fnodes.clear();
}
WRITE_CLASS_ENCODER(fnode_t)
+struct old_fnode_t {
+ snapid_t first;
+ fnode_t fnode;
+
+ void encode(bufferlist& bl) const {
+ ::encode(first, bl);
+ ::encode(fnode, bl);
+ }
+ void decode(bufferlist::iterator& bl) {
+ ::decode(first, bl);
+ ::decode(fnode, bl);
+ }
+};
+WRITE_CLASS_ENCODER(old_fnode_t)
+
// =======
p != ob->data.end();
p++) {
BufferHead *bh = p->second;
- if (!bh->is_clean())
- dout(0) << "purge forcibly removing " << *ob << " " << *bh << dendl;
- bh_remove(ob, bh);
- delete bh;
+ if (!bh->is_clean())
+ dout(0) << "purge forcibly removing " << *ob << " " << *bh << dendl;
+ bh_remove(ob, bh);
+ delete bh;
}
-
+
if (ob->can_close()) {
- dout(10) << "trim trimming " << *ob << dendl;
- close_object(ob);
+ dout(10) << "trim trimming " << *ob << dendl;
+ close_object(ob);
}
}