All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.26.1 - 2026-03-20
0.26.0 - 2026-02-02
- Allow opt-ing out of LRU at compile time (#1051)
- Allow tracked function cycle attributes to take closures (#1048)
- Do not alias fields of
tracked_structValues when updating (#741)
- Remove unnecessary
boxcar::Vec(#1072) - replace remaining instances of
cycle_fallbackwithcycle_resultin the docs (#1071) - Fix out-of-order verification of cycle head dependencies (#1061)
- Update compile fail tests (#1070)
- Merge
FallbackImmediateandFixpointcode paths (#1063) - Introduce a
CancellationTokenfor cancelling specific computations (#1007) - Remove unnecessary backdate field macros (#1069)
- Remove
ValueWithMetadata(#1057) - Fix stale tracked struct values in later iterations (#1068)
- Skip book deployment on forks (#1066)
- Remove
QueryOriginKind::FixpointInitial(#1062) - Document cycle_fallback in the book (#1056)
- Fix book build with newer mdbook versions (#1055)
- Implement
LookupandHashEqLikeforCow(#1054) - Add
DidFinalizeCycleevent, add more tests for cyclic nested queries (#1052) - Collect cycle heads transitively (#1050)
- Remove unused database forking (#1049)
- Reduce monomorphized code in maybe_changed_after (#1047)
- Reduce monomorphized code in
execute_maybe_iterate(#1046) - Add
salsa::Updatetrait bounds to generics when derivingsalsa::Update(#1041)
0.25.2 - 2025-12-17
- Revert #958 (#1039)
0.25.1 - 2025-12-16
- Fix a remainder that was forgotten in #1036 (#1037)
0.25.0 - 2025-12-16
- Require interned structs' fields to be
Update(#1036) - Make
ordermapan optional feature (#1034) - implement
UpdateforOrderMapandOrderSet(#1033) - Fully qualify std Result type (#1025)
- pass
Cycleto the cycle recovery function (#1028) - Fix cycle head durability (#1024)
- Call
cycle_fnfor every iteration (#1021) - Track cycle function dependencies as part of the cyclic query (#1018)
- Always increment iteration count (#1017)
- Update compile fail snapshots to match new rust stable output (#1020)
- Only use provisional values from the same revision (#1019)
- Explain the motivation for breaking API changes made in #1012 and #1015 (#1016)
- Expose the Input query Id with cycle_initial (#1015)
- Add
SyncTable::peek_claimfast path forfunction::Ingredient::wait_for(#1011) - Fix cache invalidation when cycle head becomes non-head (#1014)
- Expose the query ID and the last provisional value to the cycle recovery function (#1012)
- Fix hangs in multithreaded fixpoint iteration (#1010)
- Remove experimental parallel feature (#1013)
- Simplify
WaitGroupimplementation (#958) - Fix missing license files in published macros/macro-rules crates (#1009)
- Run fixpoint per strongly connected component (#999)
- Add benchmark for a fixpoint iteration with nested cycles (#1001)
0.24.0 - 2025-09-30
- Cleanup provisional cycle head memos when query panics (#993)
- Runaway for unchanged queries participating in cycle (#981)
- Delete not re-created tracked structs after fixpoint iteration (#979)
- fix assertion during interned deserialization (#978)
- Do not unnecessarily require
Debugon fields for interned structs (#951) - Fix phantom data usage in salsa structs affecting auto traits (#932)
- Replace unsafe unwrap with
expectcall (#998) - Push active query in execute (#996)
- Update codspeed action (#997)
- Add implementations for Lookup and HashEqLike for CompactString (#988)
- Provide a method to attach a database even if it's different from the current attached one (#992)
- Allow fallback to take longer than one iteration to converge (#991)
- refactor
entriesAPI (#987) - Persistent caching fixes (#982)
- outline cold path of
lookup_ingredient(#984) - Update snapshot to fix nightly type rendering (#983)
- avoid cycles during serialization (#977)
- Flatten unserializable query dependencies (#975)
- optimize
Id::hash(#974) - Make
thin-vec/serdedependency dependent onpersistencefeature (#973) - Remove tracked structs from query outputs (#969)
- Remove jemalloc (#972)
- Initial persistent caching prototype (#967)
- Fix
maybe_changed_afterrunnaway for fixpoint queries (#961) - add parallel maybe changed after test (#963)
- Update tests for Rust 1.89 (#966)
- remove allocation lock (#962)
- consolidate memory usage information API (#964)
- Add heap size support for salsa structs (#943)
- Extract the cycle branches from
fetchandmaybe_changed_after(#955) - allow reuse of cached provisional memos within the same cycle iteration during
maybe_changed_after(#954) - Expose API to manually trigger cancellation (#959)
- Upgrade dependencies (#956)
- Use
CycleHeadSetinmaybe_update_after(#953) - Gate accumulator feature behind a feature flag (#946)
- optimize allocation fast-path (#949)
- remove borrow checks from
ZalsaLocal(#939) - Do manual trait casting (#922)
- Retain backing allocation of
ActiveQuery::input_outputsinActiveQuery::seed_iteration(#948) - remove extra bounds checks from memo table hot-paths (#938)
- Outline all tracing events (#942)
- remove bounds and type checks from
IngredientCache(#937) - Avoid dynamic dispatch to access memo tables (#941)
- optimize page access (#940)
- Use
inventoryfor static ingredient registration (#934) - Fix
heap_sizeoption not being preserved in tracked impls (#930) - update papaya (#928)
0.23.0 - 2025-06-27
Updatederive field overwrite support (#747)
- Emit self ty for query debug name of assoc function queries (#927)
- Replace ingredient cache with faster ingredient map (#921)
- add option to track heap memory usage of memos (#925)
- Hide generated structs of tracked functions from docs via
#[doc(hidden)](#917) - Add API to dump memory usage (#916)
- Revert "Assert size for interned Value" & Mark
Slottrait as unsafe (#915) - add an option to tune interned garbage collection (#911)
- Use explicit discriminants for
QueryOriginKindfor better comparisons (#913) - update boxcar (#910)
- use latest revision for dependencies on interned values (#908)
- remove high-durability values from interned LRU (#907)
- Preserve attributes on interned/tracked struct fields (#905)
- Assert size for interned
Value(#901) - reduce size of interned value metadata (#903)
- panic with string message again for cycle panics (#898)
- Use
RevisionandDurabilitydirectly in inputValue(#902) - Fix flaky parallel_join test (#900)
- Bump MSRV to 1.85 (#899)
- Simple LRU garbage collection for interned values (#839)
- Capture execution backtrace when throwing
UnexpectedCycle(#883) - Store tracked struct ids as ThinVec on Revisions (#892)
- Update dependencies, remove unused
heckdependency (#894) - Set
validate_finalinexecuteafter removing the last cycle head (#890) - Pack
QueryEdgememory layout (#886) - Lazily allocate extra memo state (#888)
- Pack
QueryOriginmemory layout (#885) - Restrict memo size assertion to 64bit platforms (#884)
- Don't report stale outputs if there is newer generation in new_outputs (#879)
- Fix hang in nested fixpoint iteration (#871)
- Add debug spans for
new_revisionandevict_lru(#881) - Add fetch span (#875)
- shrink_to_fit
IdentityMapbefore storing it (#816) - Allow lifetimes in arguments in tracked fns with >1 parameters (#880)
- Replace loom with shuttle (#876)
- Use generational identifiers for tracked structs (#864)
#[doc(hidden)]auto-generated tracked-fn structs (#917)
0.22.0 - 2025-05-23
- fix memo table growth condition (#850)
- incorrect caching for queries participating in fixpoint (#843)
- change detection for fixpoint queries (#836)
- Allow creation of tracked associated functions (without
self) (#859) - Short-circuit
block-onif same thread (#862) - Skip release-plz jobs on forks (#873)
- Unwind with specific type when encountering an unexpected cycle (#856)
- Remove jar mentions from book (#775)
- Implement an
!Updatebound escape hatch for tracked fn (#867) - Only enable
boxcar/loomwhenloomfeature is enabled (#869) - Remove default
PartialOrdandOrdderives for salsa-structs (#868) - update boxcar (#865)
- speed-up cycle-retry logic (#861)
- Fix returns(deref | as_ref | as_deref) in tracked methods (#857)
- Changed
return_refsyntax toreturns(as_ref)andreturns(cloned)(#772) - Work around a rust-analyzer bug (#855)
- Lazy finalization of cycle participants in
maybe_changed_after(#854) - Do not re-verify already verified memoized value in cycle verification (#851)
- Pass cycle heads as out parameter for
maybe_changed_after(#852) - Move salsa event system into
Zalsa(#849) - gate loom dependency under feature flag (#844)
- Add loom support (#842)
- Clean up some unsafety (#830)
0.21.1 - 2025-04-30
- Make
attachpub (#832)
- better debug name for interned query arguments (#837)
- Avoid panic in
Backtrace::captureifquery_stackis already borrowed (#835) - Clean up
function::execute(#833) - Change an
assert!toassert_eq!(#828)
0.21.0 - 2025-04-29
- Access to tracked-struct that was freed during fixpoint (#817)
- correct debug output for tracked fields (#826)
- Fix incorrect
values_equalsignature (#825) - allow unused lifetimes in tracked_struct expansion (#824)
- Implement a query stack
Backtraceanalog (#827) - Simplify ID conversions (#822)
- Attempt to fix codspeed (#823)
- Remove unnecessary
Arrayabstraction (#821) - Add a compile-fail test for a
'static!Updatestruct (#820) - squelch most clippy warnings in generated code (#809)
- Include struct name in formatted input-field index (#819)
- Force inline
fetch_hot(#818) - Per ingredient sync table (#650)
- Use
DatabaseKeyfor interned events (#813) - [refactor] More
fetch_hotsimplification (#793) - Don't store the fields in the interned map (#812)
- Fix ci not always running (#810)
0.20.0 - 2025-04-22
- Drop
Debugrequirements and flip implementation defaults (#756)
- Dereferencing freed memos when verifying provisional memos (#788)
#[doc(hidden)]plumbingmodule (#781)- Use
changed_atrevision when updating fields (#778)
- Reduce memory usage by deduplicating type information (#803)
- Make interned's
last_interned_atequalRevision::MAXif they are interned outside a query (#804) - Add a third cycle mode, equivalent to old Salsa cycle behavior (#801)
- Update compact_str from 0.8 to 0.9 (#794)
- Implement
UpdateforThinVec(#807) - Don't push an unnecessary active query for
deep_verify_memo(#806) - Inline/Outline more cold and slow paths (#805)
#[inline]some things (#799)- Discard unnecessary atomic load (#780)
- Print query stack when encountering unexpected cycle (#796)
- Remove incorrect
parallel_scopeAPI (#797) - [refactor] Simplify
fetch_hot(#792) - [refactor] Reuse the same stack for all cycles heads in
validate_same_iteration(#791) - add WillIterateCycle event (#790)
- [fix] Use
validate_maybe_provisionalinstead ofvalidate_provisional(#789) - Use
ThinVecforCycleHeads(#787) - Keep edge condvar on stack instead of allocating it in an
Arc(#773) - allow reuse of cached provisional memos within the same cycle iteration (#786)
- Implement
Lookup/HashEqLikeforArc(#784) - Normalize imports style (#779)
- Clean up
par_mapa bit (#742) - Fix typo in comment (#777)
- Document most safety blocks (#776)
- Use html directory for mdbook artifact (#774)
- Move
verified_finalfromMemointoQueryRevisions(#769) - Use
ThinVecforMemoTable, halving its size (#770) - Remove unnecessary query stack acess in
block_on(#771) - Replace memo queue with append-only vector (#767)
- update boxcar (#696)
- Remove extra page indirection in
Table(#710) - update release steps (#705)
- Remove some unnecessary panicking paths in cycle execution (#765)
- (perf) Pool
ActiveQuerysin the query stack (#629) - Resolve unwind safety fixme (#761)
- Enable Garbage Collection for Interned Values (#602)
- bug [salsa-macros]: Improve debug name of tracked methods (#755)
- Remove dead code (#764)
- Reduce unnecessary conditional work in
deep_verify_memo(#759) - Use a
VecforCycleHeads(#760) - Use nextest for miri test runs (#758)
- Pin
halfversion to prevent CI failure (#757) - rewrite cycle handling to support fixed-point iteration (#603)
0.19.0 - 2025-03-10
- fix typo
- fix enums bug
- Have salsa not depend on salsa-macros (#750)
- Group versions of packages together for releases (#751)
- use
portable-atomicinIngredientCacheto compile onpowerpc-unknown-linux-gnu(#749) - Store view downcaster in function ingredients directly (#720)
- Some small perf things (#744)
- :replace instead of std::mem::replace (#746)
- Cleanup
Cargo.tomls (#745) - Drop clone requirement for accumulated values
- implement
Updatetrait forIndexMap, andIndexSet - more correct bounds on
SendandSyncimplementationDeletedEntries - replace
arc-swapwith manualAtomicPtr - Remove unnecessary
current_revisioncall fromsetup_interned_struct - Merge pull request #731 from Veykril/veykril/push-nzkwqzxxkxou
- Remove some dynamically dispatched
Database::eventcalls - Lazy fetching
- Add small supertype input benchmark
- Replace a
DashMapwithRwLockas writing is rare for it - address review comments
- Skip memo ingredient index mapping for non enum tracked functions
- Trade off a bit of memory for more speed in
MemoIngredientIndices - Introduce Salsa enums
- Cancel duplicate test workflow runs
- implement
Updatetrait forhashbrown::HashMap - Move
unwind_if_revision_cancelledfromZalsaLocaltoZalsa - Don't clone strings in benchmarks
- Merge pull request #714 from Veykril/veykril/push-synxntlkqqsq
- Merge pull request #711 from Veykril/veykril/push-stmmwmtprovt
- Merge pull request #715 from Veykril/veykril/push-plwpsqknwulq
- Enforce
unsafe_op_in_unsafe_fn - Remove some
ZalsaDatabase::zalsacalls - Remove outdated FIXME
- Replace
IngredientCachelock with atomic primitive - Reduce method delegation duplication
- Automatically clear the cancellation flag when cancellation completes
- Allow trigger LRU eviction without increasing the current revision
- Simplify
Ingredient::reset_for_new_revisionsetup - Require mut Zalsa access for setting the lru limit
- Split off revision bumping from
zalsa_mutaccess - Update
hashbrown(0.15) andhashlink(0.10)