From 5cb7135a9f3c8efa21972a72b7acfcc4e6343cca Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 4 Mar 2026 11:07:25 +0100 Subject: [PATCH 1/2] Avoid re-computing the event ID when cloning events. --- synapse/events/utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/synapse/events/utils.py b/synapse/events/utils.py index b79a68f589a..1bf4d632c00 100644 --- a/synapse/events/utils.py +++ b/synapse/events/utils.py @@ -48,7 +48,7 @@ from synapse.logging.opentracing import SynapseTags, set_tag, trace from synapse.types import JsonDict, Requester -from . import EventBase, StrippedStateEvent, make_event_from_dict +from . import EventBase, FrozenEventV2, StrippedStateEvent, make_event_from_dict if TYPE_CHECKING: from synapse.handlers.relations import BundledAggregations @@ -109,6 +109,14 @@ def clone_event(event: EventBase) -> EventBase: event.get_dict(), event.room_version, event.internal_metadata.get_dict() ) + # Starting FrozenEventV2, the event ID is an (expensive) hash of the event. This is + # lazily computed when we get the FrozenEventV2.event_id property, then cached in + # _event_id field. Later FrozenEvent formats all inherit from FrozenEventV2, so we + # can use the same logic here. + if isinstance(event, FrozenEventV2) and isinstance(new_event, FrozenEventV2): + # If we already pre-computed the event ID, use it. + new_event._event_id = event._event_id + # Copy the bits of `internal_metadata` that aren't returned by `get_dict`. new_event.internal_metadata.stream_ordering = ( event.internal_metadata.stream_ordering From 57508885707b23e64bc2c04ccf5c1bbe9dc591f4 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Wed, 4 Mar 2026 11:36:48 +0100 Subject: [PATCH 2/2] Newsfile --- changelog.d/19527.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/19527.misc diff --git a/changelog.d/19527.misc b/changelog.d/19527.misc new file mode 100644 index 00000000000..c349af286b1 --- /dev/null +++ b/changelog.d/19527.misc @@ -0,0 +1 @@ +Avoid re-computing the event ID when cloning events.