Voice et bot modif
This commit is contained in:
parent
189d56026b
commit
7333a22bcd
10774 changed files with 634644 additions and 933308 deletions
|
|
@ -15,6 +15,7 @@ def raise_on_not_writable_file(filename: str) -> None:
|
|||
locked.
|
||||
|
||||
:param filename: file to check
|
||||
|
||||
:raises OSError: as if the file was opened for writing.
|
||||
|
||||
"""
|
||||
|
|
@ -46,7 +47,36 @@ def ensure_directory_exists(filename: Path | str) -> None:
|
|||
Path(filename).parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
def break_lock_file(lock_file: str, mtime_before: float) -> None:
|
||||
"""
|
||||
Atomically break a stale lock file that was judged stale at modification time *mtime_before*.
|
||||
|
||||
The file is renamed to a process-private name before being unlinked, so two processes breaking the same lock
|
||||
cannot delete each other's work (only one rename of a given inode succeeds; the loser gets ``OSError``). After the
|
||||
rename the modification time is re-checked: a value newer than *mtime_before* means a peer recreated the lock
|
||||
between the stale decision and the rename, so we grabbed a live file and must abort, leaving the renamed file in
|
||||
place rather than rolling back (a rollback rename is itself racy — same trade-off as the soft read/write marker
|
||||
break). ``lstat`` is used so a hostile symlink swapped in after the decision is not followed.
|
||||
|
||||
:param lock_file: path to the lock file to break.
|
||||
:param mtime_before: modification time observed when the lock was judged stale.
|
||||
|
||||
:raises OSError: if the rename fails (e.g. the file vanished or is not owned in a sticky directory).
|
||||
|
||||
"""
|
||||
break_path = f"{lock_file}.break.{os.getpid()}"
|
||||
Path(lock_file).rename(break_path)
|
||||
try:
|
||||
mtime_after = os.lstat(break_path).st_mtime
|
||||
except OSError:
|
||||
return
|
||||
if mtime_after > mtime_before:
|
||||
return
|
||||
Path(break_path).unlink()
|
||||
|
||||
|
||||
__all__ = [
|
||||
"break_lock_file",
|
||||
"ensure_directory_exists",
|
||||
"raise_on_not_writable_file",
|
||||
]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue