mirror of
https://github.com/element-hq/synapse.git
synced 2026-11-04 17:47:28 +00:00
`EventsWorkerStore._get_event_cache` is now the Rust `EventCache` that the sync handler and state resolution read, so each event is held once. The cache keeps Rust `CachedEvent` values. Python gets them through `RustEventCache`, a `RustCache` subclass with the `AsyncLruCache` names the rest of Synapse uses, and each hit wraps the cached event in a new `Event` object. The wrapper shares the cached event's internal metadata, unsigned data and signatures, so a change Python makes, such as adding `prev_content` or flipping `outlier`, lands in the one copy the Rust readers see. Python's `_event_ref` weak map is checked before the cache, so while anything holds an event, a lookup returns that same object, as before. A hit there marks the cache entry as read, and puts the event back if it was evicted. - The cache is sized from `caches.event_cache_size` and named `*getEvent*`, so its metrics and `per_cache_factors` keep their names. The Rust loader now counts its misses too. - Invalidating an event drops its chain position as well, and a room purge drops the room's events through the room index, plus the chain cover and state group caches, as `RustStore.invalidate_event` and `clear_event_cache` did. Those two calls are gone. - `EventsWorkerStore` and `RustWorkerStore` run their `__init__` bodies in a different order in `DataStore` and `GenericWorkerStore`, as they sit differently in each MRO. So whichever runs first builds the `RustStore`. A datastore without `RustWorkerStore`, such as the port script's, gets a standalone `RustEventCache`. - The external cache stubs (`get_external`, `set_external`, `_invalidate_async_get_event_cache` and its room variant) are dropped. They were documented no-ops. - The sync shadow diff still ignores `prev_content` on state events. Python keeps the objects it holds after the cache evicts them, so a Rust reader can still load a second copy without it. Trial's cache of one event makes that routine. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VpBQxvqZTUvHCMm3u6CR7J