diff --git a/synapse/storage/databases/main/cache.py b/synapse/storage/databases/main/cache.py
index c428dd5596..abd54c7dc7 100644
--- a/synapse/storage/databases/main/cache.py
+++ b/synapse/storage/databases/main/cache.py
@@ -200,6 +200,8 @@ class CacheInvalidationWorkerStore(SQLBaseStore):
self.get_relations_for_event.invalidate((relates_to,))
self.get_aggregation_groups_for_event.invalidate((relates_to,))
self.get_applicable_edit.invalidate((relates_to,))
+ self.get_thread_summary.invalidate((relates_to,))
+ self.get_thread_participated.invalidate((relates_to,))
async def invalidate_cache_and_stream(self, cache_name: str, keys: Tuple[Any, ...]):
"""Invalidates the cache and adds it to the cache stream so slaves
diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py
index ca2a9ba9d1..1dc83aa5e3 100644
--- a/synapse/storage/databases/main/events.py
+++ b/synapse/storage/databases/main/events.py
@@ -1518,7 +1518,7 @@ class PersistEventsStore:
)
# Remove from relations table.
- self._handle_redaction(txn, event.redacts)
+ self._handle_redact_relations(txn, event.redacts)
# Update the event_forward_extremities, event_backward_extremities and
# event_edges tables.
@@ -1943,15 +1943,43 @@ class PersistEventsStore:
txn.execute(sql, (batch_id,))
- def _handle_redaction(self, txn, redacted_event_id):
- """Handles receiving a redaction and checking whether we need to remove
- any redacted relations from the database.
+ def _handle_redact_relations(
+ self, txn: LoggingTransaction, redacted_event_id: str
+ ) -> None:
+ """Handles receiving a redaction and checking whether the redacted event
+ has any relations which must be removed from the database.
Args:
txn
- redacted_event_id (str): The event that was redacted.
+ redacted_event_id: The event that was redacted.
"""
+ # Fetch the current relation of the event being redacted.
+ redacted_relates_to = self.db_pool.simple_select_one_onecol_txn(
+ txn,
+ table="event_relations",
+ keyvalues={"event_id": redacted_event_id},
+ retcol="relates_to_id",
+ allow_none=True,
+ )
+ # Any relation information for the related event must be cleared.
+ if redacted_relates_to is not None:
+ self.store._invalidate_cache_and_stream(
+ txn, self.store.get_relations_for_event, (redacted_relates_to,)
+ )
+ self.store._invalidate_cache_and_stream(
+ txn, self.store.get_aggregation_groups_for_event, (redacted_relates_to,)
+ )
+ self.store._invalidate_cache_and_stream(
+ txn, self.store.get_applicable_edit, (redacted_relates_to,)
+ )
+ self.store._invalidate_cache_and_stream(
+ txn, self.store.get_thread_summary, (redacted_relates_to,)
+ )
+ self.store._invalidate_cache_and_stream(
+ txn, self.store.get_thread_participated, (redacted_relates_to,)
+ )
+
self.db_pool.simple_delete_txn(
txn, table="event_relations", keyvalues={"event_id": redacted_event_id}
)
|