浏览代码

Merge pull request #7942 from ThomasWaldmann/lockroster-remove-fix-1.1

LockRoster.modify: no KeyError if element was already gone, fixes #7937
TW 1 年之前
父节点
当前提交
dd7111410f
共有 2 个文件被更改,包括 8 次插入3 次删除
  1. 7 2
      src/borg/locking.py
  2. 1 1
      src/borg/testsuite/locking.py

+ 7 - 2
src/borg/locking.py

@@ -7,7 +7,7 @@ from . import platform
 from .helpers import Error, ErrorWithTraceback
 from .logger import create_logger
 
-ADD, REMOVE = 'add', 'remove'
+ADD, REMOVE, REMOVE2 = 'add', 'remove', 'remove2'
 SHARED, EXCLUSIVE = 'shared', 'exclusive'
 
 logger = create_logger(__name__)
@@ -285,6 +285,11 @@ class LockRoster:
         if op == ADD:
             elements.add(self.id)
         elif op == REMOVE:
+            # note: we ignore it if the element is already not present anymore.
+            # this has been frequently seen in teardowns involving Repository.__del__ and Repository.__exit__.
+            elements.discard(self.id)
+        elif op == REMOVE2:
+            # needed for callers that do not want to ignore.
             elements.remove(self.id)
         else:
             raise ValueError('Unknown LockRoster op %r' % op)
@@ -299,7 +304,7 @@ class LockRoster:
         killing, self.kill_stale_locks = self.kill_stale_locks, False
         try:
             try:
-                self.modify(key, REMOVE)
+                self.modify(key, REMOVE2)
             except KeyError:
                 # entry was not there, so no need to add a new one, but still update our id
                 self.id = new_id

+ 1 - 1
src/borg/testsuite/locking.py

@@ -162,7 +162,7 @@ class TestLock:
             assert roster.get(SHARED) == {our_id}
         assert roster.get(EXCLUSIVE) == set()
         assert roster.get(SHARED) == set()
-        with pytest.raises(KeyError):
+        with pytest.raises(NotLocked):
             dead_lock.release()
 
         with Lock(lockpath, id=cant_know_if_dead_id, exclusive=True):