Repository navigation
v0.15.0
Changed (performance)
update on the shared maps no longer registers an epoch reader per call. SyncExpanseMap::update, SyncExpanseStrMap::update, SyncExpanseBytesMap::update (#1570) and SyncExpanseBlobMap::update (#1579) take their first read through the thread's cached writer reader instead of registering and dropping a reader on every call. On the reference host (i9-12900F, 8 writer threads), update throughput against the previous build: 23.9× (map), 10.5× (str), 15.3× (bytes), 3.7× (blob) (docs/benchmarks/concurrency/METHODOLOGY.md §40.9 and §41.9; the §40.9 pair is labelled INTERMEDIATE because a void rule was amended after its first run). Instruction counts: sync_*_update_rmw −21.4% (map), −10.8% (str), −12.5% (bytes), −11.5% (blob); no other arm moved above the 0.1% review threshold.
A compaction's retired arena no longer lands on one insert (#1581). After a SyncExpanseBlobMap compaction, the whole retired chunk set used to be freed by a single later insert. An epoch advance now frees at most 64 MiB of retired arena chunks per call and carries the rest to later advances. On the reference host at 200,000 live 128-byte values, the largest insert that ran no compaction fell from 28.9 ms [26.3, 29.1] to 2.05 ms [2.00, 2.12] (median over 5 rounds, BCa 95%); peak heap is unchanged within 12 KB of 1.1 GB (METHODOLOGY §42.9). The cost is below 0.1% on every instruction arm (worst sync_set_churn/random +0.0997%).
Compatibility
- Public Rust API: unchanged (
.github/public-api/diffv0.14.0..mainis empty). include/Judy.handinclude/expanse.h: unchanged.- Binary image format: unchanged (version 2).
Release pipeline
verify-registries now probes the Homebrew tap and waits for its publish job (#1576). Workflow pip installs build with the hash-pinned build backend, and every workflow declares minimal token permissions, both enforced in CI (#1577).
What's Changed
Other Changes
- fix(bench): sum with math.fsum in the BCa bootstrap so intervals match across Python versions by @orieg in #1573
- bench(blob): Callgrind arm for SyncExpanseBlobMap::update by @orieg in #1571
- test(sync): record the blob update coverage cases before the random schedule by @orieg in #1572
- test(sync): bound the batch cursor scan linearizability history by @orieg in #1574
- perf(sync): update reads through the thread's cached writer reader (Refs #1417) by @orieg in #1570
- ci(release): Homebrew tap probe in verify-registries and publish-command lint (Refs #1425) by @orieg in #1576
- ci(scorecard): hashed build backend for local pip installs and token-scope lint (Refs #1458) by @orieg in #1577
- test(blob): attribute the free of a compaction's retired chunk set by @orieg in #1578
- bench(blob): Callgrind arm for the free of a compaction's retired chunk set (Refs #1481) by @orieg in #1580
- perf(sync): blob map update reads through the thread's cached writer reader (Refs #1575) by @orieg in #1579
- fix(occ): bound the per-advance free of a compaction's retired chunk set (Refs #1481) by @orieg in #1581
- chore(release): 0.15.0 by @orieg in #1582
Full Changelog: v0.14.0...v0.15.0