Repository navigation
v0.13.0
Fixed
- Locked cursor scans on the shared string map could end early and omit keys (#1454, #1473).
SyncExpanseStrMap::with_lockedwithcursor,cursor_at_or_afterandcursor_prefix, and the ordered bytes map cursors that wrap them, stopped at a node that a concurrentremovehad emptied and left linked until its prune, so the keys after it were not returned. The cursor now steps past such a node. Affected releases: the cursor is reachable throughwith_locked_mutfrom 0.7.0, throughwith_lockedfrom 0.9.0, and through the ordered bytes map from 0.11.0. A single-threadedExpanseStrMapnever holds such a node and is not affected. A test parks the prefix cursor at a linked empty child (#1523).
Added
- Validated ordered reads on the shared set (#1504):
first,last,next_at_or_after,next_after,prev_at_or_beforeandprev_beforeonSetReader,OwnedSetReaderandDetachedSetReader, each returningOption<u64>. Each is one optimistic read with a locked fallback, the same walk the shared map's readers use. - Owned and detached blob readers (#1520):
SyncExpanseBlobMap::owned_readeranddetached_reader(OwnedBlobReader,DetachedBlobReader:get,get_meta,contains,get_into), andBlobReader::get_into, which copies a value into a caller-supplied buffer and returnsBlobBufferTooSmall(with the required and provided sizes) when the buffer is short. Both reader types areSendand notSync. SyncExpanseBlobMap::mem_used_estimate(#1521): a memory figure that does not block on the writer.- C API, 32-bit builds only (#1513):
expanse_sync32_map_writer_compare_exchange,expanse_sync32_map_writer_updateandexpanse_sync32_map_writer_get_or_insert, with the callback typeexpanse_sync32_map_update_fn, declared in the narrow-surface block ofexpanse.h.Judy.his unchanged.
Changed
SyncExpanseBytesMap::compare_exchangeremoving the last entry of a bucket is optimistic (#1515). It no longer takes the serialised writer fallback; a value mismatch under the lock leaves the entry in place and returnsErr(Some(current))as before.
Breaking changes
occ_statsarray widths (#1504).occ_stats::NAMESchanges from[&str; 52]to[&str; 67]andocc_stats::snapshot()from[u64; 52]to[u64; 67].Statgains the variantsOrderedVisitRootLeaf = 52throughOrderedReadSetHwm = 66(OrderedVisitImmed,OrderedVisitImmedFull,OrderedVisitLeaf1toOrderedVisitLeaf7,OrderedVisitLeafNarrow,OrderedVisitBitmapLeaf,OrderedVisitBitmapLeafNarrow,OrderedVisitFullExpanse).Statis#[non_exhaustive], so a match with a wildcard arm still compiles. Code that names the array length must change it.
No other public signature changed or was removed; every other change in the public API listing is an addition. The C API gains the three 32-bit functions above and nothing else.
What's Changed
Other Changes
- ci(bench): give the live writer-scaling ablation inverses a working flag (Refs #1456) by @orieg in #1471
- docs(ci): state the features the loom job enables (Refs #1457) by @orieg in #1472
- fix(strmap): StrCursor steps past a linked empty child (Refs #1454) by @orieg in #1473
- ci(deps): add Dependabot for GitHub Actions (Refs #1458) by @orieg in #1475
- docs(security): link the private reporting form in SECURITY.md (Refs #1458) by @orieg in #1476
- ci(subsplit): scope contents: write to the job that pushes (Refs #1458) by @orieg in #1477
- ci: pin every workflow action to a commit SHA and lint it (Refs #1458) by @orieg in #1484
- bench(instructions): draw keys32 random_sorted from the random generator (Refs #1455) by @orieg in #1474
- ci(nightly): install an exact wasm-pack version and lint it (Refs #1458) by @orieg in #1487
- docs(bench): D2 errata A5, a reachable host condition registered before new data (Refs #1096) by @orieg in #1483
- docs(bench): pre-register validated ordered reads on the shared set (Refs #1194 #900) by @orieg in #1482
- bench(patricia): enforce the A5 host condition and record the guard summary in the artifact (Refs #1096) by @orieg in #1488
- ci: install Python tools from hashed requirements files and lint it (Refs #1458) by @orieg in #1489
- bench(sync): add tiny-set ordered-read Callgrind arms on the locked route (Refs #1194 #900) by @orieg in #1490
- docs(bench): correct §36 on which trees Miri can see node over-reads in (Refs #1194) by @orieg in #1493
- ci(release): publish only the marked notes section of the release PR and refuse release mechanics (Refs #1372) by @orieg in #1494
- bench(concurrency): wire the set ordered-readers suite and its verdict function (Refs #1194 #900) by @orieg in #1495
- docs(bench): §36 clarifications registered before data (Refs #1194) by @orieg in #1496
- test(alloc): serve exact-size nodes under Miri so node over-reads are visible (Refs #1194) by @orieg in #1491
- docs(bench): §36 amendment from the PR A implementation (Refs #1194) by @orieg in #1499
- test(sync): turn the set ordered-walk site ledger into tests (Refs #1194 #900) by @orieg in #1497
- bench(patricia): D2 under A5 is FAIL on D2b; record both dispatches (Refs #1096) by @orieg in #1501
- bench(host-guard): refuse to start a huge-page suite when the host cannot supply 2 MiB pages (Refs #1096) by @orieg in #1500
- test(sync): pin the sample order of the set ordered walk and model its terminals (Refs #1194 #900) by @orieg in #1498
- ci(deps): hold pytest majors and wasmtime back from Dependabot (Refs #1458) by @orieg in #1502
- ci: select a changed job's prerequisites with it so the gate floor holds on action-only updates by @orieg in #1505
- docs(bench): §36 amendment from the engine PR, registered before data (Refs #1194) by @orieg in #1506
- bench(concurrency): record the host guard in the set ordered-readers artifact (Refs #1194) by @orieg in #1507
- docs(bench): pre-register the spin-wait experiment (Refs #1479) by @orieg in #1508
- ci(deps): keep python-bindings installable on every tested Python under Dependabot recompiles (Refs #1458) by @orieg in #1509
- docs(bench): pre-register §38 for 32-bit set ordered reads on SyncExpanseSet32 (Refs #1194) by @orieg in #1514
- ci(deps): fixed pytest for Python 3.10+ jobs, a separate pinned set for the 3.8 row (Refs #1458) by @orieg in #1517
- fix(bench): generate Patricia D2 sections from artifacts and check in CI by @orieg in #1516
- feat(capi): add 32-bit map writer compare_exchange, update, and get_or_insert (Refs #1194) by @orieg in #1513
- test(sync): pace concurrent compact writers on progress and recover poisoned SUITE_LOCK (Closes #1480) by @orieg in #1512
- perf(sync): optimistic compare-and-remove of a bucket's last entry on SyncExpanseBytesMap (Closes #1396) by @orieg in #1515
- ci(deps): bump orieg/discipline to v0.20.1 by @orieg in #1522
- feat(sync): validated ordered reads on SetReader, OwnedSetReader and DetachedSetReader (Refs #1194 #900) by @orieg in #1504
- test(sync): park StrPrefixCursor at a linked empty child (Refs #1454) by @orieg in #1523
- ci: give the workspace test job a longer time limit by @orieg in #1525
- feat(sync): OwnedBlobReader and DetachedBlobReader with copying reads and get_into (Refs #1194) by @orieg in #1520
- feat(sync): SyncExpanseBlobMap::mem_used_estimate, a non-blocking memory figure (Refs #1478) by @orieg in #1521
- ci: give the loom job a longer time limit by @orieg in #1527
- chore(release): 0.13.0 by @orieg in #1526
New Contributors
- @dependabot[bot] made their first contribution in #1486
Full Changelog: v0.12.0...v0.13.0