浏览代码

attic PR #228 - Merge branch 'fix_ro_target' of ../attic

Thomas Waldmann 10 年之前
父节点
当前提交
ee42ba561f
共有 2 个文件被更改,包括 10 次插入2 次删除
  1. 2 1
      attic/remote.py
  2. 8 1
      attic/repository.py

+ 2 - 1
attic/remote.py

@@ -186,7 +186,8 @@ class RemoteRepository:
                             raise Repository.ObjectNotFound(res[0], self.location.orig)
                             raise Repository.ObjectNotFound(res[0], self.location.orig)
                         elif error == b'InvalidRPCMethod':
                         elif error == b'InvalidRPCMethod':
                             raise InvalidRPCMethod(*res)
                             raise InvalidRPCMethod(*res)
-                        raise self.RPCError(res.decode('utf-8'))
+                        else:
+                            raise self.RPCError(res.decode('utf-8'))
                     else:
                     else:
                         yield res
                         yield res
                         if not waiting_for and not calls:
                         if not waiting_for and not calls:

+ 8 - 1
attic/repository.py

@@ -145,7 +145,14 @@ class Repository:
 
 
     def prepare_txn(self, transaction_id, do_cleanup=True):
     def prepare_txn(self, transaction_id, do_cleanup=True):
         self._active_txn = 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:
         if not self.index:
             self.index = self.open_index(transaction_id)
             self.index = self.open_index(transaction_id)
         if transaction_id is None:
         if transaction_id is None: