From: Kefu Chai Date: Wed, 29 Jan 2020 15:27:47 +0000 (+0800) Subject: mgr/orchestrator: use deepcopy for copying exceptions X-Git-Tag: v15.1.1~530^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ec7b160a5525da7826c8bb5c652a875cbaf3d3e1;p=ceph.git mgr/orchestrator: use deepcopy for copying exceptions since rexec module has been removed in python3, we cannot use it anymore. Fixes: https://tracker.ceph.com/issues/43657 Signed-off-by: Kefu Chai --- diff --git a/src/pybind/mgr/orchestrator.py b/src/pybind/mgr/orchestrator.py index 410d5946a585..09fed945d555 100644 --- a/src/pybind/mgr/orchestrator.py +++ b/src/pybind/mgr/orchestrator.py @@ -4,6 +4,7 @@ ceph-mgr orchestrator interface Please see the ceph-mgr module developer's guide for more information. """ +import copy import functools import logging import sys @@ -629,27 +630,9 @@ def raise_if_exception(c): :raises OrchestratorError: Some user error or a config error. :raises Exception: Some internal error """ - def copy_to_this_subinterpreter(r_obj): - # This is something like `return pickle.loads(pickle.dumps(r_obj))` - # Without importing anything. - r_cls = r_obj.__class__ - if r_cls.__module__ in ('__builtin__', 'builtins'): - return r_obj - my_cls = getattr(sys.modules[r_cls.__module__], r_cls.__name__) - if id(my_cls) == id(r_cls): - return r_obj - if hasattr(r_obj, '__reduce__'): - reduce_tuple = r_obj.__reduce__() - if len(reduce_tuple) >= 2: - return my_cls(*[copy_to_this_subinterpreter(a) for a in reduce_tuple[1]]) - my_obj = my_cls.__new__(my_cls) - for k,v in r_obj.__dict__.items(): - setattr(my_obj, k, copy_to_this_subinterpreter(v)) - return my_obj - if c.exception is not None: try: - e = copy_to_this_subinterpreter(c.exception) + e = copy.deepcopy(c.exception) except (KeyError, AttributeError): raise Exception('{}: {}'.format(type(c.exception), c.exception)) raise e