]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix choose_target_mds for requests that do name lookup 23438/head
authorYan, Zheng <zyan@redhat.com>
Mon, 6 Aug 2018 06:51:09 +0000 (14:51 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 6 Aug 2018 07:16:30 +0000 (15:16 +0800)
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>
src/client/Client.cc

index cd694b361c513bc35fecf209c57c6bfdd44825da..bedcaaa9fd7a1445d4fd49d3c43fd0005366dff4 100644 (file)
@@ -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;
       }