# This is something like `return pickle.loads(pickle.dumps(r_obj))`
# Without importing anything.
r_cls = r_obj.__class__
- if r_cls.__module__ == '__builtin__':
+ 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))
self._set_backend('')
assert self._select_orchestrator() is None
self._set_backend(old_orch)
+
+ e = self.remote('selftest', 'remote_from_orchestrator_cli_self_test', "ZeroDivisionError")
+ try:
+ orchestrator.raise_if_exception(e)
+ assert False
+ except ZeroDivisionError as e:
+ assert e.args == ('hello', 'world')
+
+ e = self.remote('selftest', 'remote_from_orchestrator_cli_self_test', "OrchestratorError")
+ try:
+ orchestrator.raise_if_exception(e)
+ assert False
+ except orchestrator.OrchestratorError as e:
+ assert e.args == ('hello', 'world')
else:
raise RuntimeError("KeyError not raised")
+ def remote_from_orchestrator_cli_self_test(self, what):
+ import orchestrator
+ if what == 'OrchestratorError':
+ c = orchestrator.TrivialReadCompletion(result=None)
+ c.exception = orchestrator.OrchestratorError('hello', 'world')
+ return c
+ elif what == "ZeroDivisionError":
+ c = orchestrator.TrivialReadCompletion(result=None)
+ c.exception = ZeroDivisionError('hello', 'world')
+ return c
+ assert False, repr(what)
def shutdown(self):
self._workload = self.SHUTDOWN