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:
parent
7bf0f47fea
commit
1cd2f4dca3
1 changed files with 12 additions and 1 deletions
|
@ -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"])
|
||||
|
|
Loading…
Add table
Reference in a new issue