]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: handle JSONDecodeError in OSD service
authorMichael Fritch <mfritch@suse.com>
Wed, 4 Nov 2020 18:28:52 +0000 (11:28 -0700)
committerSebastian Wagner <sebastian.wagner@suse.com>
Thu, 7 Jan 2021 12:02:21 +0000 (13:02 +0100)
avoid exceptions when attempting an osd deployment etc.

Fixes: https://tracker.ceph.com/issues/48119
Signed-off-by: Michael Fritch <mfritch@suse.com>
(cherry picked from commit 46692e26c12ed169a9f3569857a13304d09b41c1)

src/pybind/mgr/cephadm/services/osd.py

index fec2f260cfb377d5ae8c81fbd0443323ae63d759..23193fbb7074a4b020ca9acd4a49c765df439445 100644 (file)
@@ -73,7 +73,11 @@ class OSDService(CephService):
                 '--format', 'json',
             ])
         before_osd_uuid_map = self.mgr.get_osd_uuid_map(only_up=True)
-        osds_elems = json.loads('\n'.join(out))
+        try:
+            osds_elems = json.loads('\n'.join(out))
+        except ValueError:
+            logger.exception('Cannot decode JSON: \'%s\'' % '\n'.join(out))
+            osds_elems = {}
         fsid = self.mgr._cluster_fsid
         osd_uuid_map = self.mgr.get_osd_uuid_map()
         created = []
@@ -203,7 +207,12 @@ class OSDService(CephService):
                 # get preview data from ceph-volume
                 out, err, code = self._run_ceph_volume_command(host, cmd)
                 if out:
-                    concat_out: Dict[str, Any] = json.loads(" ".join(out))
+                    try:
+                        concat_out: Dict[str, Any] = json.loads(' '.join(out))
+                    except ValueError:
+                        logger.exception('Cannot decode JSON: \'%s\'' % ' '.join(out))
+                        concat_out = {}
+
                     ret_all.append({'data': concat_out,
                                     'osdspec': osdspec.service_id,
                                     'host': host})
@@ -276,8 +285,8 @@ class OSDService(CephService):
             raise OrchestratorError(str(e))
         try:
             tree = json.loads(out)
-        except json.decoder.JSONDecodeError:
-            logger.exception(f"Could not decode json -> {out}")
+        except ValueError:
+            logger.exception(f'Cannot decode JSON: \'{out}\'')
             return osd_host_map
 
         nodes = tree.get('nodes', {})
@@ -373,7 +382,12 @@ class RemoveUtil(object):
             'prefix': base_cmd,
             'format': 'json'
         })
-        return json.loads(out)
+        try:
+            ret = json.loads(out)
+        except ValueError:
+            logger.exception(f'Cannot decode JSON: \'{out}\'')
+            return {}
+        return ret
 
     def get_pg_count(self, osd_id: int, osd_df: Optional[dict] = None) -> int:
         if not osd_df: