Get mds_gid_t from up of MDSMap, will cause to core dump if target
mds_rank_t does not exist up map:
from: src/mds/MDSMap.h
const auto& get_info(mds_rank_t m) const {
return mds_info.at(up.at(m));
}
reproduct:
1. ceph fs fail <fs_name>
2. curl -X GET "example.com:8080/api/cephfs/1/clients" ...
up.at(m) will cause to core dump.
Fixes: https://tracker.ceph.com/issues/61844
Signed-off-by: Yite Gu <yitegu0@gmail.com>
(cherry picked from commit
878463ef3a26f49b9ccad9696ad130fb5aee47e7)
self.assertEqual(stats['subdirs'], 1)
self.rm_dir('/animal')
+
+ def test_cephfs_clients_get_after_mds_down(self):
+ fs_id = self.get_fs_id()
+ self._get(f"/api/cephfs/{fs_id}/clients")
+ self.assertStatus(200)
+
+ self.fs.fail()
+ params = {'suppress_client_ls_errors': 'False'}
+ self._get(f"/api/cephfs/{fs_id}/clients", params=params)
+ self.assertStatus(500)
+
+ self.fs.set_joinable()
+ self._get(f"/api/cephfs/{fs_id}/clients")
+ self.assertStatus(200)
if (role_r == 0) {
// We got a role, resolve it to a GID
const auto& mdsmap = fsmap->get_filesystem(role.fscid).get_mds_map();
+ if (mdsmap.is_down(role.rank)) {
+ lderr(cct) << __func__ << ": targets rank: " << role.rank
+ << " is down" << dendl;
+ return -CEPHFS_EAGAIN;
+ }
auto& info = mdsmap.get_info(role.rank);
ldout(cct, 10) << __func__ << ": resolved " << mds_spec << " to role '"
<< role << "' aka " << info.human_name() << dendl;
if flag not in ('True', 'False'):
raise DashboardException(msg='suppress_client_ls_errors value '
'needs to be either True or False '
- f'but provided {flag}',
+ f'but provided "{flag}"',
component='cephfs')
fs_id = self.fs_id_to_int(fs_id)