From: Sage Weil Date: Wed, 23 Jul 2008 20:00:27 +0000 (-0700) Subject: mds: closer... X-Git-Tag: v0.4~417 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fe71e8cc2b18a0a662da3b0ccad5c6bef6b76ef2;p=ceph.git mds: closer... --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 358848c844fa..e08423d477af 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1102,13 +1102,13 @@ snapid_t CInode::get_oldest_snap() } -void CInode::cow_old_inode(snapid_t follows) +old_inode_t& CInode::cow_old_inode(snapid_t follows, inode_t *pi) { assert(follows >= first); old_inode_t &old = old_inodes[follows]; old.first = first; - old.inode = *get_previous_projected_inode(); + old.inode = *pi; old.xattrs = xattrs; if (!(old.inode.rstat == old.inode.accounted_rstat)) @@ -1118,6 +1118,8 @@ void CInode::cow_old_inode(snapid_t follows) dout(10) << "cow_old_inode to [" << old.first << "," << follows << "] on " << *this << dendl; + + return old; } /* diff --git a/src/mds/CInode.h b/src/mds/CInode.h index a29813c59fa4..f763f279d009 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -185,7 +185,7 @@ class CInode : public MDSCacheObject { map::iterator pick_dirty_old_inode(snapid_t last); - void cow_old_inode(snapid_t follows); + old_inode_t& cow_old_inode(snapid_t follows, inode_t *pi); // -- cache infrastructure -- private: diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 8b741a90b448..14f69a2ee80a 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -274,6 +274,8 @@ CInode *MDCache::create_stray_inode(int whose) in->inode.nlink = 1; in->inode.layout = g_default_mds_dir_layout; + in->open_snaprealm(); + add_inode( in ); return in; @@ -1028,7 +1030,7 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll if (follows < in->first) return; - in->cow_old_inode(follows); + in->cow_old_inode(follows, in->get_previous_projected_inode()); } else { if (follows == CEPH_NOSNAP) follows = dn->dir->inode->find_snaprealm()->get_latest_snap(); @@ -1167,11 +1169,15 @@ void MDCache::project_rstat_frag_to_inode(fnode_t& fnode, snapid_t ofirst, snapi if (last == pin->last) { pi = pin->get_projected_inode(); first = MAX(ofirst, pin->first); - if (first > pin->first) - pin->cow_old_inode(first-1); + if (first > pin->first) { + old_inode_t& old = pin->cow_old_inode(first-1, pi); + dout(20) << " cloned old_inode rstat is " << old.inode.rstat << dendl; + } } else if (last >= pin->first) { first = pin->first; - pin->cow_old_inode(last); + old_inode_t& old = pin->cow_old_inode(last, pin->get_projected_inode()); + pi = &old.inode; + pin->dirty_old_rstats.insert(last); } else { map::iterator p = pin->old_inodes.lower_bound(last); if (p == pin->old_inodes.end()) { @@ -1184,13 +1190,15 @@ void MDCache::project_rstat_frag_to_inode(fnode_t& fnode, snapid_t ofirst, snapi << (last+1) << "," << p->first << dendl; pin->old_inodes[last] = p->second; p->second.first = last+1; + pin->dirty_old_rstats.insert(p->first); } + pi = &pin->old_inodes[last].inode; + pin->dirty_old_rstats.insert(last); } - dout(10) << " projecting to [" << first << "," << last << "]" << dendl; - + dout(10) << " projecting to [" << first << "," << last << "] " << pi->rstat << dendl; pi->rstat.version++; pi->rstat.add(delta); - dout(15) << " result " << pi->rstat << dendl; + dout(15) << " result [" << first << "," << last << "] " << pi->rstat << dendl; last = first-1; } @@ -1293,16 +1301,18 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, // rstat snapid_t follows; + follows = cfollows; + if (follows == CEPH_NOSNAP || follows == 0) { + SnapRealm *prealm = parent->inode->find_snaprealm(); + follows = prealm->get_latest_snap(); + } + snapid_t first = follows+1; + if (cur->first > first) + first = cur->first; if (primary_dn) { - follows = cfollows; - if (follows == CEPH_NOSNAP || follows == 0) { - SnapRealm *prealm = parent->inode->find_snaprealm(); - follows = prealm->get_latest_snap(); - } - dout(10) << " frag head is [" << parent->first << ",head] " << dendl; - dout(10) << " inode update is [" << follows+1 << "," << cur->last << "]" << dendl; - project_rstat_inode_to_frag(*curi, follows+1, cur->last, parent, linkunlink); + dout(10) << " inode update is [" << first << "," << cur->last << "]" << dendl; + project_rstat_inode_to_frag(*curi, first, cur->last, parent, linkunlink); for (set::iterator p = cur->dirty_old_rstats.begin(); p != cur->dirty_old_rstats.end(); @@ -1326,8 +1336,8 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, mut->wrlocks.count(&pin->nestlock) == 0 && (!pin->can_auth_pin() || !pin->versionlock.can_wrlock() || // make sure we can take versionlock, too - //true - !mds->locker->scatter_wrlock_try(&pin->nestlock, mut, false) + true + //!mds->locker->scatter_wrlock_try(&pin->nestlock, mut, false) )) { // ** do not initiate.. see above comment ** dout(10) << "predirty_journal_parents can't wrlock one of " << pin->versionlock << " or " << pin->nestlock << " on " << *pin << dendl; @@ -1371,7 +1381,7 @@ void MDCache::predirty_journal_parents(Mutation *mut, EMetaBlob *blob, // rstat if (primary_dn) { - project_rstat_frag_to_inode(*pf, follows+1, CEPH_NOSNAP, pin); + project_rstat_frag_to_inode(*pf, first, CEPH_NOSNAP, pin); for (map::iterator p = parent->dirty_old_fnodes.begin(); p != parent->dirty_old_fnodes.end(); p++)