Changes for version 0.14 - 2026-10-05

  • FIXES a map write dropped under contention: a store, incr or delete whose stripe was held burned 100k test-and-sets and gave up. A FreeBSD smoker counted 38 of 40 and an Alpine one 999 of 1000, in a table of 64 slots holding six keys.
  • The write path's wait escalates, 50us to 2ms over ~10ms, as the carve path's has since 0.13. Shorter than the carve path's two seconds on purpose: a store is on a per-request path.
  • A write refused for a held stripe answers SA_MAP_STORE_BUSY (-3) and counts `busy`. It answered SA_MAP_STORE_FULL before, and incremented no statistic at all, so `stats` showed a clean map while writes went missing: full means stop, busy means try again.
  • Map->delete returns undef for a refused stripe, 0 for a key that was not there. Both false, so a speculative delete is unaffected.
  • FIXES t/32-map-ttl.t asserting a count from an unmeasured window: the burst after the deadline has to fit inside the ttl it counts inside.

Modules

memory two processes can both read, without a syscall
a shared set that answers "no" exactly and "yes" probably
a shared cache that evicts instead of refusing
how often a key has been seen, in fixed space
a shared set that answers "no" exactly, "yes" probably, and can forget
one structure, published once and read in place by every process
read a published block without copying it
a distribution every process adds to at once
how many distinct, in a few kilobytes
one holder at a time, and a successor when it dies
a fixed-capacity map several processes share
a token bucket per key, shared by every worker
a record queue several processes can write at once
one reader's position in a ring
one record to one member of the pool
one row per worker, published live