]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: rename rollback closer..
authorSage Weil <sage@newdream.net>
Sun, 1 Jun 2008 22:21:16 +0000 (15:21 -0700)
committerSage Weil <sage@newdream.net>
Sun, 1 Jun 2008 22:21:16 +0000 (15:21 -0700)
src/TODO
src/mds/MDCache.cc
src/mds/Server.cc

index 0cb8a6f36b478a8a834048b7b5968995609d2eb6..182849161d2414c26d107804de2930d840793d00 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -71,6 +71,7 @@ mds mustfix
 
 - make sure locker avoids frozen inodes
 - make sure predirty_nested stops if it can't wrlock versionlock (acquire_locks normally hides that detail for us)
+- make sure stray inode is always opened on startup
 
 - look at the client_map session opening code.. versus rollback (of import, or slave request)
 
index d0f1993aad1d31595f2eec9cdda9bcb30fe70abf..bd16bb94802dd751655e782f5151e4daaf27baac 100644 (file)
@@ -256,7 +256,7 @@ CInode *MDCache::create_stray_inode(int whose)
 {
   if (whose < 0) whose = mds->get_nodeid();
 
-  CInode *in = new CInode(this, whose == mds->get_nodeid());
+  CInode *in = new CInode(this);  //, whose == mds->get_nodeid());
   in->inode.ino = MDS_INO_STRAY(whose);
   
   // make it up (FIXME)
@@ -295,7 +295,7 @@ CDentry *MDCache::get_or_create_stray_dentry(CInode *in)
   string straydname;
   in->name_stray_dentry(straydname);
   
-  if (!stray) create_stray_inode(mds->get_nodeid());
+  assert(stray);
 
   frag_t fg = stray->pick_dirfrag(straydname);
 
index 4d4d7c164c226b1cf3cee59155b68e9b0061b059..bdbe43a1dd6cd773fd5821afbc5c04f860f3c308 100644 (file)
@@ -2511,6 +2511,7 @@ void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
     assert(mds->is_resolve());
     mds->mdcache->add_rollback(rollback.reqid);  // need to finish this update before resolve finishes
     mut = new Mutation(rollback.reqid);
+    mut->ls = mds->mdlog->get_current_segment();
   }
 
 
@@ -3246,7 +3247,7 @@ void Server::handle_client_rename(MDRequest *mdr)
   }
 
   // test hack: bail after slave does prepare, so we can verify it's _live_ rollback.
-  //if (!mdr->more()->slaves.empty() && !srci->is_dir()) assert(0); 
+  if (!mdr->more()->slaves.empty() && !srci->is_dir()) assert(0); 
   //if (!mdr->more()->slaves.empty() && srci->is_dir()) assert(0); 
   
   // -- prepare anchor updates -- 
@@ -3502,6 +3503,11 @@ void Server::_rename_prepare(MDRequest *mdr,
   if (destdn->is_auth())
     mds->locker->predirty_nested(mdr, metablob, srcdn->inode, destdn->dir, flags, 1);
 
+  metablob->add_dir_context(srcdn->dir);
+  metablob->add_dir_context(destdn->dir);
+  if (straydn)
+    metablob->add_dir_context(straydn->dir);
+
   // add it all to the metablob
   // target inode
   if (!linkmerge) {
@@ -3781,6 +3787,8 @@ void Server::handle_slave_rename_prep(MDRequest *mdr)
     // encode everything we'd need to roll this back... basically, just the original state.
     rename_rollback rollback;
     
+    rollback.reqid = mdr->reqid;
+
     rollback.orig_src.dirfrag = srcdn->dir->dirfrag();
     rollback.orig_src.dirfrag_old_mtime = srcdn->dir->get_projected_fnode()->fragstat.mtime;
     rollback.orig_src.dirfrag_old_rctime = srcdn->dir->get_projected_fnode()->fragstat.rctime;
@@ -3907,7 +3915,7 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
     }
 
     mdlog->submit_entry(le);
-
+    mds->mdcache->request_finish(mdr);
   } else {
     if (srcdn->is_auth() && destdn->is_primary() &&
        destdn->inode->state_test(CInode::STATE_AMBIGUOUSAUTH)) {
@@ -3932,16 +3940,18 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
     // abort
     do_rename_rollback(mdr->more()->rollback_bl, mdr->slave_to_mds, mdr);
   }
-
-  mds->mdcache->request_finish(mdr);
 }
 
 void _rollback_repair_dir(Mutation *mut, CDir *dir, rename_rollback::drec &r, utime_t ctime, 
                          bool isdir, int linkunlink, bool primary, frag_info_t &dirstat)
 {
-  fnode_t *pf = dir->project_fnode();
-  mut->add_projected_fnode(dir);
-  pf->version = dir->pre_dirty();
+  fnode_t *pf;
+  if (dir->is_auth()) {
+    pf = dir->project_fnode();
+    mut->add_projected_fnode(dir);
+    pf->version = dir->pre_dirty();
+  } else
+    pf = dir->get_projected_fnode();
 
   if (isdir) {
     pf->fragstat.nsubdirs += linkunlink;
@@ -3985,12 +3995,13 @@ void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr)
 
   dout(10) << "do_rename_rollback on " << rollback.reqid << dendl;
 
-  Mutation *mut = mdr;
-  if (!mut) {
+  //Mutation *mut = mdr;
+  if (!mdr) {
     assert(mds->is_resolve());
     mds->mdcache->add_rollback(rollback.reqid);  // need to finish this update before resolve finishes
-    mut = new Mutation(rollback.reqid);
   }
+  Mutation *mut = new Mutation(rollback.reqid);
+  mut->ls = mds->mdlog->get_current_segment();
 
   CDir *srcdir = mds->mdcache->get_dirfrag(rollback.orig_src.dirfrag);
   assert(srcdir);
@@ -4042,9 +4053,13 @@ void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   else
     srcdir->link_remote_inode(srcdn, rollback.orig_src.remote_ino, 
                              rollback.orig_src.remote_d_type);
-  inode_t *pi = in->project_inode();
-  mut->add_projected_inode(in);
-  pi->version = in->pre_dirty();
+  inode_t *pi;
+  if (in->is_auth()) {
+    pi = in->project_inode();
+    mut->add_projected_inode(in);
+    pi->version = in->pre_dirty();
+  } else
+    pi = in->get_projected_inode();
   if (pi->ctime == rollback.ctime)
     pi->ctime = rollback.orig_src.old_ctime;
 
@@ -4064,9 +4079,12 @@ void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   }
   inode_t *ti = 0;
   if (target) {
-    ti = target->project_inode();
-    mut->add_projected_inode(target);
-    ti->version = target->pre_dirty();
+    if (target->is_auth()) {
+      ti = target->project_inode();
+      mut->add_projected_inode(target);
+      ti->version = target->pre_dirty();
+    } else 
+      ti = target->get_projected_inode();
     if (ti->ctime == rollback.ctime)
       ti->ctime = rollback.orig_dest.old_ctime;
     ti->nlink++;