• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

aio-libs / multidict / 37112485399
86%

Build:
DEFAULT BRANCH: master
Ran 03 Oct 2026 09:17AM UTC
Jobs 1
Files 49
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

03 Oct 2026 09:16AM UTC coverage: 85.945% (+0.02%) from 85.928%
37112485399

push

github

web-flow
Make the local and CI TSan runs reliable (#1655)

<!-- Thank you for your contribution! -->

## What do these changes do?

Makes ThreadSanitizer runs, local and in CI, fail only on real races.

A local run of the TSan command from `AGENTS.md` reported 87 races and
failed two tests. All 87 came from pytest's `faulthandler_timeout`
watchdog dumping the tracebacks of running threads, a read CPython does
without a lock. The watchdog fired because the command left coverage on
(`pytest.ini` adds `--cov`), which made the run about eight times slower
than CI's: 3570 s against 449 s. The same slowdown pushed
`test_pure_python_reciprocal_view_ops_no_deadlock` and
`test_pure_python_reciprocal_raw_iterator_ops_no_deadlock` past their
fixed 20 s join timeout without any deadlock. CI's own run is closer to
the edge than it looks: its slowest test takes 62.6 s against the 90 s
watchdog, and the reciprocal test 13.0 s against its 20 s timeout.

- `tools/tsan_suppressions.txt` suppresses the watchdog's reports,
`race:faulthandler_thread`, and says what an entry needs to qualify. The
CI job and the documented command use it.
- The documented command passes `--no-cov`, with a note on why.
- The two deadlock tests join their workers until the workers stop
advancing a shared counter for 20 s, so a deadlock still fails within 20
s and a slow build just waits longer.
- `test_no_refleak_on_memory_error`'s retry loop no longer has an `elif`
arm that only 3.10 reaches (a call that succeeds before any injected
failure), which left a partial branch on 3.14; it now takes the same
branches on every version.

## Are there changes in behavior for the user?

No; tests, CI and contributor docs only.

## Is it a substantial burden for the maintainers to support this?

No. The suppressions file holds one entry, scoped to the watchdog
thread.

## Related issue number

N/A

## Checklist

- [x] I think the code is well written
- [x] Unit tests for the changes exist
- [x] Documentation refl... (continued)

791 of 1582 branches covered (50.0%)

Branch coverage included in aggregate %.

33 of 33 new or added lines in 2 files covered. (100.0%)

9207 of 10051 relevant lines covered (91.6%)

1.83 hits per line

Jobs
ID Job ID Ran Files Coverage
1 MyPy - 37112485399.1 03 Oct 2026 09:17AM UTC 98
85.94
GitHub Action Run
Source Files on build 37112485399
  • Tree
  • List 49
  • Changed 4
  • Source Changed 2
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #37112485399
  • 24aedcd5 on github
  • Prev Build on master (#37110008949)
  • Next Build on master (#37112550914)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc