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" <zyan@redhat.com>
(cherry picked from commit
436d1741e623748bc0dfd4e305d4c07cc602a093)
Conflicts:
src/client/Client.cc : Resolved in choose_target_mds
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) << "choose_target_mds from dirfragtree hash" << dendl;
goto out;
}