Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 92202ce

Browse files
authored
Reduce event lookups during room creation by passing known event IDs (#13210)
Inspired by the room batch handler, this uses previous event inserts to pre-populate prev events during room creation, reducing the number of queries required to create a room. Signed off by Nick @ Beeper (@Fizzadar)
1 parent 11f8114 commit 92202ce

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

changelog.d/13210.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Reduce number of events queried during room creation. Contributed by Nick @ Beeper (@fizzadar).

synapse/handlers/room.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,8 @@ async def _send_events_for_new_room(
10191019

10201020
event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""}
10211021

1022+
last_sent_event_id: Optional[str] = None
1023+
10221024
def create(etype: str, content: JsonDict, **kwargs: Any) -> JsonDict:
10231025
e = {"type": etype, "content": content}
10241026

@@ -1028,19 +1030,27 @@ def create(etype: str, content: JsonDict, **kwargs: Any) -> JsonDict:
10281030
return e
10291031

10301032
async def send(etype: str, content: JsonDict, **kwargs: Any) -> int:
1033+
nonlocal last_sent_event_id
1034+
10311035
event = create(etype, content, **kwargs)
10321036
logger.debug("Sending %s in new room", etype)
10331037
# Allow these events to be sent even if the user is shadow-banned to
10341038
# allow the room creation to complete.
10351039
(
1036-
_,
1040+
sent_event,
10371041
last_stream_id,
10381042
) = await self.event_creation_handler.create_and_send_nonmember_event(
10391043
creator,
10401044
event,
10411045
ratelimit=False,
10421046
ignore_shadow_ban=True,
1047+
# Note: we don't pass state_event_ids here because this triggers
1048+
# an additional query per event to look them up from the events table.
1049+
prev_event_ids=[last_sent_event_id] if last_sent_event_id else [],
10431050
)
1051+
1052+
last_sent_event_id = sent_event.event_id
1053+
10441054
return last_stream_id
10451055

10461056
try:
@@ -1054,15 +1064,19 @@ async def send(etype: str, content: JsonDict, **kwargs: Any) -> int:
10541064
await send(etype=EventTypes.Create, content=creation_content)
10551065

10561066
logger.debug("Sending %s in new room", EventTypes.Member)
1057-
await self.room_member_handler.update_membership(
1067+
# Room create event must exist at this point
1068+
assert last_sent_event_id is not None
1069+
member_event_id, _ = await self.room_member_handler.update_membership(
10581070
creator,
10591071
creator.user,
10601072
room_id,
10611073
"join",
10621074
ratelimit=ratelimit,
10631075
content=creator_join_profile,
10641076
new_room=True,
1077+
prev_event_ids=[last_sent_event_id],
10651078
)
1079+
last_sent_event_id = member_event_id
10661080

10671081
# We treat the power levels override specially as this needs to be one
10681082
# of the first events that get sent into a room.

tests/rest/client/test_rooms.py

+15
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,21 @@ def test_post_room_no_keys(self) -> None:
708708

709709
self.assertEqual(200, channel.code, channel.result)
710710
self.assertTrue("room_id" in channel.json_body)
711+
assert channel.resource_usage is not None
712+
self.assertEqual(33, channel.resource_usage.db_txn_count)
713+
714+
def test_post_room_initial_state(self) -> None:
715+
# POST with initial_state config key, expect new room id
716+
channel = self.make_request(
717+
"POST",
718+
"/createRoom",
719+
b'{"initial_state":[{"type": "m.bridge", "content": {}}]}',
720+
)
721+
722+
self.assertEqual(200, channel.code, channel.result)
723+
self.assertTrue("room_id" in channel.json_body)
724+
assert channel.resource_usage is not None
725+
self.assertEqual(37, channel.resource_usage.db_txn_count)
711726

712727
def test_post_room_visibility_key(self) -> None:
713728
# POST with visibility config key, expect new room id

0 commit comments

Comments
 (0)