From: Michael Fritch Date: Wed, 4 Nov 2020 18:28:52 +0000 (-0700) Subject: mgr/cephadm: handle JSONDecodeError in OSD service X-Git-Tag: v16.1.0~353^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=46692e26c12ed169a9f3569857a13304d09b41c1;p=ceph.git mgr/cephadm: handle JSONDecodeError in OSD service avoid exceptions when attempting an osd deployment etc. Fixes: https://tracker.ceph.com/issues/48119 Signed-off-by: Michael Fritch --- diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index 8f8df8a6f0b..7c9879cb0a0 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -71,7 +71,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 = [] @@ -201,7 +205,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}) @@ -274,8 +283,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', {}) @@ -371,7 +380,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: