Skip to content

v0.26.0

Latest

Choose a tag to compare

@cachekit-release-bot cachekit-release-bot released this 10 Nov 21:01
b6f3ee0

0.26.0 (2026-11-08)

⚠ BREAKING CHANGES

  • decorators: an L1-only cache (@cache(backend=None), @cache.local(), or any plaintext, non-interop decorator that finds no backend configured) times its TTLs and its stale-while-revalidate refresh on the OS monotonic clock that the Rust extension reads, not on time.monotonic(). Patching time.monotonic (pytest's monkeypatch, freezegun's freeze_time or tick) no longer expires its entries or brings a refresh due: a test that needs an entry gone calls fn.invalidate_cache(...) or fn.cache_clear(). Caches with a backend are unchanged.

Features

  • cachekitio: report L1 hit latency and add a telemetry off switch (LAB-12079) (#691) (0cc1a9c)
  • decorators: let async @cache opt out of the miss-path distributed lock (LAB-7166) (#667) (1e2295d)

Bug Fixes

  • decorators: build an L1-only memoised key from one read of the names (LAB-12946) (#720) (7b06953)
  • decorators: clear an L1-only cache whole on invalidate-all and let the memo own the kill (LAB-12024) (#677) (5aeaa63)
  • decorators: clear every @cache.local() entry on a no-args invalidate_cache() (LAB-12618) (#714) (720a5d1)
  • decorators: drop a fill's store when an invalidation in this process overlaps it (LAB-12149) (#713) (d99bf24)
  • decorators: scope the L2 invalidation gate by tenant (LAB-12617) (#715) (a6f8f76)
  • metrics: skip thread-state retirement once the interpreter is exiting (LAB-12087) (#679) (42d7aea)
  • monitoring: make enable_prometheus_metrics=False stop recording (LAB-12038) (#681) (3d81a93)
  • perf: name the cachekit, Python and CPU a terrain recording ran (LAB-11993) (#687) (251a2fa)
  • perf: terrain canary records the L2 label without its padding (LAB-11993) (#676) (4b2c65c)
  • rust: decode StandardSerializer MessagePack in safe Rust (LAB-12250) (#694) (53bd1f3)
  • serializers: bound AutoSerializer set revival against hash floods (LAB-12954) (9e3a3e7)
  • serializers: refuse AutoSerializer datetimes that read back as another value (LAB-12972) (#723) (53591b6)

Performance Improvements

  • decorators: a backed L1 hit skips the stats context and log kwargs (LAB-12115) (#686) (9c1bd7f)
  • decorators: answer a @cache.local() hit in one lock-free HitMemo call (LAB-12916) (#718) (487d042)
  • decorators: answer the L1-only hit in one lock-free call into the extension (LAB-12024) (#673) (8b17e51)
  • deps: bump cachekit-core to 0.7.4 (LAB-12129) (#684) (9485ca8)
  • ir: make measured startup the same in every run and re-record every budget (LAB-12297) (#699) (7146959)
  • ir: run the 2,600 Ir/op paths over 300,000 calls (LAB-12245) (#697) (0e15cb6)
  • l1: auto and orjson L1 hits skip re-verification and the per-read copy (LAB-12119) (#696) (9ce58b6)
  • l1: skip the structure walk and object hook on a kept L1 entry (LAB-12023) (#671) (7fbdfbe)
  • l1: sweep expired entries from a deadline heap in short lock holds (LAB-12117) (#683) (63cf745)
  • memcached: pick the server natively, as pymemcache's rendezvous hash does (LAB-12116) (#680) (a79cc90)
  • object-cache: compact dead records a batch per store, not in one lock hold (LAB-12920) (#717) (140a078)
  • redis: an uncontended async miss waits on 3 round trips, not 5 (LAB-12118) (#682) (1ef1d05)
  • serializers: decode AutoSerializer and interop reads in Rust, bounds and decode in one pass (LAB-12917) (#719) (27dfe18)
  • serializers: decode StandardSerializer reads in Rust, bounds and decode in one pass (LAB-12030) (#674) (39b1bdf)
  • write-behind: park an idle writer thread instead of starting one per miss (LAB-12005) (#692) (96141b7)