From f8b48dc8d7c37288336fe024a40352b1cacbee02 Mon Sep 17 00:00:00 2001 From: Marian Beermann Date: Wed, 31 May 2017 18:48:48 +0200 Subject: [PATCH] remote: propagate Error.traceback correctly --- src/borg/archiver.py | 2 +- src/borg/remote.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 419e46e1a..f6bb69e60 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -4000,7 +4000,7 @@ def main(): # pragma: no cover tb = "%s\n%s" % (traceback.format_exc(), sysinfo()) exit_code = e.exit_code except RemoteRepository.RPCError as e: - important = e.exception_class not in ('LockTimeout', ) + important = e.exception_class not in ('LockTimeout', ) and e.traceback msgid = e.exception_class tb_log_level = logging.ERROR if important else logging.DEBUG if important: diff --git a/src/borg/remote.py b/src/borg/remote.py index f2c1e48a0..47c59741e 100644 --- a/src/borg/remote.py +++ b/src/borg/remote.py @@ -253,8 +253,10 @@ class RepositoryServer: # pragma: no cover if dictFormat: ex_short = traceback.format_exception_only(e.__class__, e) ex_full = traceback.format_exception(*sys.exc_info()) + ex_trace = True if isinstance(e, Error): ex_short = [e.get_message()] + ex_trace = e.traceback if isinstance(e, (Repository.DoesNotExist, Repository.AlreadyExists, PathNotAllowed)): # These exceptions are reconstructed on the client end in RemoteRepository.call_many(), # and will be handled just like locally raised exceptions. Suppress the remote traceback @@ -269,6 +271,7 @@ class RepositoryServer: # pragma: no cover b'exception_args': e.args, b'exception_full': ex_full, b'exception_short': ex_short, + b'exception_trace': ex_trace, b'sysinfo': sysinfo()}) except TypeError: msg = msgpack.packb({MSGID: msgid, @@ -277,6 +280,7 @@ class RepositoryServer: # pragma: no cover for x in e.args], b'exception_full': ex_full, b'exception_short': ex_short, + b'exception_trace': ex_trace, b'sysinfo': sysinfo()}) os_write(stdout_fd, msg) @@ -485,6 +489,10 @@ class RemoteRepository: else: return self.exception_class + @property + def traceback(self): + return self.unpacked.get(b'exception_trace', True) + @property def exception_class(self): return self.unpacked[b'exception_class'].decode()