From: Sage Weil Date: Fri, 4 Oct 2019 20:03:02 +0000 (-0500) Subject: mgr/devicehealth: factor _get_device_metrics out of show_device_metrics X-Git-Tag: v14.2.8~2^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=70fa3cf2341ec018076fe41fb23a930ff18f2560;p=ceph.git mgr/devicehealth: factor _get_device_metrics out of show_device_metrics Add the min_sample lower-bound argument too Signed-off-by: Sage Weil (cherry picked from commit 7be5c1323b3814e2634d5cd66d45cab5a77df680) Conflicts: had to be backported to enable backporting of https://github.com/ceph/ceph/pull/32903 Backport tracker: https://tracker.ceph.com/issues/43873 --- diff --git a/src/pybind/mgr/devicehealth/module.py b/src/pybind/mgr/devicehealth/module.py index dfa956ed812..ed352bfb07e 100644 --- a/src/pybind/mgr/devicehealth/module.py +++ b/src/pybind/mgr/devicehealth/module.py @@ -422,16 +422,11 @@ class Module(MgrModule): ioctx.remove_omap_keys(op, tuple(erase)) ioctx.operate_write_op(op, devid) - def show_device_metrics(self, devid, sample): - # verify device exists - r = self.get("device " + devid) - if not r or 'device' not in r.keys(): - return -errno.ENOENT, '', 'device ' + devid + ' not found' - # fetch metrics + def _get_device_metrics(self, devid, sample=None, min_sample=None): res = {} ioctx = self.open_connection(create_if_missing=False) if not ioctx: - return 0, json.dumps(res, indent=4), '' + return {} with ioctx: with rados.ReadOpCtx() as op: omap_iter, ret = ioctx.get_omap_vals(op, "", sample or '', @@ -442,6 +437,8 @@ class Module(MgrModule): for key, value in list(omap_iter): if sample and key != sample: break + if min_sample and key < min_sample: + break try: v = json.loads(value) except (ValueError, IndexError): @@ -454,8 +451,16 @@ class Module(MgrModule): except rados.Error as e: self.log.exception("RADOS error reading omap: {0}".format(e)) raise + return res - return 0, json.dumps(res, indent=4), '' + def show_device_metrics(self, devid, sample): + # verify device exists + r = self.get("device " + devid) + if not r or 'device' not in r.keys(): + return -errno.ENOENT, '', 'device ' + devid + ' not found' + # fetch metrics + res = self._get_device_metrics(devid, sample=sample) + return 0, json.dumps(res, indent=4, sort_keys=True), '' def check_health(self): self.log.info('Check health')