From: Yan, Zheng Date: Wed, 8 Feb 2017 03:25:16 +0000 (+0800) Subject: mds: properly set ambiguous auth on auth mds of rename source inode X-Git-Tag: v12.0.1~266^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b7b1d995888a6a0ad15521a8106ec561e50b6550;p=ceph.git mds: properly set ambiguous auth on auth mds of rename source inode When doing trans-authority rename, the master mds may send two slave requests to auth mds of rename source inode. The first slave request set ambiguous auth on rename source inode. The second slave request is sent after receiving all bystanders' slave request replies. Current code uses mdr->more()->is_ambiguous_auth bit to indicate if the first slave reuqest was sent. The is_ambiguous_auth is set when when calling Server::_rename_prepare_witness(). This causes problem if Server::_rename_prepare_witness() can't send the slave request immediately and wants to retry the MDRequest laster. The fix is set is_ambiguous_auth when receiving reply for the first slave request Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 6eceb4cdaaf..2d3584933b8 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -6486,7 +6486,8 @@ void Server::handle_client_rename(MDRequestRef& mdr) // are involved in the rename operation. if (srcdnl->is_primary() && !mdr->more()->is_ambiguous_auth) { dout(10) << " preparing ambiguous auth for srci" << dendl; - mdr->set_ambiguous_auth(srci); + assert(mdr->more()->is_remote_frozen_authpin); + assert(mdr->more()->rename_inode == srci); _rename_prepare_witness(mdr, last, witnesses, srctrace, desttrace, straydn); return; } @@ -7924,6 +7925,11 @@ void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *a // note slave mdr->more()->slaves.insert(from); + if (mdr->more()->srcdn_auth_mds == from && + mdr->more()->is_remote_frozen_authpin && + !mdr->more()->is_ambiguous_auth) { + mdr->set_ambiguous_auth(mdr->more()->rename_inode); + } // witnessed? or add extra witnesses? assert(mdr->more()->witnessed.count(from) == 0);