mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 14:06:02 -04:00
Update get_pdu
to return the original, pristine EventBase
(#13320)
Update `get_pdu` to return the untouched, pristine `EventBase` as it was originally seen over federation (no metadata added). Previously, we returned the same `event` reference that we stored in the cache which downstream code modified in place and added metadata like setting it as an `outlier` and essentially poisoned our cache. Now we always return a copy of the `event` so the original can stay pristine in our cache and re-used for the next cache call.
Split out from https://github.com/matrix-org/synapse/pull/13205
As discussed at:
- https://github.com/matrix-org/synapse/pull/13205#discussion_r918365746
- https://github.com/matrix-org/synapse/pull/13205#discussion_r918366125
Related to https://github.com/matrix-org/synapse/issues/12584. This PR doesn't fix that issue because it hits [`get_event` which exists from the local database before it tries to `get_pdu`](7864f33e28/synapse/federation/federation_client.py (L581-L594)
).
This commit is contained in:
parent
a1b62af2af
commit
0f971ca68e
5 changed files with 232 additions and 60 deletions
|
@ -1346,9 +1346,24 @@ class PersistEventsStore:
|
|||
event_id: outlier for event_id, outlier in txn
|
||||
}
|
||||
|
||||
logger.debug(
|
||||
"_update_outliers_txn: events=%s have_persisted=%s",
|
||||
[ev.event_id for ev, _ in events_and_contexts],
|
||||
have_persisted,
|
||||
)
|
||||
|
||||
to_remove = set()
|
||||
for event, context in events_and_contexts:
|
||||
if event.event_id not in have_persisted:
|
||||
outlier_persisted = have_persisted.get(event.event_id)
|
||||
logger.debug(
|
||||
"_update_outliers_txn: event=%s outlier=%s outlier_persisted=%s",
|
||||
event.event_id,
|
||||
event.internal_metadata.is_outlier(),
|
||||
outlier_persisted,
|
||||
)
|
||||
|
||||
# Ignore events which we haven't persisted at all
|
||||
if outlier_persisted is None:
|
||||
continue
|
||||
|
||||
to_remove.add(event)
|
||||
|
@ -1358,7 +1373,6 @@ class PersistEventsStore:
|
|||
# was an outlier or not - what we have is at least as good.
|
||||
continue
|
||||
|
||||
outlier_persisted = have_persisted[event.event_id]
|
||||
if not event.internal_metadata.is_outlier() and outlier_persisted:
|
||||
# We received a copy of an event that we had already stored as
|
||||
# an outlier in the database. We now have some state at that event
|
||||
|
@ -1369,7 +1383,10 @@ class PersistEventsStore:
|
|||
# events down /sync. In general they will be historical events, so that
|
||||
# doesn't matter too much, but that is not always the case.
|
||||
|
||||
logger.info("Updating state for ex-outlier event %s", event.event_id)
|
||||
logger.info(
|
||||
"_update_outliers_txn: Updating state for ex-outlier event %s",
|
||||
event.event_id,
|
||||
)
|
||||
|
||||
# insert into event_to_state_groups.
|
||||
try:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue