]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/devicehealth: fix 'device get-health-metrics' when no metrics are stored
authorSage Weil <sage@redhat.com>
Mon, 11 Jun 2018 12:10:08 +0000 (07:10 -0500)
committerSage Weil <sage@redhat.com>
Sat, 23 Jun 2018 22:01:55 +0000 (17:01 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/pybind/mgr/devicehealth/module.py

index 528f7aafcb761db26478e9fbc3ad3e4c8e54ad1e..0b3c2043b805ff6a01349178cd7aef1c92adc244 100644 (file)
@@ -235,14 +235,17 @@ class Module(MgrModule):
         self.log.debug('put_device_metrics device %s prune %s' %
                        (devid, prune))
         erase = []
-        with rados.ReadOpCtx() as op:
-            iter, ret = ioctx.get_omap_keys(op, "", 500) # fixme
-            assert ret == 0
-            ioctx.operate_read_op(op, devid)
-            for key, _ in list(iter):
-                if key >= prune:
-                    break
-                erase.append(key)
+        try:
+            with rados.ReadOpCtx() as op:
+                iter, ret = ioctx.get_omap_keys(op, "", 500) # fixme
+                assert ret == 0
+                ioctx.operate_read_op(op, devid)
+                for key, _ in list(iter):
+                    if key >= prune:
+                        break
+                    erase.append(key)
+        except:
+            pass
         key = datetime.now().strftime(TIME_FORMAT)
         self.log.debug('put_device_metrics device %s key %s = %s, erase %s' %
                        (devid, key, data, erase))
@@ -253,22 +256,30 @@ class Module(MgrModule):
             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
         ioctx = self.open_connection()
         res = {}
         with rados.ReadOpCtx() as op:
             iter, ret = ioctx.get_omap_vals(op, "", sample or '', 500) # fixme
             assert ret == 0
-            ioctx.operate_read_op(op, devid)
-            for key, value in list(iter):
-                if sample and key != sample:
-                    break
-                try:
-                    v = json.loads(value)
-                except:
-                    self.log.debug('unable to parse value for %s: "%s"' %
-                                   (key, value))
-                    pass
-                res[key] = v
+            try:
+                ioctx.operate_read_op(op, devid)
+                for key, value in list(iter):
+                    if sample and key != sample:
+                        break
+                    try:
+                        v = json.loads(value)
+                    except:
+                        self.log.debug('unable to parse value for %s: "%s"' %
+                                       (key, value))
+                        pass
+                    res[key] = v
+            except:
+                pass
         return (0, json.dumps(res, indent=4), '')
 
     def extract_smart_features(self, raw):