From 4de3c2d7900b057fe6191323c80068b2360fcfea Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 29 Jan 2020 23:27:47 +0800 Subject: [PATCH] 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 --- src/pybind/mgr/orchestrator.py | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/pybind/mgr/orchestrator.py b/src/pybind/mgr/orchestrator.py index 35d7e278ebf70c..75a5a5aef507ea 100644 --- a/src/pybind/mgr/orchestrator.py +++ b/src/pybind/mgr/orchestrator.py @@ -4,6 +4,7 @@ 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