From 065b7bb8c59bdc103782ebd97adaae90bd751032 Mon Sep 17 00:00:00 2001 From: You Ji Date: Wed, 6 Dec 2017 20:02:16 -0700 Subject: [PATCH] mds/MDSMap : use arrary_section for mds stat http://tracker.ceph.com/issues/22338 Signed-off-by: You Ji --- src/mds/MDSMap.cc | 12 ++++-------- src/pybind/ceph_volume_client.py | 17 +++++++++++------ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index ea154ff18bb..7678635e534 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -153,11 +153,9 @@ void MDSMap::dump(Formatter *f) const for (set::const_iterator p = in.begin(); p != in.end(); ++p) f->dump_int("mds", *p); f->close_section(); - f->open_object_section("up"); + f->open_array_section("up"); for (map::const_iterator p = up.begin(); p != up.end(); ++p) { - char s[14]; - sprintf(s, "mds_%d", int(p->first)); - f->dump_int(s, p->second); + f->dump_int("mds", p->first); } f->close_section(); f->open_array_section("failed"); @@ -172,11 +170,9 @@ void MDSMap::dump(Formatter *f) const for (set::const_iterator p = stopped.begin(); p != stopped.end(); ++p) f->dump_int("mds", *p); f->close_section(); - f->open_object_section("info"); + f->open_array_section("info"); for (map::const_iterator p = mds_info.begin(); p != mds_info.end(); ++p) { - char s[25]; // 'gid_' + len(str(ULLONG_MAX)) + '\0' - sprintf(s, "gid_%llu", (long long unsigned)p->first); - f->open_object_section(s); + f->open_object_section("info_item"); p->second.dump(f); f->close_section(); } diff --git a/src/pybind/ceph_volume_client.py b/src/pybind/ceph_volume_client.py index b27953d3f95..a09c41da5ed 100644 --- a/src/pybind/ceph_volume_client.py +++ b/src/pybind/ceph_volume_client.py @@ -114,14 +114,21 @@ class RankEvicter(threading.Thread): super(RankEvicter, self).__init__() + def _get_info(self, key, value): + for info in self._mds_map["info"]: + if info[key] == value: + return info + return {} + def _ready_to_evict(self): - if self._mds_map['up'].get("mds_{0}".format(self.rank), None) != self.gid: + info = self._get_info('rank', self.rank) + if (self.rank not in self._mds_map['up']) or info.get('gid', None) != self.gid: log.info("Evicting {0} from {1}/{2}: rank no longer associated with gid, done.".format( self._client_spec, self.rank, self.gid )) raise RankEvicter.GidGone() - info = self._mds_map['info']["gid_{0}".format(self.gid)] + info = self._get_info('gid', self.gid) log.debug("_ready_to_evict: state={0}".format(info['state'])) return info['state'] in ["up:active", "up:clientreplay"] @@ -393,10 +400,8 @@ class CephFSVolumeClient(object): mds_map = get_mds_map() up = {} - for name, gid in mds_map['up'].items(): - # Quirk of the MDSMap JSON dump: keys in the up dict are like "mds_0" - assert name.startswith("mds_") - up[int(name[4:])] = gid + for rank in mds_map['up']: + up[rank] = self._get_info('rank', rank)['gid'] # For all MDS ranks held by a daemon # Do the parallelism in python instead of using "tell mds.*", because -- 2.39.5