Skip to content

🐛 fix(async-rw): give each task its own hold - #746

Merged
gaborbernat merged 1 commit into
tox-dev:mainfrom
gaborbernat:async-rw-task-owner
Sep 23, 2026
Merged

gaborbernat merged 1 commit into
tox-dev:mainfrom
gaborbernat:async-rw-task-owner

Conversation

@gaborbernat

@gaborbernat gaborbernat commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Tasks sharing one AsyncReadWriteLock or AsyncSoftReadWriteLock instance could enter the write lock at the same time. 🐛 The async wrappers run each sync call on an executor thread, and the sync lock tracks its owner per thread, so it counted every task as one owner and let each one nest into the existing hold. GIL builds show it too; I found it while investigating #744.

The fix tracks ownership per task, as aiorwlock does. A table in _async.py sits in front of the sync lock; it queues a task that has to wait and nests a task into a hold it already has. Tasks share a read hold, and a writer waits for the other holders to leave, with waiting writers ahead of new readers so a stream of readers cannot starve them. Only a task's first acquire and last release reach the sync lock, so the SQLite and filesystem calls stay unchanged. Upgrade and downgrade still raise. Singleton wrappers over one path share the table behind a thread lock, so tasks on different event loops exclude each other as well.

With ownership per task, a task can release only a hold it acquired, and a release from another task raises RuntimeError. The how-to page covers asyncio.wait_for(rw.acquire_write(), 5) on Python 3.10 and 3.11, where the acquire runs in a child task that then owns the hold, and recommends the lock's own timeout or asyncio.timeout(). close() still releases every hold regardless of owner.

@gaborbernat gaborbernat self-assigned this Sep 23, 2026
@gaborbernat
gaborbernat force-pushed the async-rw-task-owner branch 3 times, most recently from a475c7f to a330804 Compare September 23, 2026 20:52
The sync reader/writer locks track their owner per thread, and the async
wrappers run every call on an executor thread, so tasks sharing one
instance counted as one owner and entered the write lock together.

A per-task owner table in front of the sync lock queues tasks that have to
wait and nests a task into its own hold. Only a task's first acquire and
last release reach the sync lock, and waiting writers go ahead of new
readers. A release from a task that did not acquire raises RuntimeError.
@gaborbernat
gaborbernat merged commit 6c46312 into tox-dev:main Sep 23, 2026
47 checks passed
@gaborbernat
gaborbernat deleted the async-rw-task-owner branch October 3, 2026 15:12
parthea pushed a commit to googleapis/google-cloud-python that referenced this pull request Oct 13, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [filelock](https://redirect.github.com/tox-dev/py-filelock) |
`==3.29.0` → `==4.1.1` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/filelock/4.1.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/filelock/3.29.0/4.1.1?slim=true)
|

---

### Release Notes

<details>
<summary>tox-dev/py-filelock (filelock)</summary>

###
[`v4.1.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.1.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.1.0...4.1.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.1.1 -->

#### What's Changed

- feat(python): default to Python 3.15 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#816](https://redirect.github.com/tox-dev/filelock/pull/816)
- fix(rw): avoid macOS descriptor lookups by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#820](https://redirect.github.com/tox-dev/filelock/pull/820)
- fix(tests): bound concurrent lock progress by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#819](https://redirect.github.com/tox-dev/filelock/pull/819)
- test: make lock error checks deterministic by
[@&#8203;adenzhou1350](https://redirect.github.com/adenzhou1350) in
[tox-dev/filelock#817](https://redirect.github.com/tox-dev/filelock/pull/817)
- fix(read-write): reject a hostile pid in \_owner_is_gone by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#821](https://redirect.github.com/tox-dev/filelock/pull/821)

#### New Contributors

- [@&#8203;adenzhou1350](https://redirect.github.com/adenzhou1350) made
their first contribution in
[tox-dev/filelock#817](https://redirect.github.com/tox-dev/filelock/pull/817)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1>

###
[`v4.1.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.1.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.12...4.1.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.1.0 -->

#### What's Changed

- ci: download coverage during tool setup by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#776](https://redirect.github.com/tox-dev/filelock/pull/776)
- 🐛 fix(api): validate timeout and poll_interval bounds by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#781](https://redirect.github.com/tox-dev/filelock/pull/781)
- 🐛 fix(read-write): accept inf and reject nan timeouts by
[@&#8203;darrenhuai](https://redirect.github.com/darrenhuai) in
[tox-dev/filelock#779](https://redirect.github.com/tox-dev/filelock/pull/779)
- 🐛 fix(soft-rw): ignore non-ASCII generation names by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#778](https://redirect.github.com/tox-dev/filelock/pull/778)
- 🐛 fix(soft): check start token in is_lock_held_by_us by
[@&#8203;lprnmns](https://redirect.github.com/lprnmns) in
[tox-dev/filelock#774](https://redirect.github.com/tox-dev/filelock/pull/774)
- 🐛 fix(soft): clean up marker when rollback close fails by
[@&#8203;harbinresearcher](https://redirect.github.com/harbinresearcher)
in
[tox-dev/filelock#775](https://redirect.github.com/tox-dev/filelock/pull/775)
- 🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by
[@&#8203;darrenhuai](https://redirect.github.com/darrenhuai) in
[tox-dev/filelock#780](https://redirect.github.com/tox-dev/filelock/pull/780)
- 🐛 fix(soft): treat truncated markers as malformed by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#782](https://redirect.github.com/tox-dev/filelock/pull/782)
- 🐛 fix(acquire): keep every acquire wait within the timeout by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#777](https://redirect.github.com/tox-dev/filelock/pull/777)
- 📝 docs: fix hanging example and platform claims by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#783](https://redirect.github.com/tox-dev/filelock/pull/783)
- 🐛 fix(unix): keep peer marker on ENOSYS fallback by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#785](https://redirect.github.com/tox-dev/filelock/pull/785)
- 🐛 fix(async): clear the task hold after a canceled release by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#789](https://redirect.github.com/tox-dev/filelock/pull/789)
- ✨ feat(api): export lease types and has_fcntl by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#790](https://redirect.github.com/tox-dev/filelock/pull/790)
- 🐛 fix(strict): age private records by the filesystem clock by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#792](https://redirect.github.com/tox-dev/filelock/pull/792)
- 🐛 fix(async): surface executor shutdown as an error by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#793](https://redirect.github.com/tox-dev/filelock/pull/793)
- 🐛 fix(soft): expire leases on the contender's clock by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#796](https://redirect.github.com/tox-dev/filelock/pull/796)
- 🐛 fix(soft-rw): stop an acquire that close() overtook by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#798](https://redirect.github.com/tox-dev/filelock/pull/798)
- 🐛 fix(strict): record claims before linking them by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#787](https://redirect.github.com/tox-dev/filelock/pull/787)
- 🐛 fix(soft): restore a live marker a stale break moved aside by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#786](https://redirect.github.com/tox-dev/filelock/pull/786)
- 🐛 fix(api): chain errors on 3.10 without exceptiongroup by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#788](https://redirect.github.com/tox-dev/filelock/pull/788)
- 🐛 fix(soft): release a dropped SoftFileLease by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#791](https://redirect.github.com/tox-dev/filelock/pull/791)
- 🐛 fix(read-write): keep probe fds until the last connection closes by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#794](https://redirect.github.com/tox-dev/filelock/pull/794)
- 📦 build(sdist): ship docs and update SECURITY.md by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#812](https://redirect.github.com/tox-dev/filelock/pull/812)
- 🐛 fix(soft-rw): survive a removed generation log by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#795](https://redirect.github.com/tox-dev/filelock/pull/795)
- 🐛 fix(soft): tell PID namespaces apart in the marker host by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#797](https://redirect.github.com/tox-dev/filelock/pull/797)
- 🐛 fix(async): release from the finalizer and keep I/O off the loop by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#800](https://redirect.github.com/tox-dev/filelock/pull/800)
- 🐛 fix(strict): name what blocks the lock path by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#804](https://redirect.github.com/tox-dev/filelock/pull/804)
- 🐛 fix(read-write): reject WAL databases and link beside the db by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#805](https://redirect.github.com/tox-dev/filelock/pull/805)
- 🐛 fix(read-write): track read depth per thread by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#806](https://redirect.github.com/tox-dev/filelock/pull/806)
- 🐛 fix(soft): honour mode and tighten marker grammar by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#807](https://redirect.github.com/tox-dev/filelock/pull/807)
- 🧪 test: drop timing races from two runner-load flakes by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#809](https://redirect.github.com/tox-dev/filelock/pull/809)
- 🐛 fix(descriptor): reject poll intervals above TIMEOUT_MAX by
[@&#8203;sricharanreddycheruku](https://redirect.github.com/sricharanreddycheruku)
in
[tox-dev/filelock#802](https://redirect.github.com/tox-dev/filelock/pull/802)
- 🐛 fix(api): validate lock options up front by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#803](https://redirect.github.com/tox-dev/filelock/pull/803)
- 🐛 fix(soft-rw): publish the head through gen/HEAD by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#799](https://redirect.github.com/tox-dev/filelock/pull/799)
- 🐛 fix(api): release thread holds, guard reentry by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#810](https://redirect.github.com/tox-dev/filelock/pull/810)
- 🧪 test(lease): give the age-out test a real-time margin by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#814](https://redirect.github.com/tox-dev/filelock/pull/814)
- 📝 docs: point canonical and og:url at versioned pages by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#813](https://redirect.github.com/tox-dev/filelock/pull/813)
- 🐛 fix(read-write): refuse a database moved mid-acquire by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#808](https://redirect.github.com/tox-dev/filelock/pull/808)
- 🐛 fix: close regressions since 4.0.12 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#815](https://redirect.github.com/tox-dev/filelock/pull/815)

#### New Contributors

- [@&#8203;darrenhuai](https://redirect.github.com/darrenhuai) made
their first contribution in
[tox-dev/filelock#779](https://redirect.github.com/tox-dev/filelock/pull/779)
-
[@&#8203;harbinresearcher](https://redirect.github.com/harbinresearcher)
made their first contribution in
[tox-dev/filelock#775](https://redirect.github.com/tox-dev/filelock/pull/775)
-
[@&#8203;sricharanreddycheruku](https://redirect.github.com/sricharanreddycheruku)
made their first contribution in
[tox-dev/filelock#802](https://redirect.github.com/tox-dev/filelock/pull/802)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.12...4.1.0>

###
[`v4.0.12`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.12)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.11...4.0.12)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.12 -->

#### What's Changed

- fix: support older SQLite read locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#771](https://redirect.github.com/tox-dev/filelock/pull/771)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.11...4.0.12>

###
[`v4.0.11`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.11)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.10...4.0.11)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.11 -->

#### What's Changed

- docs: select an existing tox environment in contributing guide by
[@&#8203;raghav-sharma-ai](https://redirect.github.com/raghav-sharma-ai)
in
[tox-dev/filelock#767](https://redirect.github.com/tox-dev/filelock/pull/767)
- fix(read-write): handle NetBSD fd limits by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#768](https://redirect.github.com/tox-dev/filelock/pull/768)

#### New Contributors

-
[@&#8203;raghav-sharma-ai](https://redirect.github.com/raghav-sharma-ai)
made their first contribution in
[tox-dev/filelock#767](https://redirect.github.com/tox-dev/filelock/pull/767)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.10...4.0.11>

###
[`v4.0.10`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.10)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.9...4.0.10)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.10 -->

#### What's Changed

- ♻️ refactor(util): test helpers via public locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#764](https://redirect.github.com/tox-dev/filelock/pull/764)
- 🐛 fix(singleton): reject conflicting async and lease options by
[@&#8203;kokotatan](https://redirect.github.com/kokotatan) in
[tox-dev/filelock#765](https://redirect.github.com/tox-dev/filelock/pull/765)

#### New Contributors

- [@&#8203;kokotatan](https://redirect.github.com/kokotatan) made their
first contribution in
[tox-dev/filelock#765](https://redirect.github.com/tox-dev/filelock/pull/765)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.9...4.0.10>

###
[`v4.0.9`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.9)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.8...4.0.9)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.9 -->

#### What's Changed

- 📝 docs(util): correct write and break guarantees by
[@&#8203;pralav-25](https://redirect.github.com/pralav-25) in
[tox-dev/filelock#762](https://redirect.github.com/tox-dev/filelock/pull/762)
- 🐛 fix(read-write): close db fd after connect by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#763](https://redirect.github.com/tox-dev/filelock/pull/763)

#### New Contributors

- [@&#8203;pralav-25](https://redirect.github.com/pralav-25) made their
first contribution in
[tox-dev/filelock#762](https://redirect.github.com/tox-dev/filelock/pull/762)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.8...4.0.9>

###
[`v4.0.8`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.8)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.7...4.0.8)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.8 -->

#### What's Changed

- 🐛 fix(read-write): refuse cross-thread write release by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#761](https://redirect.github.com/tox-dev/filelock/pull/761)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.7...4.0.8>

###
[`v4.0.7`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.7)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.6...4.0.7)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.7 -->

#### What's Changed

- 🐛 fix(mode): require owner read and write by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#760](https://redirect.github.com/tox-dev/filelock/pull/760)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.6...4.0.7>

###
[`v4.0.6`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.6)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.5...4.0.6)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.6 -->

#### What's Changed

- fix(read-write): validate reentrant timeouts by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#756](https://redirect.github.com/tox-dev/filelock/pull/756)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.5...4.0.6>

###
[`v4.0.5`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.5)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.4...4.0.5)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.5 -->

#### What's Changed

- fix(marker): preserve live owners by
[@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX) in
[tox-dev/filelock#751](https://redirect.github.com/tox-dev/filelock/pull/751)
- fix(tests): separate mode and access checks by
[@&#8203;pasmud](https://redirect.github.com/pasmud) in
[tox-dev/filelock#753](https://redirect.github.com/tox-dev/filelock/pull/753)
- fix(read-write): honor instance defaults by
[@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX) in
[tox-dev/filelock#752](https://redirect.github.com/tox-dev/filelock/pull/752)
- fix(async): validate blocking read-write timeouts by
[@&#8203;pasmud](https://redirect.github.com/pasmud) in
[tox-dev/filelock#755](https://redirect.github.com/tox-dev/filelock/pull/755)
- fix(strict): handle vanished unreadable claims by
[@&#8203;januththedev](https://redirect.github.com/januththedev) in
[tox-dev/filelock#754](https://redirect.github.com/tox-dev/filelock/pull/754)

#### New Contributors

- [@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX) made
their first contribution in
[tox-dev/filelock#751](https://redirect.github.com/tox-dev/filelock/pull/751)
- [@&#8203;pasmud](https://redirect.github.com/pasmud) made their first
contribution in
[tox-dev/filelock#753](https://redirect.github.com/tox-dev/filelock/pull/753)
- [@&#8203;januththedev](https://redirect.github.com/januththedev) made
their first contribution in
[tox-dev/filelock#754](https://redirect.github.com/tox-dev/filelock/pull/754)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.4...4.0.5>

###
[`v4.0.4`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.4)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.3...4.0.4)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.4 -->

#### What's Changed

- 🐛 fix(identity): digest the cut tail of long hostnames by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#748](https://redirect.github.com/tox-dev/filelock/pull/748)

#### New Contributors

- [@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) made their
first contribution in
[tox-dev/filelock#748](https://redirect.github.com/tox-dev/filelock/pull/748)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.3...4.0.4>

###
[`v4.0.3`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.3)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.2...4.0.3)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.3 -->

#### What's Changed

- 🐛 fix(api): skip the fork audit hook on CPython <3.12 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#747](https://redirect.github.com/tox-dev/filelock/pull/747)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.2...4.0.3>

###
[`v4.0.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.1...4.0.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.2 -->

#### What's Changed

- docs: create the data directory in the async cache example by
[@&#8203;agammann](https://redirect.github.com/agammann) in
[tox-dev/filelock#740](https://redirect.github.com/tox-dev/filelock/pull/740)
- fix: ignore broken sphinx-llm release by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#742](https://redirect.github.com/tox-dev/filelock/pull/742)
- 🐛 fix(api): serialize concurrent transitions on shared locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#745](https://redirect.github.com/tox-dev/filelock/pull/745)
- 🐛 fix(async-rw): give each task its own hold by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#746](https://redirect.github.com/tox-dev/filelock/pull/746)

#### New Contributors

- [@&#8203;agammann](https://redirect.github.com/agammann) made their
first contribution in
[tox-dev/filelock#740](https://redirect.github.com/tox-dev/filelock/pull/740)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.1...4.0.2>

###
[`v4.0.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.0...4.0.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.1 -->

#### What's Changed

- fix: reject invalid poll_interval before sleep by
[@&#8203;Pitchfork-and-Torch](https://redirect.github.com/Pitchfork-and-Torch)
in
[tox-dev/filelock#739](https://redirect.github.com/tox-dev/filelock/pull/739)

#### New Contributors

-
[@&#8203;Pitchfork-and-Torch](https://redirect.github.com/Pitchfork-and-Torch)
made their first contribution in
[tox-dev/filelock#739](https://redirect.github.com/tox-dev/filelock/pull/739)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/4.0.0...4.0.1>

###
[`v4.0.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.7...4.0.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.0 -->

#### What's Changed

- 🐛 fix(soft-rw): replace the state mutex with a generation log by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#738](https://redirect.github.com/tox-dev/filelock/pull/738)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.7...4.0.0>

###
[`v3.32.7`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.7)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.6...3.32.7)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.7 -->

#### What's Changed

- Fix final symlink test on musl by
[@&#8203;lprnmns](https://redirect.github.com/lprnmns) in
[tox-dev/filelock#737](https://redirect.github.com/tox-dev/filelock/pull/737)
- 📝 docs: say acquire() falls back to the lock's blocking attribute by
[@&#8203;hxperl](https://redirect.github.com/hxperl) in
[tox-dev/filelock#733](https://redirect.github.com/tox-dev/filelock/pull/733)

#### New Contributors

- [@&#8203;hxperl](https://redirect.github.com/hxperl) made their first
contribution in
[tox-dev/filelock#733](https://redirect.github.com/tox-dev/filelock/pull/733)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.6...3.32.7>

###
[`v3.32.6`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.6)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.5...3.32.6)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.6 -->

#### What's Changed

- 🐛 fix(lease): reject a duration no marker can carry by
[@&#8203;lprnmns](https://redirect.github.com/lprnmns) in
[tox-dev/filelock#723](https://redirect.github.com/tox-dev/filelock/pull/723)
- 🐛 fix(soft-rw): reject non-finite timing options by
[@&#8203;lprnmns](https://redirect.github.com/lprnmns) in
[tox-dev/filelock#724](https://redirect.github.com/tox-dev/filelock/pull/724)
- fix: preserve exception notes when copying and pickling by
[@&#8203;jackwalkerlabs](https://redirect.github.com/jackwalkerlabs) in
[tox-dev/filelock#729](https://redirect.github.com/tox-dev/filelock/pull/729)
- test(soft-rw): reuse existing test module by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#730](https://redirect.github.com/tox-dev/filelock/pull/730)
- fix: respect ACL write access when the owner write bit is absent by
[@&#8203;jackwalkerlabs](https://redirect.github.com/jackwalkerlabs) in
[tox-dev/filelock#728](https://redirect.github.com/tox-dev/filelock/pull/728)
- Fix SoftReadWriteLock state lock timeout by
[@&#8203;Sohel2309](https://redirect.github.com/Sohel2309) in
[tox-dev/filelock#726](https://redirect.github.com/tox-dev/filelock/pull/726)

#### New Contributors

- [@&#8203;jackwalkerlabs](https://redirect.github.com/jackwalkerlabs)
made their first contribution in
[tox-dev/filelock#729](https://redirect.github.com/tox-dev/filelock/pull/729)
- [@&#8203;Sohel2309](https://redirect.github.com/Sohel2309) made their
first contribution in
[tox-dev/filelock#726](https://redirect.github.com/tox-dev/filelock/pull/726)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.5...3.32.6>

###
[`v3.32.5`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.5)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.4...3.32.5)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.5 -->

#### What's Changed

- 🧪 test(fork): report where a stalled fork stops by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#715](https://redirect.github.com/tox-dev/filelock/pull/715)
- 📝 docs: say that mode is read-only in the thread-local section by
[@&#8203;Gares95](https://redirect.github.com/Gares95) in
[tox-dev/filelock#716](https://redirect.github.com/tox-dev/filelock/pull/716)
- 🐛 fix(lease): clear token after failed acquire by
[@&#8203;lprnmns](https://redirect.github.com/lprnmns) in
[tox-dev/filelock#721](https://redirect.github.com/tox-dev/filelock/pull/721)

#### New Contributors

- [@&#8203;lprnmns](https://redirect.github.com/lprnmns) made their
first contribution in
[tox-dev/filelock#721](https://redirect.github.com/tox-dev/filelock/pull/721)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.4...3.32.5>

###
[`v3.32.4`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.4)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.3...3.32.4)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.4 -->

#### What's Changed

- 🐛 fix: retry transient denials on open and claim read by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#705](https://redirect.github.com/tox-dev/filelock/pull/705)
- 🧪 test: deflake six scheduled-run failures by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#704](https://redirect.github.com/tox-dev/filelock/pull/704)
- 🧪 test: cover a reclaimed private record for real by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#706](https://redirect.github.com/tox-dev/filelock/pull/706)
- 🧪 test(fork): fork once the event loop has closed by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#714](https://redirect.github.com/tox-dev/filelock/pull/714)
- 🔧 chore: batch dependency updates weekly on Tuesday by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#713](https://redirect.github.com/tox-dev/filelock/pull/713)
- escape the hostname every marker publishes by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#709](https://redirect.github.com/tox-dev/filelock/pull/709)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.3...3.32.4>

###
[`v3.32.3`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.3)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.2...3.32.3)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.3 -->

#### What's Changed

- 🧪 test(strict): deflake close-fault injections on graalpy by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#697](https://redirect.github.com/tox-dev/filelock/pull/697)
- 📄 docs: publish llms.txt from the docs build by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#700](https://redirect.github.com/tox-dev/filelock/pull/700)
- 🐛 fix(fork): survive audit events during interpreter shutdown by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#703](https://redirect.github.com/tox-dev/filelock/pull/703)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.2...3.32.3>

###
[`v3.32.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.0...3.32.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.2 -->

#### What's Changed

- Fix test failures on NetBSD
([#&#8203;689](https://redirect.github.com/tox-dev/py-filelock/issues/689))
by [@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#693](https://redirect.github.com/tox-dev/filelock/pull/693)
- 🧪 test(soft-rw): deflake writer phase-2 peer-marker test by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#694](https://redirect.github.com/tox-dev/filelock/pull/694)
- hand back the claim when a heartbeat thread fails to start by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#691](https://redirect.github.com/tox-dev/filelock/pull/691)
- 🧪 test(unix): deflake sticky-bit concurrent-unlink on graalpy by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#695](https://redirect.github.com/tox-dev/filelock/pull/695)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.32.1...3.32.2>

###
[`v3.32.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.32.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.31.2...3.32.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.32.0 -->

#### What's Changed

- 👷 ci: add Python 3.15 to the test matrix by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#683](https://redirect.github.com/tox-dev/filelock/pull/683)
- 🐛 fix(packaging): let an unpacked sdist run the test suite by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#685](https://redirect.github.com/tox-dev/filelock/pull/685)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.31.2...3.32.0>

###
[`v3.31.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.31.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.31.1...3.31.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.31.2 -->

#### What's Changed

- 🐛 fix(strict): tolerate an errno without ENOTSUP by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#681](https://redirect.github.com/tox-dev/filelock/pull/681)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.31.1...3.31.2>

###
[`v3.31.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.31.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.31.0...3.31.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.31.1 -->

#### What's Changed

- ♻️ refactor(coverage): key exclusions on probed capability by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#679](https://redirect.github.com/tox-dev/filelock/pull/679)
- scope a lease's claim to the context that acquired it by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#680](https://redirect.github.com/tox-dev/filelock/pull/680)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.31.0...3.31.1>

###
[`v3.31.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.31.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.30.3...3.31.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.31.0 -->

#### What's Changed

- ✨ feat(platform): support Termux/Android by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#678](https://redirect.github.com/tox-dev/filelock/pull/678)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.30.3...3.31.0>

###
[`v3.30.3`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.30.3)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.30.2...3.30.3)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.30.3 -->

#### What's Changed

- Keep both tables of contents on screen at any browser font size by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#673](https://redirect.github.com/tox-dev/filelock/pull/673)
- 📝 docs(mermaid): follow the light and dark theme toggle by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#674](https://redirect.github.com/tox-dev/filelock/pull/674)
- asyncio: scope the reentrant-deadlock registry to the owning task by
[@&#8203;xt-yin](https://redirect.github.com/xt-yin) in
[tox-dev/filelock#676](https://redirect.github.com/tox-dev/filelock/pull/676)

#### New Contributors

- [@&#8203;xt-yin](https://redirect.github.com/xt-yin) made their first
contribution in
[tox-dev/filelock#676](https://redirect.github.com/tox-dev/filelock/pull/676)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.30.2...3.30.3>

###
[`v3.30.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.30.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.30.1...3.30.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.30.2 -->

#### What's Changed

- Document every lock type, and stop evicting a marker we cannot read by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#672](https://redirect.github.com/tox-dev/filelock/pull/672)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.30.1...3.30.2>

###
[`v3.30.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.30.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.30.0...3.30.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.30.1 -->

#### What's Changed

- 📝 docs: separate changelog releases with a blank line by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#668](https://redirect.github.com/tox-dev/filelock/pull/668)
- 🐛 fix: tolerate NFSv3 stale handle in strict claim read by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#669](https://redirect.github.com/tox-dev/filelock/pull/669)
- Match fork-reset protocol on the class object by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#671](https://redirect.github.com/tox-dev/filelock/pull/671)
- reject non-finite lease duration in marker records by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#670](https://redirect.github.com/tox-dev/filelock/pull/670)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.30.0...3.30.1>

###
[`v3.30.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.30.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.7...3.30.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.30.0 -->

#### What's Changed

- 🎨 style: readability cleanup across the library by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#598](https://redirect.github.com/tox-dev/filelock/pull/598)
- 🐛 fix(api): ignore lifetime on native OS locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#593](https://redirect.github.com/tox-dev/filelock/pull/593)
- 🐛 fix(unix): don't mutate lock file before acquiring flock by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#594](https://redirect.github.com/tox-dev/filelock/pull/594)
- soft: evict a non-regular lock file without reading it by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#597](https://redirect.github.com/tox-dev/filelock/pull/597)
- 🐛 fix(windows): bind reparse-point check to the locked handle by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#596](https://redirect.github.com/tox-dev/filelock/pull/596)
- 🐛 fix(api): make native lock release transactional by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#615](https://redirect.github.com/tox-dev/filelock/pull/615)
- 🐛 fix(soft): make marker writes and cleanup transactional by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#614](https://redirect.github.com/tox-dev/filelock/pull/614)
- 🐛 fix(windows): open the lock file through NtCreateFile by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#617](https://redirect.github.com/tox-dev/filelock/pull/617)
- ✨ feat(api): add context_error_policy for dual context failures by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#618](https://redirect.github.com/tox-dev/filelock/pull/618)
- 📝 docs: correct Unix lock-file cleanup and flock claims by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#623](https://redirect.github.com/tox-dev/filelock/pull/623)
- ✨ feat(api): add close_error_policy for post-unlock close errors by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#619](https://redirect.github.com/tox-dev/filelock/pull/619)
- 🐛 fix(api): canonicalize singleton keys without following a final
symlink by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#621](https://redirect.github.com/tox-dev/filelock/pull/621)
- ✨ feat(unix): add fallback_to_soft opt-out for native locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#622](https://redirect.github.com/tox-dev/filelock/pull/622)
- ✨ feat: add lock_descriptor for a caller-owned descriptor by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#620](https://redirect.github.com/tox-dev/filelock/pull/620)
- ✨ feat(api): add preserve_lock_file to keep the lock pathname by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#624](https://redirect.github.com/tox-dev/filelock/pull/624)
- ✨ feat(api): add on_acquired post-acquisition hook by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#625](https://redirect.github.com/tox-dev/filelock/pull/625)
- 🔧 build(release): towncrier changelog pipeline, backfill, and docs by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#626](https://redirect.github.com/tox-dev/filelock/pull/626)
- 📝 docs: drop bot entries and link code refs in the changelog by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#638](https://redirect.github.com/tox-dev/filelock/pull/638)
- 🐛 fix(api): validate lifetime values by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#644](https://redirect.github.com/tox-dev/filelock/pull/644)
- 🐛 fix(win32): capture process probe errors by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#645](https://redirect.github.com/tox-dev/filelock/pull/645)
- 🐛 fix(api): reject dropped lock options by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#646](https://redirect.github.com/tox-dev/filelock/pull/646)
- 🐛 fix(api): retain acquisition path identity by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#647](https://redirect.github.com/tox-dev/filelock/pull/647)
- 🐛 fix(api): detach grouped release errors by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#648](https://redirect.github.com/tox-dev/filelock/pull/648)
- 🐛 fix(descriptor): define unavailable behavior by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#650](https://redirect.github.com/tox-dev/filelock/pull/650)
- 🐛 fix(ci): map absolute coverage paths by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#651](https://redirect.github.com/tox-dev/filelock/pull/651)
- 🐛 fix(soft): relinquish fd before close by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#649](https://redirect.github.com/tox-dev/filelock/pull/649)
- 🐛 fix(async): make cancellation atomic by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#652](https://redirect.github.com/tox-dev/filelock/pull/652)
- 🐛 fix(sqlite): isolate forked connections by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#657](https://redirect.github.com/tox-dev/filelock/pull/657)
- 🧪 test(conftest): scope the close mock to one descriptor by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#656](https://redirect.github.com/tox-dev/filelock/pull/656)
- ✨ feat(soft): add strict soft locks and leases by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#658](https://redirect.github.com/tox-dev/filelock/pull/658)
- ✨ feat(strict): replace shared markers with owner claims by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#659](https://redirect.github.com/tox-dev/filelock/pull/659)
- 🐛 fix(soft): detect a reused PID via process start time by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#660](https://redirect.github.com/tox-dev/filelock/pull/660)
- 🔒 fix(soft): fail safe on transient heartbeat errors by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#661](https://redirect.github.com/tox-dev/filelock/pull/661)
- 📝 docs: state the lock trust boundaries once by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#663](https://redirect.github.com/tox-dev/filelock/pull/663)
- 👷 ci(perf): add the performance and NFS matrix by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#664](https://redirect.github.com/tox-dev/filelock/pull/664)
- Replace prettier with mdformat and yamlfmt by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#667](https://redirect.github.com/tox-dev/filelock/pull/667)
- 👷 ci(matrix): add SMB, capability, and matrix docs by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#665](https://redirect.github.com/tox-dev/filelock/pull/665)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.7...3.30.0>

###
[`v3.29.7`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.7)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.6...3.29.7)

<!-- Release notes generated using configuration in .github/release.yaml
at main -->

#### What's Changed

- asyncio: detect cross-instance reentrant deadlocks before the poll
loop by [@&#8203;HrachShah](https://redirect.github.com/HrachShah) in
[tox-dev/filelock#586](https://redirect.github.com/tox-dev/filelock/pull/586)
- 🐛 fix(soft_rw): evict non-regular write marker without reading it by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#588](https://redirect.github.com/tox-dev/filelock/pull/588)
- \_util: drop the dead st_mtime=0 short-circuit in
raise_on_not_writable_file by
[@&#8203;HrachShah](https://redirect.github.com/HrachShah) in
[tox-dev/filelock#589](https://redirect.github.com/tox-dev/filelock/pull/589)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.6...3.29.7>

###
[`v3.29.6`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.6)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.5...3.29.6)

<!-- Release notes generated using configuration in .github/release.yaml
at main -->

#### What's Changed

- serialise singleton construction in FileLockMeta by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#581](https://redirect.github.com/tox-dev/filelock/pull/581)
- \_util: drop the dead st_mtime=0 short-circuit in
raise_on_not_writable_file by
[@&#8203;HrachShah](https://redirect.github.com/HrachShah) in
[tox-dev/filelock#582](https://redirect.github.com/tox-dev/filelock/pull/582)
- test: silence fork DeprecationWarning on 3.15 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#585](https://redirect.github.com/tox-dev/filelock/pull/585)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.5...3.29.6>

###
[`v3.29.5`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.5)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.4...3.29.5)

<!-- Release notes generated using configuration in .github/release.yaml
at main -->

#### What's Changed

- serialise read/write release rollback against a concurrent acquire by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#563](https://redirect.github.com/tox-dev/filelock/pull/563)
- 🔒 fix(soft_rw): refresh held marker through the verified fd by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#565](https://redirect.github.com/tox-dev/filelock/pull/565)
- only unlink the writer marker on release if it is still ours by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#566](https://redirect.github.com/tox-dev/filelock/pull/566)
- don't follow symlinks in raise_on_not_writable_file by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#567](https://redirect.github.com/tox-dev/filelock/pull/567)
- don't complete a writer acquire on a peer's reclaimed marker by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#571](https://redirect.github.com/tox-dev/filelock/pull/571)
- use a private break name in break_lock_file by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#576](https://redirect.github.com/tox-dev/filelock/pull/576)
- Keep Unix lock files after release by
[@&#8203;itscloud0](https://redirect.github.com/itscloud0) in
[tox-dev/filelock#577](https://redirect.github.com/tox-dev/filelock/pull/577)
- test: fix Windows type check broken by
[#&#8203;577](https://redirect.github.com/tox-dev/py-filelock/issues/577)
by [@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#580](https://redirect.github.com/tox-dev/filelock/pull/580)
- roll back a read acquire's open transaction when its SELECT fails by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#575](https://redirect.github.com/tox-dev/filelock/pull/575)
- lifetime: reject negative, non-numeric, and bool values at the setter
by [@&#8203;HrachShah](https://redirect.github.com/HrachShah) in
[tox-dev/filelock#573](https://redirect.github.com/tox-dev/filelock/pull/573)

#### New Contributors

- [@&#8203;itscloud0](https://redirect.github.com/itscloud0) made their
first contribution in
[tox-dev/filelock#577](https://redirect.github.com/tox-dev/filelock/pull/577)
- [@&#8203;HrachShah](https://redirect.github.com/HrachShah) made their
first contribution in
[tox-dev/filelock#573](https://redirect.github.com/tox-dev/filelock/pull/573)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.4...3.29.5>

###
[`v3.29.4`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.4)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.3...3.29.4)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.29.4 -->

#### What's Changed

- verify inode in break_lock_file before unlinking a stale lock by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#561](https://redirect.github.com/tox-dev/filelock/pull/561)
- keep the read/write heartbeat alive on a transient touch error by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#562](https://redirect.github.com/tox-dev/filelock/pull/562)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.3...3.29.4>

###
[`v3.29.3`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.3)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.2...3.29.3)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.29.3 -->

#### What's Changed

- 🔧 ci(release): publish to PyPI on tag push by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#557](https://redirect.github.com/tox-dev/filelock/pull/557)
- validate pid range in \_parse_lock_holder by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#556](https://redirect.github.com/tox-dev/filelock/pull/556)
- 🐛 fix(ci): restore release environment on tag job by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#559](https://redirect.github.com/tox-dev/filelock/pull/559)
- 🐛 fix(ci): publish from release.yaml on tag push by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#560](https://redirect.github.com/tox-dev/filelock/pull/560)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.2...3.29.3>

###
[`v3.29.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.1...3.29.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.29.2 -->

#### What's Changed

- open marker reads non-blocking to refuse attacker-placed fifo by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#549](https://redirect.github.com/tox-dev/filelock/pull/549)
- 🔒 fix(soft): harden stale-lock breaking and self-heal malformed locks
by [@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#551](https://redirect.github.com/tox-dev/filelock/pull/551)
- check hostname in is_lock_held_by_us by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#553](https://redirect.github.com/tox-dev/filelock/pull/553)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.1...3.29.2>

###
[`v3.29.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/3.29.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.29.0...3.29.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 3.29.1 -->

#### What's Changed

- docs: fix API docs of `release()` by
[@&#8203;MrAnno](https://redirect.github.com/MrAnno) in
[tox-dev/filelock#540](https://redirect.github.com/tox-dev/filelock/pull/540)
- docs: clarify per-thread scope of FileLock configuration by
[@&#8203;Gares95](https://redirect.github.com/Gares95) in
[tox-dev/filelock#543](https://redirect.github.com/tox-dev/filelock/pull/543)
- chore: improve filelock maintenance path by
[@&#8203;lphuc2250gma](https://redirect.github.com/lphuc2250gma) in
[tox-dev/filelock#542](https://redirect.github.com/tox-dev/filelock/pull/542)
- chore: improve filelock maintenance path by
[@&#8203;lphuc2250gma](https://redirect.github.com/lphuc2250gma) in
[tox-dev/filelock#544](https://redirect.github.com/tox-dev/filelock/pull/544)
- chore: improve filelock maintenance path by
[@&#8203;lphuc2250gma](https://redirect.github.com/lphuc2250gma) in
[tox-dev/filelock#545](https://redirect.github.com/tox-dev/filelock/pull/545)
- 🐛 fix(soft): refuse to follow symlinks when reading the lock file by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#548](https://redirect.github.com/tox-dev/filelock/pull/548)

#### New Contributors

- [@&#8203;MrAnno](https://redirect.github.com/MrAnno) made their first
contribution in
[tox-dev/filelock#540](https://redirect.github.com/tox-dev/filelock/pull/540)
- [@&#8203;Gares95](https://redirect.github.com/Gares95) made their
first contribution in
[tox-dev/filelock#543](https://redirect.github.com/tox-dev/filelock/pull/543)
- [@&#8203;lphuc2250gma](https://redirect.github.com/lphuc2250gma) made
their first contribution in
[tox-dev/filelock#542](https://redirect.github.com/tox-dev/filelock/pull/542)
- [@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) made their
first contribution in
[tox-dev/filelock#548](https://redirect.github.com/tox-dev/filelock/pull/548)

**Full Changelog**:
<https://github.com/tox-dev/filelock/compare/3.29.0...3.29.1>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/google-cloud-python).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNTUuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE1NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
parthea pushed a commit to googleapis/google-cloud-python that referenced this pull request Oct 16, 2026
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [filelock](https://redirect.github.com/tox-dev/py-filelock) |
`==3.32.7` → `==4.2.0` |
![age](https://developer.mend.io/api/mc/badges/age/pypi/filelock/4.2.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/filelock/3.32.7/4.2.0?slim=true)
|

---

### Release Notes

<details>
<summary>tox-dev/py-filelock (filelock)</summary>

###
[`v4.2.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.2.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.1.2...4.2.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.2.0 -->

#### What's Changed

- fix(strict): skip Windows claims pending deletion by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#829](https://redirect.github.com/tox-dev/filelock/pull/829)
- perf(import): defer asyncio and sqlite3 loading by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#831](https://redirect.github.com/tox-dev/filelock/pull/831)

**Full Changelog**:
<tox-dev/filelock@4.1.2...4.2.0>

###
[`v4.1.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.1.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.1.1...4.1.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.1.2 -->

#### What's Changed

- fix: prioritize S_ISDIR check in raise_on_not_writable_file by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#822](https://redirect.github.com/tox-dev/filelock/pull/822)
- 🔧 chore(security): enroll in Anthropic OSS Scanner by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#823](https://redirect.github.com/tox-dev/filelock/pull/823)
- 📝 docs(security): add an email reporting contact by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#825](https://redirect.github.com/tox-dev/filelock/pull/825)
- docs: hash all keys in the lock filename recipe by
[@&#8203;xiehuanyi](https://redirect.github.com/xiehuanyi) in
[tox-dev/filelock#824](https://redirect.github.com/tox-dev/filelock/pull/824)
- fix(read-write): use sqlite_master for read lock schema probe on older
SQLite by [@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX)
in
[tox-dev/filelock#827](https://redirect.github.com/tox-dev/filelock/pull/827)
- fix(rw): forget the async lock's worker after fork by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#828](https://redirect.github.com/tox-dev/filelock/pull/828)

#### New Contributors

- [@&#8203;xiehuanyi](https://redirect.github.com/xiehuanyi) made their
first contribution in
[tox-dev/filelock#824](https://redirect.github.com/tox-dev/filelock/pull/824)

**Full Changelog**:
<tox-dev/filelock@4.1.1...4.1.2>

###
[`v4.1.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.1.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.1.0...4.1.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.1.1 -->

#### What's Changed

- feat(python): default to Python 3.15 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#816](https://redirect.github.com/tox-dev/filelock/pull/816)
- fix(rw): avoid macOS descriptor lookups by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#820](https://redirect.github.com/tox-dev/filelock/pull/820)
- fix(tests): bound concurrent lock progress by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#819](https://redirect.github.com/tox-dev/filelock/pull/819)
- test: make lock error checks deterministic by
[@&#8203;adenzhou1350](https://redirect.github.com/adenzhou1350) in
[tox-dev/filelock#817](https://redirect.github.com/tox-dev/filelock/pull/817)
- fix(read-write): reject a hostile pid in \_owner_is_gone by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#821](https://redirect.github.com/tox-dev/filelock/pull/821)

#### New Contributors

- [@&#8203;adenzhou1350](https://redirect.github.com/adenzhou1350) made
their first contribution in
[tox-dev/filelock#817](https://redirect.github.com/tox-dev/filelock/pull/817)

**Full Changelog**:
<tox-dev/filelock@4.1.0...4.1.1>

###
[`v4.1.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.1.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.12...4.1.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.1.0 -->

#### What's Changed

- ci: download coverage during tool setup by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#776](https://redirect.github.com/tox-dev/filelock/pull/776)
- 🐛 fix(api): validate timeout and poll_interval bounds by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#781](https://redirect.github.com/tox-dev/filelock/pull/781)
- 🐛 fix(read-write): accept inf and reject nan timeouts by
[@&#8203;darrenhuai](https://redirect.github.com/darrenhuai) in
[tox-dev/filelock#779](https://redirect.github.com/tox-dev/filelock/pull/779)
- 🐛 fix(soft-rw): ignore non-ASCII generation names by
[@&#8203;dxbjavid](https://redirect.github.com/dxbjavid) in
[tox-dev/filelock#778](https://redirect.github.com/tox-dev/filelock/pull/778)
- 🐛 fix(soft): check start token in is_lock_held_by_us by
[@&#8203;lprnmns](https://redirect.github.com/lprnmns) in
[tox-dev/filelock#774](https://redirect.github.com/tox-dev/filelock/pull/774)
- 🐛 fix(soft): clean up marker when rollback close fails by
[@&#8203;harbinresearcher](https://redirect.github.com/harbinresearcher)
in
[tox-dev/filelock#775](https://redirect.github.com/tox-dev/filelock/pull/775)
- 🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by
[@&#8203;darrenhuai](https://redirect.github.com/darrenhuai) in
[tox-dev/filelock#780](https://redirect.github.com/tox-dev/filelock/pull/780)
- 🐛 fix(soft): treat truncated markers as malformed by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#782](https://redirect.github.com/tox-dev/filelock/pull/782)
- 🐛 fix(acquire): keep every acquire wait within the timeout by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#777](https://redirect.github.com/tox-dev/filelock/pull/777)
- 📝 docs: fix hanging example and platform claims by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#783](https://redirect.github.com/tox-dev/filelock/pull/783)
- 🐛 fix(unix): keep peer marker on ENOSYS fallback by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#785](https://redirect.github.com/tox-dev/filelock/pull/785)
- 🐛 fix(async): clear the task hold after a canceled release by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#789](https://redirect.github.com/tox-dev/filelock/pull/789)
- ✨ feat(api): export lease types and has_fcntl by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#790](https://redirect.github.com/tox-dev/filelock/pull/790)
- 🐛 fix(strict): age private records by the filesystem clock by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#792](https://redirect.github.com/tox-dev/filelock/pull/792)
- 🐛 fix(async): surface executor shutdown as an error by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#793](https://redirect.github.com/tox-dev/filelock/pull/793)
- 🐛 fix(soft): expire leases on the contender's clock by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#796](https://redirect.github.com/tox-dev/filelock/pull/796)
- 🐛 fix(soft-rw): stop an acquire that close() overtook by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#798](https://redirect.github.com/tox-dev/filelock/pull/798)
- 🐛 fix(strict): record claims before linking them by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#787](https://redirect.github.com/tox-dev/filelock/pull/787)
- 🐛 fix(soft): restore a live marker a stale break moved aside by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#786](https://redirect.github.com/tox-dev/filelock/pull/786)
- 🐛 fix(api): chain errors on 3.10 without exceptiongroup by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#788](https://redirect.github.com/tox-dev/filelock/pull/788)
- 🐛 fix(soft): release a dropped SoftFileLease by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#791](https://redirect.github.com/tox-dev/filelock/pull/791)
- 🐛 fix(read-write): keep probe fds until the last connection closes by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#794](https://redirect.github.com/tox-dev/filelock/pull/794)
- 📦 build(sdist): ship docs and update SECURITY.md by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#812](https://redirect.github.com/tox-dev/filelock/pull/812)
- 🐛 fix(soft-rw): survive a removed generation log by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#795](https://redirect.github.com/tox-dev/filelock/pull/795)
- 🐛 fix(soft): tell PID namespaces apart in the marker host by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#797](https://redirect.github.com/tox-dev/filelock/pull/797)
- 🐛 fix(async): release from the finalizer and keep I/O off the loop by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#800](https://redirect.github.com/tox-dev/filelock/pull/800)
- 🐛 fix(strict): name what blocks the lock path by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#804](https://redirect.github.com/tox-dev/filelock/pull/804)
- 🐛 fix(read-write): reject WAL databases and link beside the db by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#805](https://redirect.github.com/tox-dev/filelock/pull/805)
- 🐛 fix(read-write): track read depth per thread by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#806](https://redirect.github.com/tox-dev/filelock/pull/806)
- 🐛 fix(soft): honour mode and tighten marker grammar by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#807](https://redirect.github.com/tox-dev/filelock/pull/807)
- 🧪 test: drop timing races from two runner-load flakes by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#809](https://redirect.github.com/tox-dev/filelock/pull/809)
- 🐛 fix(descriptor): reject poll intervals above TIMEOUT_MAX by
[@&#8203;sricharanreddycheruku](https://redirect.github.com/sricharanreddycheruku)
in
[tox-dev/filelock#802](https://redirect.github.com/tox-dev/filelock/pull/802)
- 🐛 fix(api): validate lock options up front by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#803](https://redirect.github.com/tox-dev/filelock/pull/803)
- 🐛 fix(soft-rw): publish the head through gen/HEAD by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#799](https://redirect.github.com/tox-dev/filelock/pull/799)
- 🐛 fix(api): release thread holds, guard reentry by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#810](https://redirect.github.com/tox-dev/filelock/pull/810)
- 🧪 test(lease): give the age-out test a real-time margin by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#814](https://redirect.github.com/tox-dev/filelock/pull/814)
- 📝 docs: point canonical and og:url at versioned pages by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#813](https://redirect.github.com/tox-dev/filelock/pull/813)
- 🐛 fix(read-write): refuse a database moved mid-acquire by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#808](https://redirect.github.com/tox-dev/filelock/pull/808)
- 🐛 fix: close regressions since 4.0.12 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#815](https://redirect.github.com/tox-dev/filelock/pull/815)

#### New Contributors

- [@&#8203;darrenhuai](https://redirect.github.com/darrenhuai) made
their first contribution in
[tox-dev/filelock#779](https://redirect.github.com/tox-dev/filelock/pull/779)
-
[@&#8203;harbinresearcher](https://redirect.github.com/harbinresearcher)
made their first contribution in
[tox-dev/filelock#775](https://redirect.github.com/tox-dev/filelock/pull/775)
-
[@&#8203;sricharanreddycheruku](https://redirect.github.com/sricharanreddycheruku)
made their first contribution in
[tox-dev/filelock#802](https://redirect.github.com/tox-dev/filelock/pull/802)

**Full Changelog**:
<tox-dev/filelock@4.0.12...4.1.0>

###
[`v4.0.12`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.12)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.11...4.0.12)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.12 -->

#### What's Changed

- fix: support older SQLite read locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#771](https://redirect.github.com/tox-dev/filelock/pull/771)

**Full Changelog**:
<tox-dev/filelock@4.0.11...4.0.12>

###
[`v4.0.11`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.11)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.10...4.0.11)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.11 -->

#### What's Changed

- docs: select an existing tox environment in contributing guide by
[@&#8203;raghav-sharma-ai](https://redirect.github.com/raghav-sharma-ai)
in
[tox-dev/filelock#767](https://redirect.github.com/tox-dev/filelock/pull/767)
- fix(read-write): handle NetBSD fd limits by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#768](https://redirect.github.com/tox-dev/filelock/pull/768)

#### New Contributors

-
[@&#8203;raghav-sharma-ai](https://redirect.github.com/raghav-sharma-ai)
made their first contribution in
[tox-dev/filelock#767](https://redirect.github.com/tox-dev/filelock/pull/767)

**Full Changelog**:
<tox-dev/filelock@4.0.10...4.0.11>

###
[`v4.0.10`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.10)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.9...4.0.10)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.10 -->

#### What's Changed

- ♻️ refactor(util): test helpers via public locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#764](https://redirect.github.com/tox-dev/filelock/pull/764)
- 🐛 fix(singleton): reject conflicting async and lease options by
[@&#8203;kokotatan](https://redirect.github.com/kokotatan) in
[tox-dev/filelock#765](https://redirect.github.com/tox-dev/filelock/pull/765)

#### New Contributors

- [@&#8203;kokotatan](https://redirect.github.com/kokotatan) made their
first contribution in
[tox-dev/filelock#765](https://redirect.github.com/tox-dev/filelock/pull/765)

**Full Changelog**:
<tox-dev/filelock@4.0.9...4.0.10>

###
[`v4.0.9`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.9)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.8...4.0.9)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.9 -->

#### What's Changed

- 📝 docs(util): correct write and break guarantees by
[@&#8203;pralav-25](https://redirect.github.com/pralav-25) in
[tox-dev/filelock#762](https://redirect.github.com/tox-dev/filelock/pull/762)
- 🐛 fix(read-write): close db fd after connect by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#763](https://redirect.github.com/tox-dev/filelock/pull/763)

#### New Contributors

- [@&#8203;pralav-25](https://redirect.github.com/pralav-25) made their
first contribution in
[tox-dev/filelock#762](https://redirect.github.com/tox-dev/filelock/pull/762)

**Full Changelog**:
<tox-dev/filelock@4.0.8...4.0.9>

###
[`v4.0.8`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.8)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.7...4.0.8)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.8 -->

#### What's Changed

- 🐛 fix(read-write): refuse cross-thread write release by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#761](https://redirect.github.com/tox-dev/filelock/pull/761)

**Full Changelog**:
<tox-dev/filelock@4.0.7...4.0.8>

###
[`v4.0.7`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.7)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.6...4.0.7)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.7 -->

#### What's Changed

- 🐛 fix(mode): require owner read and write by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#760](https://redirect.github.com/tox-dev/filelock/pull/760)

**Full Changelog**:
<tox-dev/filelock@4.0.6...4.0.7>

###
[`v4.0.6`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.6)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.5...4.0.6)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.6 -->

#### What's Changed

- fix(read-write): validate reentrant timeouts by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#756](https://redirect.github.com/tox-dev/filelock/pull/756)

**Full Changelog**:
<tox-dev/filelock@4.0.5...4.0.6>

###
[`v4.0.5`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.5)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.4...4.0.5)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.5 -->

#### What's Changed

- fix(marker): preserve live owners by
[@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX) in
[tox-dev/filelock#751](https://redirect.github.com/tox-dev/filelock/pull/751)
- fix(tests): separate mode and access checks by
[@&#8203;pasmud](https://redirect.github.com/pasmud) in
[tox-dev/filelock#753](https://redirect.github.com/tox-dev/filelock/pull/753)
- fix(read-write): honor instance defaults by
[@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX) in
[tox-dev/filelock#752](https://redirect.github.com/tox-dev/filelock/pull/752)
- fix(async): validate blocking read-write timeouts by
[@&#8203;pasmud](https://redirect.github.com/pasmud) in
[tox-dev/filelock#755](https://redirect.github.com/tox-dev/filelock/pull/755)
- fix(strict): handle vanished unreadable claims by
[@&#8203;januththedev](https://redirect.github.com/januththedev) in
[tox-dev/filelock#754](https://redirect.github.com/tox-dev/filelock/pull/754)

#### New Contributors

- [@&#8203;DawnofGenX](https://redirect.github.com/DawnofGenX) made
their first contribution in
[tox-dev/filelock#751](https://redirect.github.com/tox-dev/filelock/pull/751)
- [@&#8203;pasmud](https://redirect.github.com/pasmud) made their first
contribution in
[tox-dev/filelock#753](https://redirect.github.com/tox-dev/filelock/pull/753)
- [@&#8203;januththedev](https://redirect.github.com/januththedev) made
their first contribution in
[tox-dev/filelock#754](https://redirect.github.com/tox-dev/filelock/pull/754)

**Full Changelog**:
<tox-dev/filelock@4.0.4...4.0.5>

###
[`v4.0.4`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.4)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.3...4.0.4)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.4 -->

#### What's Changed

- 🐛 fix(identity): digest the cut tail of long hostnames by
[@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) in
[tox-dev/filelock#748](https://redirect.github.com/tox-dev/filelock/pull/748)

#### New Contributors

- [@&#8203;feiiiiii5](https://redirect.github.com/feiiiiii5) made their
first contribution in
[tox-dev/filelock#748](https://redirect.github.com/tox-dev/filelock/pull/748)

**Full Changelog**:
<tox-dev/filelock@4.0.3...4.0.4>

###
[`v4.0.3`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.3)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.2...4.0.3)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.3 -->

#### What's Changed

- 🐛 fix(api): skip the fork audit hook on CPython <3.12 by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#747](https://redirect.github.com/tox-dev/filelock/pull/747)

**Full Changelog**:
<tox-dev/filelock@4.0.2...4.0.3>

###
[`v4.0.2`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.2)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.1...4.0.2)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.2 -->

#### What's Changed

- docs: create the data directory in the async cache example by
[@&#8203;agammann](https://redirect.github.com/agammann) in
[tox-dev/filelock#740](https://redirect.github.com/tox-dev/filelock/pull/740)
- fix: ignore broken sphinx-llm release by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#742](https://redirect.github.com/tox-dev/filelock/pull/742)
- 🐛 fix(api): serialize concurrent transitions on shared locks by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#745](https://redirect.github.com/tox-dev/filelock/pull/745)
- 🐛 fix(async-rw): give each task its own hold by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#746](https://redirect.github.com/tox-dev/filelock/pull/746)

#### New Contributors

- [@&#8203;agammann](https://redirect.github.com/agammann) made their
first contribution in
[tox-dev/filelock#740](https://redirect.github.com/tox-dev/filelock/pull/740)

**Full Changelog**:
<tox-dev/filelock@4.0.1...4.0.2>

###
[`v4.0.1`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.1)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/4.0.0...4.0.1)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.1 -->

#### What's Changed

- fix: reject invalid poll_interval before sleep by
[@&#8203;Pitchfork-and-Torch](https://redirect.github.com/Pitchfork-and-Torch)
in
[tox-dev/filelock#739](https://redirect.github.com/tox-dev/filelock/pull/739)

#### New Contributors

-
[@&#8203;Pitchfork-and-Torch](https://redirect.github.com/Pitchfork-and-Torch)
made their first contribution in
[tox-dev/filelock#739](https://redirect.github.com/tox-dev/filelock/pull/739)

**Full Changelog**:
<tox-dev/filelock@4.0.0...4.0.1>

###
[`v4.0.0`](https://redirect.github.com/tox-dev/filelock/releases/tag/4.0.0)

[Compare
Source](https://redirect.github.com/tox-dev/py-filelock/compare/3.32.7...4.0.0)

<!-- Release notes generated using configuration in .github/release.yaml
at 4.0.0 -->

#### What's Changed

- 🐛 fix(soft-rw): replace the state mutex with a generation log by
[@&#8203;gaborbernat](https://redirect.github.com/gaborbernat) in
[tox-dev/filelock#738](https://redirect.github.com/tox-dev/filelock/pull/738)

**Full Changelog**:
<tox-dev/filelock@3.32.7...4.0.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/googleapis/google-cloud-python).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNTUuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjE1Ni4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant