From: Yan, Zheng Date: Mon, 6 Aug 2018 06:51:09 +0000 (+0800) Subject: client: fix choose_target_mds for requests that do name lookup X-Git-Tag: v14.0.1~546^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=436d1741e623748bc0dfd4e305d4c07cc602a093;p=ceph.git client: fix choose_target_mds for requests that do name lookup There are two cases that a dirfrag is not recorded in CInode::fragmap. One is that the dirfrag is not subtree root, another is that client does not know which mds is dirfrag's auth mds. For the both cases, requests that do name lookup are better to sent to dir inode's auth mds. Fixes: http://tracker.ceph.com/issues/26860 Signed-off-by: "Yan, Zheng" --- diff --git a/src/client/Client.cc b/src/client/Client.cc index cd694b361c51..bedcaaa9fd7a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1460,6 +1460,10 @@ mds_rank_t Client::choose_target_mds(MetaRequest *req, Inode** phash_diri) mds = in->fragmap[fg]; if (phash_diri) *phash_diri = in; + } else if (in->auth_cap) { + mds = in->auth_cap->session->mds_num; + } + if (mds >= 0) { ldout(cct, 10) << __func__ << " from dirfragtree hash" << dendl; goto out; }