mirror of https://github.com/borgbackup/borg.git
repository: fix spurious, empty lock.roster on InvalidRepository exception
This commit is contained in:
parent
adaeb32cd4
commit
928f6e0ca4
|
@ -201,6 +201,9 @@ class LockRoster:
|
|||
roster = self.load()
|
||||
return set(tuple(e) for e in roster.get(key, []))
|
||||
|
||||
def empty(self, *keys):
|
||||
return all(not self.get(key) for key in keys)
|
||||
|
||||
def modify(self, key, op):
|
||||
roster = self.load()
|
||||
try:
|
||||
|
@ -293,10 +296,14 @@ class Lock:
|
|||
def release(self):
|
||||
if self.is_exclusive:
|
||||
self._roster.modify(EXCLUSIVE, REMOVE)
|
||||
if self._roster.empty(EXCLUSIVE, SHARED):
|
||||
self._roster.remove()
|
||||
self._lock.release()
|
||||
else:
|
||||
with self._lock:
|
||||
self._roster.modify(SHARED, REMOVE)
|
||||
if self._roster.empty(EXCLUSIVE, SHARED):
|
||||
self._roster.remove()
|
||||
|
||||
def upgrade(self):
|
||||
# WARNING: if multiple read-lockers want to upgrade, it will deadlock because they
|
||||
|
|
|
@ -64,6 +64,8 @@ class TestLock:
|
|||
lock2 = Lock(lockpath, exclusive=False, id=ID2).acquire()
|
||||
assert len(lock1._roster.get(SHARED)) == 2
|
||||
assert len(lock1._roster.get(EXCLUSIVE)) == 0
|
||||
assert not lock1._roster.empty(SHARED, EXCLUSIVE)
|
||||
assert lock1._roster.empty(EXCLUSIVE)
|
||||
lock1.release()
|
||||
lock2.release()
|
||||
|
||||
|
@ -71,6 +73,7 @@ class TestLock:
|
|||
with Lock(lockpath, exclusive=True, id=ID1) as lock:
|
||||
assert len(lock._roster.get(SHARED)) == 0
|
||||
assert len(lock._roster.get(EXCLUSIVE)) == 1
|
||||
assert not lock._roster.empty(SHARED, EXCLUSIVE)
|
||||
|
||||
def test_upgrade(self, lockpath):
|
||||
with Lock(lockpath, exclusive=False) as lock:
|
||||
|
@ -78,6 +81,7 @@ class TestLock:
|
|||
lock.upgrade() # NOP
|
||||
assert len(lock._roster.get(SHARED)) == 0
|
||||
assert len(lock._roster.get(EXCLUSIVE)) == 1
|
||||
assert not lock._roster.empty(SHARED, EXCLUSIVE)
|
||||
|
||||
def test_downgrade(self, lockpath):
|
||||
with Lock(lockpath, exclusive=True) as lock:
|
||||
|
|
Loading…
Reference in New Issue