diff options
author | Andrew Morgan <andrewm@element.io> | 2022-10-11 18:55:15 +0100 |
---|---|---|
committer | Andrew Morgan <andrewm@element.io> | 2022-10-12 18:14:37 +0100 |
commit | 46f5f30c157f218fff45d4fcece64b18bfc884c7 (patch) | |
tree | 08d1cde5656317be715474617b1d96a7ac096dd9 | |
parent | Remove the groups config code. (#14142) (diff) | |
download | synapse-46f5f30c157f218fff45d4fcece64b18bfc884c7.tar.xz |
Remove _get_events_cache check from _have_seen_events_dict
Checking this cache is currently an invalid assumption, as the _get_event_cache is not correctly invalidated when purging events from a room. Remove this optimisation for now as its causing more harm than good. We can re-add it after fixing _get_event_cache.
-rw-r--r-- | synapse/storage/databases/main/events_worker.py | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/synapse/storage/databases/main/events_worker.py b/synapse/storage/databases/main/events_worker.py index 7cdc9fe98f..07ffb1dfd1 100644 --- a/synapse/storage/databases/main/events_worker.py +++ b/synapse/storage/databases/main/events_worker.py @@ -1495,21 +1495,15 @@ class EventsWorkerStore(SQLBaseStore): Returns: a dict {event_id -> bool} """ - # if the event cache contains the event, obviously we've seen it. - - cache_results = { - event_id - for event_id in event_ids - if await self._get_event_cache.contains((event_id,)) - } - results = dict.fromkeys(cache_results, True) - remaining = [ - event_id for event_id in event_ids if event_id not in cache_results - ] - if not remaining: - return results + # TODO: We used to query the _get_event_cache here as a fast-path before + # hitting the database. For if an event were in the cache, we've presumably + # seen it before. + # + # But this is currently an invalid assumption due to the _get_event_cache + # not being invalidated when purging events from a room. The optimisation can + # be re-added after https://github.com/matrix-org/synapse/issues/13476 - def have_seen_events_txn(txn: LoggingTransaction) -> None: + def have_seen_events_txn(txn: LoggingTransaction) -> Dict[str, bool]: # we deliberately do *not* query the database for room_id, to make the # query an index-only lookup on `events_event_id_key`. # @@ -1517,16 +1511,17 @@ class EventsWorkerStore(SQLBaseStore): sql = "SELECT event_id FROM events AS e WHERE " clause, args = make_in_list_sql_clause( - txn.database_engine, "e.event_id", remaining + txn.database_engine, "e.event_id", event_ids ) txn.execute(sql + clause, args) found_events = {eid for eid, in txn} # ... and then we can update the results for each key - results.update({eid: (eid in found_events) for eid in remaining}) + return {eid: (eid in found_events) for eid in event_ids} - await self.db_pool.runInteraction("have_seen_events", have_seen_events_txn) - return results + return await self.db_pool.runInteraction( + "have_seen_events", have_seen_events_txn + ) @cached(max_entries=100000, tree=True) async def have_seen_event(self, room_id: str, event_id: str) -> bool: |