1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-03-06 11:40:31 +00:00

locking: deal with potential auto-expire during suspend

This commit is contained in:
Thomas Waldmann 2024-08-31 23:40:27 +02:00
parent 7bf0f47fea
commit 1cd2f4dca3
No known key found for this signature in database
GPG key ID: 243ACFA951F78E01

View file

@ -225,7 +225,18 @@ class Lock:
now = datetime.datetime.now(datetime.timezone.utc)
if self.last_refresh_dt is not None and now > self.last_refresh_dt + self.refresh_td:
old_locks = self._find_locks(only_mine=True)
assert len(old_locks) == 1
if len(old_locks) == 0:
# crap, my lock has been removed. :-(
# this can happen e.g. if my machine has been suspended while doing a backup, so that the
# lock will auto-expire. a borg client on another machine might then kill that lock.
# if my machine then wakes up again, the lock will have vanished and we get here.
# in this case, we need to abort the operation, because the other borg might have removed
# repo objects we have written, but the referential tree was not yet full present, e.g.
# no archive has been added yet to the manifest, thus all objects looked unused/orphaned.
# another scenario when this can happen is a careless user running break-lock on another
# machine without making sure there is no borg activity in that repo.
raise LockTimeout(str(self.store)) # our lock was killed, there is no safe way to continue.
assert len(old_locks) == 1 # there shouldn't be more than 1
old_lock = old_locks[0]
if old_lock["dt"] < now - self.refresh_td:
self._create_lock(exclusive=old_lock["exclusive"])