You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On a singleton wrapper, close> and
close> end only the holds that tasks acquired
through that wrapper. A reader that arrives during close() gets the closed error instead of joining the ending hold.
After synchronous code closes or force-releases the shared lock, the wrappers refuse to admit readers into the ended
hold, and close() on such a wrapper returns.
Closing one wrapper no longer ends a task's nested hold taken through another wrapper on the same path. #832
ReadWriteLock locks again after a release() that an exception from a signal handler interrupted.
The async read-write wrappers stop admitting readers into such a level. The async read-write locks forget a hold whose
backend release failed after the backend let go, and they free the memory of each acquire that times out or is canceled.
AsyncFileLock returns from release() after a few hundred acquires gave up behind a waiting one. An exception from a signal handler delivered while an AsyncFileLock call joins
its queue no longer blocks every later call on that lock. #833
Fix ReadWriteLock acting on -journal, -wal or -shm files another process puts beside its
database: a write could land in another file, a reader could get in beside a writer, and an acquire could fail. SQLite
now opens the database by name only in a directory no other account can write, and through a private hard link
elsewhere. On Windows the directory's access control list decides. Where hard links are unavailable, keep the database
in a directory other accounts cannot write, such as one under %LOCALAPPDATA%. The lock removes link directories
through a checked descriptor rather than by name, reads a link directory's name only when the locking account owns it,
and leaves alone a directory with other content renamed onto a link directory's name. A database whose schema takes more
than a few kilobytes to load raises ValueError instead of running past the acquire timeout. #834
Fix five bugs in opening the lock file. UnixFileLock no longer truncates a file it did not create,
such as one renamed to the lock path, and no longer applies mode to it. An on_acquired hook that writes holder
metadata now truncates the file itself. A lease (Linux) or an oplock (Windows) on the lock file or a soft lock's marker
no longer holds acquire() past its timeout or blocking=False, and an oplock no longer holds release();
ReadWriteLock on Windows waits for its timeout and raises Timeout. On Windows,
a mode without group and other bits, such as 0o600, now creates the lock file with an owner-only permission
list; the ReadWriteLock database gets the same. The soft locks' writability check no longer follows a
symlink swapped in at the lock path. On a filesystem without flock, a contender from another account now waits on a
marker it cannot write instead of raising PermissionError. #835
Fix SoftFileLock, MarkerSoftFileLock and SoftFileLease removing
a live holder's marker in three cases: the holder and the contender run in Linux time namespaces with different boottime
offsets; only one of them can read the boot id; a process other than the owner rewrote the marker. Soft markers no
longer carry group or other write bits. A process name containing a carriage return or another line separator no longer
makes the stale check raise ValueError. When /proc/self/ns/time exists but cannot be read, the stale check
no longer compares start times and keeps the marker. #836
The async read-write locks record their hold under a task owner, so synchronous code on the executor thread that took
the hold can no longer re-enter or release it. AsyncSoftReadWriteLock gives back one level on
release, so synchronous readers of a shared singleton keep theirs. SoftReadWriteLock tracks read
levels per thread: release() from a thread that holds none raises RuntimeError. After its heartbeat
recorded a lost hold, it refuses new acquires until that hold is released. #838
StrictSoftFileLock creates <path>.filelock and its claims directory with the lock's mode
and sets the sticky bit (a directory flag that lets only a file's owner remove it) on both. On the next acquisition it
narrows a directory it owns that an earlier release created wider; it leaves a directory of another account as it is,
so remove such leftovers by hand. It reaches claims through a descriptor opened without following symlinks; on
Windows it holds both directories open and refuses a junction (a directory that points at another directory). Under a
sticky parent such as /tmp it refuses a coordination directory of another account, as
SoftReadWriteLock does for <path>.rw. One read grace now covers a whole claim scan, a failed
claim cleanup no longer leaves the sentinel descriptor open, and a non-regular node at a sentinel private-record name
raises SoftFileLockProtocolError. On Windows, contenders read claims without blocking their owner's
unlink. #839
Keep GitHub Release notes free of extra blank lines while retaining the PyPI and version comparison links. :pr:863
4.2.3 (2026-10-19)
Creating a lock on a Python 3.15 interpreter without types.LazyImportType no longer triggers AttributeError at
exit. :pr:860
Handle EFTYPE when a no-follow open refuses a symlink in a soft reader/writer lock's protocol tree, so heartbeat
reports lost ownership rather than a transient refresh error.
4.2.2 (2026-10-18)
Fix a lock on a relative path that stayed held after a later with lock: ended, when an earlier acquire() had
failed because the working directory no longer exists. That call still raises :class:FileNotFoundError, and it now
leaves the lock's hold count unchanged. :pr:856
4.2.1 (2026-10-17)
On a singleton wrapper, :meth:AsyncReadWriteLock.close() <filelock.AsyncReadWriteLock.close> and
:meth:AsyncSoftReadWriteLock.close() <filelock.AsyncSoftReadWriteLock.close> end only the holds that tasks acquired
through that wrapper. A reader that arrives during close() gets the closed error instead of joining the ending hold.
After synchronous code closes or force-releases the shared lock, the wrappers refuse to admit readers into the ended
hold, and close() on such a wrapper returns.
Closing one wrapper no longer ends a task's nested hold taken through another wrapper on the same path. :pr:832
:class:~filelock.ReadWriteLock locks again after a release() that an exception from a signal handler interrupted.
The async read-write wrappers stop admitting readers into such a level. The async read-write locks forget a hold whose
backend release failed after the backend let go, and they free the memory of each acquire that times out or is canceled.
:class:~filelock.AsyncFileLock returns from release() after a few hundred acquires gave up behind a waiting one. An exception from a signal handler delivered while an :class:~filelock.AsyncFileLock call joins
its queue no longer blocks every later call on that lock. :pr:833
Fix :class:~filelock.ReadWriteLock acting on -journal, -wal or -shm files another process puts beside its
database: a write could land in another file, a reader could get in beside a writer, and an acquire could fail. SQLite
now opens the database by name only in a directory no other account can write, and through a private hard link
elsewhere. On Windows the directory's access control list decides. Where hard links are unavailable, keep the database
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebase will rebase this PR
@dependabot recreate will recreate this PR, overwriting any edits that have been made to it
@dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
@dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
@dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the Security Alerts page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
dependenciesPull requests that update a dependency filepython:uvPull requests that update python:uv code
1 participant
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps filelock from 3.29.4 to 4.2.1.
Release notes
Sourced from filelock's releases.
... (truncated)
Changelog
Sourced from filelock's changelog.
... (truncated)
Commits
60331bbRelease 4.2.1834bf13🧪 test(soft): skip Unix pin test on Windows9d15e38fix(soft-rw): isolate subclass singleton registries (#855)e1e825b🐛 fix(open): keep lock files intact, honor deadlines and mode (#835)5e3f2ec🐛 fix(read-write): keep SQLite off shared names, bound schema (#834)bfa066d🐛 fix(strict): keep claim directories private to the lock (#839)977d2c3🐛 fix(soft): wait on an empty marker instead of evicting (#846)740ff66🐛 fix(soft): break stale markers without emptying the lock path (#843)86c6d5f🐛 fix(async): honor cancellation and per-thread gates (#844)eeceaa8🐛 fix(soft): keep live holders when owner identity differs (#836)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)You can disable automated security fix PRs for this repo from the Security Alerts page.