diff --git a/docs/internals/frontends.rst b/docs/internals/frontends.rst index b4c2d055..45003929 100644 --- a/docs/internals/frontends.rst +++ b/docs/internals/frontends.rst @@ -671,6 +671,8 @@ Errors UnexpectedRPCDataFormatFromServer rc: 86 traceback: no Got unexpected RPC data format from server: {} + ConnectionBrokenWithHint rc: 87 traceback: no + Connection to remote host is broken. {} IntegrityError rc: 90 traceback: yes Data integrity error: {} diff --git a/src/borg/remote.py b/src/borg/remote.py index 52ed46d8..c69b2fe0 100644 --- a/src/borg/remote.py +++ b/src/borg/remote.py @@ -104,6 +104,11 @@ class UnexpectedRPCDataFormatFromServer(Error): super().__init__(data) +class ConnectionBrokenWithHint(Error): + """Connection to remote host is broken. {}""" + exit_mcode = 87 + + # Protocol compatibility: # In general the server is responsible for rejecting too old clients and the client it responsible for rejecting # too old servers. This ensures that the knowledge what is compatible is always held by the newer component. @@ -421,7 +426,10 @@ class SleepingBandwidthLimiter: self.ratelimit_last = time.monotonic() if len(to_send) > self.ratelimit_quota: to_send = to_send[:self.ratelimit_quota] - written = os.write(fd, to_send) + try: + written = os.write(fd, to_send) + except BrokenPipeError: + raise ConnectionBrokenWithHint("Broken Pipe") from None if self.ratelimit: self.ratelimit_quota -= written return written