Skip to content

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 03:08
· 94 commits to main since this release
v0.13.0
4052162

Fixed

  • Locked cursor scans on the shared string map could end early and omit keys (#1454, #1473). SyncExpanseStrMap::with_locked with cursor, cursor_at_or_after and cursor_prefix, and the ordered bytes map cursors that wrap them, stopped at a node that a concurrent remove had 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 through with_locked_mut from 0.7.0, through with_locked from 0.9.0, and through the ordered bytes map from 0.11.0. A single-threaded ExpanseStrMap never 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_before and prev_before on SetReader, OwnedSetReader and DetachedSetReader, each returning Option<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_reader and detached_reader (OwnedBlobReader, DetachedBlobReader: get, get_meta, contains, get_into), and BlobReader::get_into, which copies a value into a caller-supplied buffer and returns BlobBufferTooSmall (with the required and provided sizes) when the buffer is short. Both reader types are Send and not Sync.
  • 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_update and expanse_sync32_map_writer_get_or_insert, with the callback type expanse_sync32_map_update_fn, declared in the narrow-surface block of expanse.h. Judy.h is unchanged.

Changed

  • SyncExpanseBytesMap::compare_exchange removing 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 returns Err(Some(current)) as before.

Breaking changes

  1. occ_stats array widths (#1504). occ_stats::NAMES changes from [&str; 52] to [&str; 67] and occ_stats::snapshot() from [u64; 52] to [u64; 67]. Stat gains the variants OrderedVisitRootLeaf = 52 through OrderedReadSetHwm = 66 (OrderedVisitImmed, OrderedVisitImmedFull, OrderedVisitLeaf1 to OrderedVisitLeaf7, OrderedVisitLeafNarrow, OrderedVisitBitmapLeaf, OrderedVisitBitmapLeafNarrow, OrderedVisitFullExpanse). Stat is #[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

Full Changelog: v0.12.0...v0.13.0