MCPcopy
hub / github.com/borgbackup/borg / kill_stale_lock

Method kill_stale_lock

src/borg/fslocking.py:207–258  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

205 return self.unique_name.exists()
206
207 def kill_stale_lock(self):
208 try:
209 names = [p.name for p in self.path.iterdir()]
210 except FileNotFoundError: # another process did our job in the meantime.
211 return False
212 except PermissionError: # win32 might throw this.
213 return False
214 else:
215 for name in names:
216 try:
217 host_pid, thread_str = name.rsplit("-", 1)
218 host, pid_str = host_pid.rsplit(".", 1)
219 pid = int(pid_str)
220 thread = int(thread_str, 16)
221 except ValueError:
222 # Malformed lock name? Or just some new format we don't understand?
223 logger.error("Found malformed lock %s in %s. Please check/fix manually.", name, str(self.path))
224 return False
225
226 if platform.process_alive(host, pid, thread):
227 return False
228
229 if not self.kill_stale_locks:
230 if not self.stale_warning_printed:
231 # Log this at warning level to hint the user at the ability
232 logger.warning(
233 "Found stale lock %s, but not deleting because self.kill_stale_locks = False.", name
234 )
235 self.stale_warning_printed = True
236 return False
237
238 try:
239 (self.path / name).unlink()
240 logger.warning("Killed stale lock %s.", name)
241 except OSError as err:
242 if not self.stale_warning_printed:
243 # This error will bubble up and likely result in locking failure
244 logger.error("Found stale lock %s, but cannot delete due to %s", name, str(err))
245 self.stale_warning_printed = True
246 return False
247
248 try:
249 self.path.rmdir()
250 except OSError as err:
251 if err.errno in (errno.ENOTEMPTY, errno.EEXIST, errno.ENOENT):
252 # Directory is not empty or doesn't exist any more = we lost the race to somebody else--which is ok.
253 return False
254 # EACCES or EIO or ... = we cannot operate anyway
255 logger.error("Failed to remove lock dir: %s", str(err))
256 return False
257
258 return True
259
260 def break_lock(self):
261 if self.is_locked():

Callers 1

acquireMethod · 0.95

Calls 2

errorMethod · 0.80
warningMethod · 0.80

Tested by

no test coverage detected