From 04e5f1b7e70a5e8e6f6f98de0006f08859b8e9f8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 23 Jul 2008 10:55:12 -0700 Subject: [PATCH] mds: project projected inodes' rstat. introduce old_fnode_t --- src/mds/CDir.h | 2 +- src/mds/CInode.cc | 34 +++++++++++++++++++++------------- src/mds/MDCache.cc | 18 +++++++++--------- src/mds/mdstypes.h | 15 +++++++++++++++ src/osdc/ObjectCacher.cc | 14 +++++++------- 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 40396830637b0..bf3681f63110a 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -158,7 +158,7 @@ class CDir : public MDSCacheObject { fnode_t fnode; snapid_t first; - map > dirty_old_fnodes; // [value.first,key] + map dirty_old_fnodes; // [value.first,key] protected: version_t projected_version; diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 479bd07cdfdef..358848c844fab 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -612,8 +612,10 @@ void CInode::encode_lock_state(int type, bufferlist& bl) 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); @@ -715,9 +717,11 @@ void CInode::decode_lock_state(int type, bufferlist& bl) frag_t fg; frag_info_t fragstat; frag_info_t accounted_fragstat; + map 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; @@ -728,18 +732,22 @@ void CInode::decode_lock_state(int type, bufferlist& bl) 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); } } } @@ -759,9 +767,11 @@ void CInode::decode_lock_state(int type, bufferlist& bl) 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; @@ -782,6 +792,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl) !(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()) @@ -874,17 +885,14 @@ void CInode::finish_scatter_gather_update(int type) for (map::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::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; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f5ccd29301a70..8b741a90b4486 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1114,29 +1114,29 @@ void MDCache::project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapi << " " << 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 >::iterator p = parent->dirty_old_fnodes.lower_bound(last); + map::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; } } @@ -1302,7 +1302,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, 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::iterator p = cur->dirty_old_rstats.begin(); p != cur->dirty_old_rstats.end(); @@ -1372,10 +1372,10 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, // rstat if (primary_dn) { project_rstat_frag_to_inode(*pf, follows+1, CEPH_NOSNAP, pin); - for (map >::iterator p = parent->dirty_old_fnodes.begin(); + for (map::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(); } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 93deae3ce5b91..d5f12a1ac7dd3 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -376,6 +376,21 @@ struct fnode_t { 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) + // ======= diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc index 9bc3865f8b450..675c05ad19d56 100644 --- a/src/osdc/ObjectCacher.cc +++ b/src/osdc/ObjectCacher.cc @@ -1337,15 +1337,15 @@ void ObjectCacher::purge(Object *ob) 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); } } -- 2.39.5