]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: rename exports behave in non-failure case
authorSage Weil <sage@newdream.net>
Sun, 1 Jun 2008 20:45:16 +0000 (13:45 -0700)
committerSage Weil <sage@newdream.net>
Sun, 1 Jun 2008 20:45:16 +0000 (13:45 -0700)
src/TODO
src/client/SyntheticClient.cc
src/mds/Locker.cc
src/mds/Server.cc

index ccdc88d7ef976d0ae1e355dddc6ea0095472c638..0cb8a6f36b478a8a834048b7b5968995609d2eb6 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -68,6 +68,12 @@ mds nested
 - fix rejoin vs updated dirfrag nested/dirlocks
 
 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)
+
+- look at the client_map session opening code.. versus rollback (of import, or slave request)
+
 - rollback vs accounting is just broken!  can we avoid it.
   - even with _just_ parent dir mtime, the rollback metablob isn't sufficient during replay.. we need special handling regardless.
 
index 7ad5afcc593b4e9a5d38522e28efd99292a8ed61..91a29aceb8db08ef6152cfc6663d5a42fc1d6416 100644 (file)
@@ -2871,7 +2871,7 @@ int SyntheticClient::thrash_links(const char *basedir, int dirs, int files, int
 
   srand(0);
   if (1) {
-    bool renames = false; // thrash renames too?
+    bool renames = true; // thrash renames too?
     for (int k=0; k<n; k++) {
       
       if (renames && rand() % 10 == 0) {
index 41be5b80edc5c10154c06fa71433c289e5ca1d7d..44da27011312d0f20c180973ab0cf0aac9e2114e 100644 (file)
@@ -2719,7 +2719,7 @@ void Locker::scatter_unscatter_autoscattered()
     
     autoscattered.pop_front();
 
-    if (lock->get_parent()->is_auth())
+    if (!lock->get_parent()->is_auth())
       continue;
 
     if (lock->get_state() == LOCK_SCATTER &&
index 78d956e1920d74a2a52e26ad4860958d0d162c73..4d4d7c164c226b1cf3cee59155b68e9b0061b059 100644 (file)
@@ -3246,7 +3246,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 -- 
@@ -3623,7 +3623,7 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen
       destdn->inode->state_set(CInode::STATE_AUTH);
     }
 
-    if (destdn->inode->is_auth())
+    if (destdn->is_auth())
       destdn->inode->pop_and_dirty_projected_inode(mdr->ls);
   }
 
@@ -3846,8 +3846,6 @@ void Server::_logged_slave_rename(MDRequest *mdr,
     bufferlist inodebl;
     mdcache->migrator->encode_export_inode(srcdn->inode, inodebl, 
                                           exported_client_map);
-    mdcache->migrator->finish_export_inode(srcdn->inode, mdr->now, finished); 
-    mds->queue_waiters(finished);   // this includes SINGLEAUTH waiters.
     ::encode(exported_client_map, reply->inode_export);
     reply->inode_export.claim_append(inodebl);
     reply->inode_export_v = srcdn->inode->inode.version;
@@ -3889,9 +3887,12 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
     //  hmm, do i really need to delay this?
     if (srcdn->is_auth() && destdn->is_primary() &&
        destdn->inode->state_test(CInode::STATE_AMBIGUOUSAUTH)) {
-      dout(10) << " unfreezing exported inode " << *destdn->inode << dendl;
       list<Context*> finished;
-      
+
+      dout(10) << " finishing inode export on " << *destdn->inode << dendl;
+      mdcache->migrator->finish_export_inode(destdn->inode, mdr->now, finished); 
+      mds->queue_waiters(finished);   // this includes SINGLEAUTH waiters.
+
       // singleauth
       assert(destdn->inode->state_test(CInode::STATE_AMBIGUOUSAUTH));
       destdn->inode->state_clear(CInode::STATE_AMBIGUOUSAUTH);
@@ -3910,8 +3911,22 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r,
   } else {
     if (srcdn->is_auth() && destdn->is_primary() &&
        destdn->inode->state_test(CInode::STATE_AMBIGUOUSAUTH)) {
+         list<Context*> finished;
+
       dout(10) << " reversing inode export of " << *destdn->inode << dendl;
-      assert(0);  // this bites
+      destdn->inode->abort_export();
+    
+      // singleauth
+      assert(destdn->inode->state_test(CInode::STATE_AMBIGUOUSAUTH));
+      destdn->inode->state_clear(CInode::STATE_AMBIGUOUSAUTH);
+      destdn->inode->take_waiting(CInode::WAIT_SINGLEAUTH, finished);
+      
+      // unfreeze
+      assert(destdn->inode->is_frozen_inode() ||
+            destdn->inode->is_freezing_inode());
+      destdn->inode->unfreeze_inode(finished);
+      
+      mds->queue_waiters(finished);
     }
 
     // abort