mirror of
https://github.com/element-hq/synapse.git
synced 2026-11-05 15:27:36 +00:00
Moving database functions into Rust means moving their caches too: almost every hot DB function in Synapse is wrapped in `@cached`, and porting one without its cache trades a Python call for a database round trip. `Cache<K, V>` is a bounded LRU that Rust code can read without the GIL. Concurrent misses for one key share a single load, with a guard against the case that makes that dangerous: a key invalidated while its load is in flight must not be populated with what the load returns, or the cache holds a stale entry that nothing will ever evict. Failures are never cached, and a load that is dropped or panics hands the key to the next caller rather than wedging it. Every eviction path returns the removed values for the caller to drop with the lock released. Nothing needs that yet, since every value so far is plain data, but the stated direction is to back Python's `LruCache` with this container, and a `Py<PyAny>` value cannot be dropped under a lock that tokio readers take without the GIL. Entries are stamped from the Rust clock (#20294). The parts of the cache that depend on the time take it as an argument, so the tests can use explicit timestamps and never pin the process-wide virtual clock, which `cargo test` runs them in parallel against. Nothing uses the cache yet. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>