From 7beeecc8523ceb771120fe46f29ccc1fe3b1f899 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 13 Aug 2010 14:46:23 -0700 Subject: [PATCH] mds: Use project_past_parent and pop_projected_snaprealm instead of add_past_parent hack. Adjusted pop_projected to invalidate caches if needed, and removed project_past_parent's deletion of projected snaprealm. Removed add_past_parent. --- src/mds/CInode.cc | 13 ++++++++++--- src/mds/Server.cc | 19 +++++-------------- src/mds/snap.cc | 19 ------------------- src/mds/snap.h | 1 - 4 files changed, 15 insertions(+), 37 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 1ecda336154..10bb09869ef 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -259,8 +259,10 @@ void CInode::project_past_parent(SnapRealm *newparent, bufferlist& snapbl) { sr_t *new_snap = project_snaprealm(); SnapRealm *oldparent; - if (!snaprealm) + if (!snaprealm) { oldparent = find_snaprealm(); + new_snap->seq = oldparent->get_newest_seq(); + } else oldparent = snaprealm->parent; @@ -271,8 +273,6 @@ void CInode::project_past_parent(SnapRealm *newparent, bufferlist& snapbl) new_snap->current_parent_since = MAX(oldparentseq, newparent->get_last_created()) + 1; } new_snap->encode(snapbl); - projected_srnode.pop_back(); - delete new_snap; } void CInode::pop_projected_snaprealm() @@ -280,11 +280,18 @@ void CInode::pop_projected_snaprealm() assert(!projected_srnode.empty()); dout(0) << "pop_projected_snaprealm " << projected_srnode.front() << " seq" << projected_srnode.front()->seq << dendl; + bool invalidate_cached_snaps = false; if (!snaprealm) open_snaprealm(); + else if (projected_srnode.front()->past_parents.size() != + snaprealm->srnode.past_parents.size()) + invalidate_cached_snaps = true; snaprealm->srnode = *projected_srnode.front(); delete projected_srnode.front(); projected_srnode.pop_front(); + + if (invalidate_cached_snaps) + snaprealm->invalidate_cached_snaps(); } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index c2175e925e2..95f59842174 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -4092,15 +4092,10 @@ void Server::_unlink_local_finish(MDRequest *mdr, dout(20) << " straydn is " << *straydn << dendl; straydnl = straydn->pop_projected_linkage(); - SnapRealm *oldparent = dn->get_dir()->inode->find_snaprealm(); - bool isnew = false; - if (!straydnl->get_inode()->snaprealm) { - straydnl->get_inode()->open_snaprealm(); - straydnl->get_inode()->snaprealm->srnode.seq = oldparent->get_newest_seq(); + if (!straydnl->get_inode()->snaprealm) isnew = true; - } - straydnl->get_inode()->snaprealm->add_past_parent(oldparent); + straydnl->get_inode()->pop_projected_snaprealm(); if (isnew) mdcache->do_realm_invalidate_and_update_notify(straydnl->get_inode(), CEPH_SNAP_OP_SPLIT, true); @@ -4882,14 +4877,10 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen straydn->get_dir()->link_primary_inode(straydn, oldin); if (straydn->is_auth()) { - SnapRealm *oldparent = destdn->get_dir()->inode->find_snaprealm(); bool isnew = false; - if (!straydnl->get_inode()->snaprealm) { - straydnl->get_inode()->open_snaprealm(); - straydnl->get_inode()->snaprealm->srnode.seq = oldparent->get_newest_seq(); + if (!straydnl->get_inode()->snaprealm) isnew = true; - } - straydnl->get_inode()->snaprealm->add_past_parent(oldparent); + straydnl->get_inode()->pop_projected_snaprealm(); if (isnew) mdcache->do_realm_invalidate_and_update_notify(straydnl->get_inode(), CEPH_SNAP_OP_SPLIT); } @@ -4962,7 +4953,7 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen // snap parent update? if (destdn->is_auth() && destdnl->get_inode()->snaprealm) - destdnl->get_inode()->snaprealm->add_past_parent(srcdn->get_dir()->inode->find_snaprealm()); + destdnl->get_inode()->pop_projected_snaprealm(); } // src diff --git a/src/mds/snap.cc b/src/mds/snap.cc index 61baa7afe82..8d465f7c6f0 100644 --- a/src/mds/snap.cc +++ b/src/mds/snap.cc @@ -467,25 +467,6 @@ void SnapRealm::build_snap_trace(bufferlist& snapbl) -void SnapRealm::add_past_parent(SnapRealm *oldparent) -{ - snapid_t newlast = parent->get_last_created(); - snapid_t oldlast = oldparent->get_newest_seq(); - snapid_t first = srnode.current_parent_since; - - if (oldlast >= srnode.current_parent_since) { - srnode.past_parents[oldlast].ino = oldparent->inode->ino(); - srnode.past_parents[oldlast].first = first; - add_open_past_parent(oldparent); - dout(10) << "add_past_parent [" << first << "," << oldlast << "] = " - << oldparent->inode->ino() << dendl; - } - srnode.current_parent_since = MAX(oldlast, newlast) + 1; - dout(10) << "add_past_parent current_parent_since " << srnode.current_parent_since << dendl; - - invalidate_cached_snaps(); -} - void SnapRealm::prune_past_parents() { dout(10) << "prune_past_parents" << dendl; diff --git a/src/mds/snap.h b/src/mds/snap.h index 376eeb1533c..899c2977b98 100644 --- a/src/mds/snap.h +++ b/src/mds/snap.h @@ -208,7 +208,6 @@ struct SnapRealm { void add_open_past_parent(SnapRealm *parent); void close_parents(); - void add_past_parent(SnapRealm *oldparent); void prune_past_parents(); bool has_past_parents() { return !srnode.past_parents.empty(); }