From: Sage Weil Date: Sun, 1 Jun 2008 20:45:16 +0000 (-0700) Subject: mds: rename exports behave in non-failure case X-Git-Tag: v0.3~170^2~22 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ef89aec308921606465cd93fef98eece9d74c34a;p=ceph.git mds: rename exports behave in non-failure case --- diff --git a/src/TODO b/src/TODO index ccdc88d7ef9..0cb8a6f36b4 100644 --- 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. diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc index 7ad5afcc593..91a29aceb8d 100644 --- a/src/client/SyntheticClient.cc +++ b/src/client/SyntheticClient.cc @@ -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; kget_parent()->is_auth()) + if (!lock->get_parent()->is_auth()) continue; if (lock->get_state() == LOCK_SCATTER && diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 78d956e1920..4d4d7c164c2 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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 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 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