]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: check if a mds rank is `up` before fetching connection addr 41875/head
authorVenky Shankar <vshankar@redhat.com>
Wed, 16 Jun 2021 04:53:16 +0000 (00:53 -0400)
committerVenky Shankar <vshankar@redhat.com>
Wed, 16 Jun 2021 05:02:37 +0000 (01:02 -0400)
Client segfaults when trying to infer which mds rank a connection
reset call is coming from. It does this by iterating `mds_sessions`
and checking the mds addr (in mdsmap) to the `Connection *`.

However, cases where the mds is blocklisted, the client receives
an updated mdsmap in which the corresponding mds is not in `up`
set thereby resulting in a segfault when calling `mdsmap->get_addrs`
since it expects that the mds should be in `up` state.

Note that this leaves the `Connection *` as it is and does not clean
it up. That needs to fixed separately probably by maintaining a map
of `Connection *` to mds rank for lookup.

Fixes: http://tracker.ceph.com/issues/50530
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/client/Client.cc

index 4494fc2a74f9b97c66dfe5f2635b1ae790e64f33..3533f3d6f4b75a26e8548f7b6ff4ba826a0ae2fb 100644 (file)
@@ -14970,7 +14970,7 @@ void Client::ms_handle_remote_reset(Connection *con)
       mds_rank_t mds = MDS_RANK_NONE;
       MetaSession *s = NULL;
       for (auto &p : mds_sessions) {
-       if (mdsmap->get_addrs(p.first) == con->get_peer_addrs()) {
+       if (mdsmap->have_inst(p.first) && mdsmap->get_addrs(p.first) == con->get_peer_addrs()) {
          mds = p.first;
          s = &p.second;
        }