From bc2e9f2fe61d98c98d170a95d151c6f90dbc6b29 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 25 Jul 2008 15:25:00 -0700 Subject: [PATCH] mds: purge old_inode data too --- src/mds/CDir.cc | 8 ++++++++ src/mds/CInode.cc | 18 ++++++++++++++++++ src/mds/CInode.h | 1 + 3 files changed, 27 insertions(+) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 2cebdbba5f1b2..d56fe91a782e7 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1121,6 +1121,9 @@ void CDir::_fetched(bufferlist &bl) bufferlist snapbl; ::decode(snapbl, p); + + map old_inodes; + ::decode(old_inodes, p); if (dn) { if (dn->get_inode() == 0) { @@ -1151,6 +1154,7 @@ void CDir::_fetched(bufferlist &bl) in->dirfragtree.swap(fragtree); in->xattrs.swap(xattrs); in->decode_snap_blob(snapbl); + in->old_inodes.swap(old_inodes); // add cache->add_inode( in ); @@ -1388,6 +1392,10 @@ void CDir::_commit(version_t want) bufferlist snapbl; in->encode_snap_blob(snapbl); ::encode(snapbl, bl); + + if (in->is_multiversion()) + in->purge_stale_snap_data(snaps); + ::encode(in->old_inodes, bl); } } assert(n == 0); diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 5c913c107a716..6277a68fa990a 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1129,6 +1129,24 @@ void CInode::pre_cow_old_inode() cow_old_inode(follows, get_projected_inode()); } +void CInode::purge_stale_snap_data(const set& snaps) +{ + dout(10) << "purge_stale_snap_data " << snaps << dendl; + + if (old_inodes.empty()) + return; + + map::iterator p = old_inodes.begin(); + while (p != old_inodes.end()) { + set::const_iterator q = snaps.lower_bound(p->second.first); + if (q == snaps.end() || *q > p->first) { + dout(10) << " purging old_inode [" << p->second.first << "," << p->first << "]" << dendl; + old_inodes.erase(p++); + } else + p++; + } +} + /* * pick/create an old_inode that we can write into. */ diff --git a/src/mds/CInode.h b/src/mds/CInode.h index c1598ef1ed40f..43ffa489873e8 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -187,6 +187,7 @@ class CInode : public MDSCacheObject { old_inode_t& cow_old_inode(snapid_t follows, inode_t *pi); void pre_cow_old_inode(); + void purge_stale_snap_data(const set& snaps); // -- cache infrastructure -- private: -- 2.39.5