Ensure we only persist an event once at a time
This commit is contained in:
parent
06f812b95c
commit
a8a32d2714
|
@ -26,7 +26,7 @@ from synapse.api.constants import EventTypes
|
|||
from synapse.api.errors import SynapseError
|
||||
|
||||
from canonicaljson import encode_canonical_json
|
||||
from collections import deque, namedtuple
|
||||
from collections import deque, namedtuple, OrderedDict
|
||||
|
||||
import synapse
|
||||
import synapse.metrics
|
||||
|
@ -403,6 +403,23 @@ class EventsStore(SQLBaseStore):
|
|||
and the rejections table. Things reading from those table will need to check
|
||||
whether the event was rejected.
|
||||
"""
|
||||
# Ensure that we don't have the same event twice.
|
||||
# Pick the earliest non-outlier if there is one, else the earliest one.
|
||||
new_events_and_contexts = OrderedDict()
|
||||
for event, context in events_and_contexts:
|
||||
prev_event_context = new_events_and_contexts.get(event.event_id)
|
||||
if prev_event_context:
|
||||
if not event.internal_metadata.is_outlier():
|
||||
if prev_event_context[0].internal_metadata.is_outlier():
|
||||
# To ensure correct ordering we pop, as OrderedDict is
|
||||
# ordered by first insertion.
|
||||
new_events_and_contexts.pop(event.event_id, None)
|
||||
new_events_and_contexts[event.event_id] = (event, context)
|
||||
else:
|
||||
new_events_and_contexts[event.event_id] = (event, context)
|
||||
|
||||
events_and_contexts = new_events_and_contexts.values()
|
||||
|
||||
depth_updates = {}
|
||||
for event, context in events_and_contexts:
|
||||
# Remove the any existing cache entries for the event_ids
|
||||
|
|
Loading…
Reference in New Issue