]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: basic rename, more journal_dirty_inode
authorSage Weil <sage@newdream.net>
Fri, 18 Jul 2008 19:37:02 +0000 (12:37 -0700)
committerSage Weil <sage@newdream.net>
Fri, 18 Jul 2008 19:37:02 +0000 (12:37 -0700)
src/TODO
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/Server.cc

index 59cb1af913734b81337639017d5a1a2cde1ccd68..5b29743a8dee3109d0dce7efce5d3416994d09d7 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -256,7 +256,6 @@ todo
   - leases on snapshotted inodes.. cuz the dirstat updates will be lazy..
 
 - mds server ops
-  - rename
   - link rollback
   - rename rollback
 
index 4fa234ab84bfaf9e14253189e9a3a7bb3c1d7d89..835387db6dca526e7d5a238961796ebda9bbd64f 100644 (file)
@@ -886,7 +886,7 @@ bool Locker::check_inode_max_size(CInode *in, bool forceupdate, __u64 new_size)
     predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY);
   else
     le->metablob.add_dir_context(in->get_parent_dir());
-  le->metablob.add_primary_dentry(in->parent, true, 0, pi);
+  mdcache->journal_dirty_inode(&le->metablob, in);
   le->add_ino(in->ino());
   mut->ls->open_files.push_back(&in->xlist_open_file);
   mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, mut, true));
@@ -1500,8 +1500,6 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob,
     else if (cur->snaprealm)
       realm = cur->snaprealm;
     mds->mdcache->journal_dirty_inode(blob, cur);
-    //inode_t *pi = cur->get_projected_inode();
-    //blob->add_primary_dentry(cur->get_projected_parent_dn(), true, 0, pi);
   }
  
 }
@@ -2433,7 +2431,7 @@ void Locker::scatter_writebehind(ScatterLock *lock)
 
   EUpdate *le = new EUpdate(mds->mdlog, "scatter_writebehind");
   predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, false);
-  le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi);
+  mdcache->journal_dirty_inode(&le->metablob, in);
   
   mds->mdlog->submit_entry(le);
   mds->mdlog->wait_for_sync(new C_Locker_ScatterWB(this, lock, mut));
index 130dfb917d584e628ab0e46e148bd8f9ab46cbbc..0eaf627d3fdc8988fa28001d4018c83b6959a962 100644 (file)
@@ -504,7 +504,7 @@ void MDCache::try_subtree_merge_at(CDir *dir)
       
       EUpdate *le = new EUpdate(mds->mdlog, "subtree merge writebehind");
       le->metablob.add_dir_context(in->get_parent_dn()->get_dir());
-      le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi);
+      journal_dirty_inode(&le->metablob, in);
       
       mds->mdlog->submit_entry(le);
       mds->mdlog->wait_for_sync(new C_MDC_SubtreeMergeWB(this, in, 
@@ -962,15 +962,12 @@ CInode *MDCache::pick_inode_snap(CInode *in, snapid_t follows)
   return in;
 }
 
-CInode *MDCache::cow_inode(CInode *in, snapid_t last, bool write_to_clone)
+CInode *MDCache::cow_inode(CInode *in, snapid_t last)
 {
   assert(last >= in->first);
 
   CInode *oldin = new CInode(this);
-  if (write_to_clone)
-    oldin->inode = *in->get_projected_inode();
-  else
-    oldin->inode = *in->get_previous_projected_inode();
+  oldin->inode = *in->get_previous_projected_inode();
   oldin->symlink = in->symlink;
   oldin->xattrs = in->xattrs;
 
@@ -1018,7 +1015,6 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll
    * normally, we write to the head, and make a clone of ther previous
    * dentry+inode state.  unless the follow snapid specified.
    */
-  bool write_to_clone = false;
 
   if (dn->is_primary() && dn->inode->is_multiversion()) {
     // multiversion inode.
@@ -1026,8 +1022,6 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll
 
     if (follows == CEPH_NOSNAP || follows == 0)
       follows = in->find_snaprealm()->get_latest_snap();
-    //else
-    //write_to_clone = true;
 
     // already cloned?
     if (follows < in->first)
@@ -1035,10 +1029,7 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll
 
     old_inode_t &old = in->old_inodes[follows];
     old.first = in->first;
-    if (write_to_clone)
-      old.inode = *in->get_projected_inode();
-    else
-      old.inode = *in->get_previous_projected_inode();
+    old.inode = *in->get_previous_projected_inode();
     old.xattrs = in->xattrs;
     
     in->first = follows+1;
@@ -1048,22 +1039,19 @@ void MDCache::journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t foll
   } else {
     if (follows == CEPH_NOSNAP)
       follows = dn->dir->inode->find_snaprealm()->get_latest_snap();
-    //else
-    //write_to_clone = true;
     
     // already cloned?
     if (follows < dn->first)
       return;
-    
-    snapid_t oldfirst = dn->first;
-    
+       
     // update dn.first before adding old dentry to cdir's map
+    snapid_t oldfirst = dn->first;
     dn->first = follows+1;
     
     dout(10) << "    dn " << *dn << dendl;
     if (dn->is_primary()) {
       assert(oldfirst == dn->inode->first);
-      CInode *oldin = cow_inode(dn->inode, follows, write_to_clone);
+      CInode *oldin = cow_inode(dn->inode, follows);
       CDentry *olddn = dn->dir->add_primary_dentry(dn->name, oldin, oldfirst, follows);
       dout(10) << " olddn " << *olddn << dendl;
       metablob->add_primary_dentry(olddn, true);
@@ -1085,11 +1073,11 @@ void MDCache::journal_cow_inode(EMetaBlob *metablob, CInode *in, snapid_t follow
   journal_cow_dentry(metablob, dn, follows);
 }
 
-void MDCache::journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows)
+inode_t *MDCache::journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows)
 {
   CDentry *dn = in->get_projected_parent_dn();
   journal_cow_dentry(metablob, dn, follows);
-  metablob->add_primary_dentry(dn, true, in, in->get_projected_inode());
+  return metablob->add_primary_dentry(dn, true, in, in->get_projected_inode());
 }
 
 
@@ -5265,7 +5253,7 @@ void MDCache::_anchor_prepared(CInode *in, version_t atid, bool add)
   mut->ls = mds->mdlog->get_current_segment();
   EUpdate *le = new EUpdate(mds->mdlog, add ? "anchor_create":"anchor_destroy");
   mds->locker->predirty_nested(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY);
-  le->metablob.add_primary_dentry(in->parent, true, 0, pi);
+  journal_dirty_inode(&le->metablob, in);
   le->metablob.add_table_transaction(TABLE_ANCHOR, atid);
   mds->mdlog->submit_entry(le, new C_MDC_AnchorLogged(this, in, atid, mut));
 }
index 783300756431b02161b409ec80f2d7148b1704b6..a4d42b861679c28b964515d4b9e0a54d898023f3 100644 (file)
@@ -472,10 +472,10 @@ public:
 
   // journal helpers
   CInode *pick_inode_snap(CInode *in, snapid_t follows);
-  CInode *cow_inode(CInode *in, snapid_t last, bool write_to_clone=false);
+  CInode *cow_inode(CInode *in, snapid_t last);
   void journal_cow_dentry(EMetaBlob *metablob, CDentry *dn, snapid_t follows=CEPH_NOSNAP);
   void journal_cow_inode(EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
-  void journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
+  inode_t *journal_dirty_inode(EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
 
   // slaves
   void add_uncommitted_master(metareqid_t reqid, LogSegment *ls, set<int> &slaves) {
index 4de3e8e4a5d2676b46a06a1e028630d0a3543e05..984a9ef4b7cbaccc8d82b05eadb51135a741d90b 100644 (file)
@@ -1254,7 +1254,6 @@ CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dn
   dn = dir->add_null_dentry(dname);
   dn->mark_new();
   dout(10) << "prepare_null_dentry added " << *dn << dendl;
-
   return dn;
 }
 
@@ -1822,7 +1821,7 @@ void Server::handle_client_setxattr(MDRequest *mdr)
   cur->xattrs[name] = buffer::create(len);
   if (len)
     req->get_data().copy(0, len, cur->xattrs[name].c_str());
-  le->metablob.add_primary_dentry(cur->get_parent_dn(), true, cur, pi);
+  le->metablob.add_primary_dentry(cur->get_projected_parent_dn(), true, cur, pi);
   
   mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
@@ -1868,7 +1867,7 @@ void Server::handle_client_removexattr(MDRequest *mdr)
 
   mdcache->journal_cow_inode(&le->metablob, cur);
   cur->xattrs.erase(name);
-  le->metablob.add_primary_dentry(cur->get_parent_dn(), true, cur, pi);
+  le->metablob.add_primary_dentry(cur->get_projected_parent_dn(), true, cur, pi);
 
   mdlog->submit_entry(le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
@@ -2407,8 +2406,6 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti
   }
 
   if (inc) {
-    snapid_t dnfollows = dn->dir->inode->find_snaprealm()->get_latest_snap();
-    dn->first = dnfollows + 1;
     dn->pre_dirty();
     mds->locker->predirty_nested(mdr, &le->metablob, targeti, dn->dir, PREDIRTY_DIR, 1);
     le->metablob.add_remote_dentry(dn, true, targeti->ino(), 
@@ -3016,20 +3013,12 @@ bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in)
 
     // does the frag _look_ empty?
     if (dir->get_num_head_items()) {
-      dout(10) << "dir_is_nonempty still " << dir->get_num_head_items() << " cached items in frag " << *dir << dendl;
+      dout(10) << "dir_is_nonempty still " << dir->get_num_head_items() 
+              << " cached items in frag " << *dir << dendl;
       reply_request(mdr, -ENOTEMPTY);
       return true;
     }
 
-    // dir looks empty but incomplete?
-    /* actually, screw this, it's cheaper to just rely on dirstat!
-    if (dir->is_auth() && !dir->is_complete()) {
-      dout(7) << "dir_is_nonempty fetching incomplete dir " << *dir << dendl;
-      dir->fetch(new C_MDS_RetryRequest(mdcache, mdr));
-      return true;
-    }
-    */
-    
     // not dir auth?
     if (!dir->is_auth()) {
       dout(10) << "dir_is_nonempty non-auth dirfrag for " << *dir << dendl;
@@ -3621,10 +3610,11 @@ void Server::_rename_prepare(MDRequest *mdr,
   // add it all to the metablob
   // target inode
   if (!linkmerge) {
-    if (destdn->is_primary())
+    if (destdn->is_primary()) {
       tji = metablob->add_primary_dentry(straydn, true, destdn->inode, tpi);
-    else if (destdn->is_remote()) {
+    else if (destdn->is_remote()) {
       metablob->add_dir_context(destdn->inode->get_parent_dir());
+      mdcache->journal_cow_dentry(metablob, destdn->inode->parent);
       tji = metablob->add_primary_dentry(destdn->inode->parent, true, destdn->inode, tpi);
     }
   }
@@ -3632,16 +3622,30 @@ void Server::_rename_prepare(MDRequest *mdr,
   // dest
   if (srcdn->is_remote()) {
     if (!linkmerge) {
+      if (!destdn->is_null())
+       mdcache->journal_cow_dentry(metablob, destdn);
+      else
+       destdn->first = destdn->dir->inode->find_snaprealm()->get_latest_snap()+1;
       metablob->add_remote_dentry(destdn, true, srcdn->get_remote_ino(), srcdn->get_remote_d_type());
+      mdcache->journal_cow_dentry(metablob, srcdn->inode->get_parent_dn());
       ji = metablob->add_primary_dentry(srcdn->inode->get_parent_dn(), true, srcdn->inode, pi);
     } else {
+      if (!destdn->is_null())
+       mdcache->journal_cow_dentry(metablob, destdn);
+      else
+       destdn->first = destdn->dir->inode->find_snaprealm()->get_latest_snap()+1;
       metablob->add_primary_dentry(destdn, true, destdn->inode, pi); 
     }
   } else if (srcdn->is_primary()) {
+    if (!destdn->is_null())
+      mdcache->journal_cow_dentry(metablob, destdn);
+    else
+      destdn->first = destdn->dir->inode->find_snaprealm()->get_latest_snap()+1;
     ji = metablob->add_primary_dentry(destdn, true, srcdn->inode, pi); 
   }
     
   // src
+  mdcache->journal_cow_dentry(metablob, srcdn);
   metablob->add_null_dentry(srcdn, true);
 
   // new subtree?
@@ -4414,7 +4418,7 @@ void Server::handle_client_truncate(MDRequest *mdr)
   pi->version = pdv;
   pi->size = le64_to_cpu(req->head.args.truncate.length);
   mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
-  le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
+  mdcache->journal_dirty_inode(&le->metablob, cur);
   
   mdlog->submit_entry(le, fin);
 }
@@ -4612,7 +4616,7 @@ void Server::handle_client_opent(MDRequest *mdr)
   pi->version = pdv;
   pi->size = 0;
   mds->locker->predirty_nested(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
-  le->metablob.add_primary_dentry(cur->parent, true, 0, pi);
+  mdcache->journal_dirty_inode(&le->metablob, cur);
   
   mdlog->submit_entry(le, fin);
 }