diff --git a/attic/remote.py b/attic/remote.py index 9650f065d..b6b746d85 100644 --- a/attic/remote.py +++ b/attic/remote.py @@ -186,7 +186,8 @@ class RemoteRepository: raise Repository.ObjectNotFound(res[0], self.location.orig) elif error == b'InvalidRPCMethod': raise InvalidRPCMethod(*res) - raise self.RPCError(res.decode('utf-8')) + else: + raise self.RPCError(res.decode('utf-8')) else: yield res if not waiting_for and not calls: diff --git a/attic/repository.py b/attic/repository.py index 83744ce66..9cea1e578 100644 --- a/attic/repository.py +++ b/attic/repository.py @@ -145,7 +145,14 @@ class Repository: def prepare_txn(self, transaction_id, do_cleanup=True): self._active_txn = True - self.lock.upgrade() + try: + self.lock.upgrade() + except UpgradableLock.WriteLockFailed: + # if upgrading the lock to exclusive fails, we do not have an + # active transaction. this is important for "serve" mode, where + # the repository instance lives on - even if exceptions happened. + self._active_txn = False + raise if not self.index: self.index = self.open_index(transaction_id) if transaction_id is None: