]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Use project_past_parent and pop_projected_snaprealm instead of
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 13 Aug 2010 21:46:23 +0000 (14:46 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 16 Aug 2010 22:41:40 +0000 (15:41 -0700)
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
src/mds/Server.cc
src/mds/snap.cc
src/mds/snap.h

index 1ecda3361542e2bfc1c76b75c2c428d86b39f5e5..10bb09869ef9cecc21bb809fca0a7729fa0dfbf0 100644 (file)
@@ -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();
 }
 
 
index c2175e925e2e392aadc0e556c8800d4dab0f6bb9..95f598421745ab51e156bd13e6eeccf5ad253b88 100644 (file)
@@ -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
index 61baa7afe82a1c77ff7b77c83ca3f47da01135dd..8d465f7c6f01a86fb1e456fb46ac00ee81f9be99 100644 (file)
@@ -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;
index 376eeb1533c439d09963eed7a90cf658ecebd750..899c2977b98a57a709fbca7fcb42f52bb9b0c005 100644 (file)
@@ -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(); }