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

Commit b5f01e8

Browse files
committed
batch persist state groups when creating room
1 parent 905ccac commit b5f01e8

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

synapse/handlers/room.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion
5959
from synapse.event_auth import validate_event_for_room_version
6060
from synapse.events import EventBase
61+
from synapse.events.snapshot import UnpersistedEventContext
6162
from synapse.events.utils import copy_and_fixup_power_levels_contents
6263
from synapse.handlers.relations import BundledAggregations
6364
from synapse.module_api import NOT_SPAM
@@ -218,7 +219,7 @@ async def upgrade_room(
218219
# the required power level to send the tombstone event.
219220
(
220221
tombstone_event,
221-
tombstone_context,
222+
tombstone_unpersisted_context,
222223
) = await self.event_creation_handler.create_event(
223224
requester,
224225
{
@@ -232,6 +233,9 @@ async def upgrade_room(
232233
},
233234
},
234235
)
236+
tombstone_context = await tombstone_unpersisted_context.persist(
237+
tombstone_event
238+
)
235239
validate_event_for_room_version(tombstone_event)
236240
await self._event_auth_handler.check_auth_rules_from_context(
237241
tombstone_event
@@ -1098,7 +1102,7 @@ async def create_event(
10981102
content: JsonDict,
10991103
for_batch: bool,
11001104
**kwargs: Any,
1101-
) -> Tuple[EventBase, synapse.events.snapshot.EventContext]:
1105+
) -> Tuple[EventBase, synapse.events.snapshot.UnpersistedEventContextBase]:
11021106
"""
11031107
Creates an event and associated event context.
11041108
Args:
@@ -1117,20 +1121,23 @@ async def create_event(
11171121

11181122
event_dict = create_event_dict(etype, content, **kwargs)
11191123

1120-
new_event, new_context = await self.event_creation_handler.create_event(
1124+
(
1125+
new_event,
1126+
new_unpersisted_context,
1127+
) = await self.event_creation_handler.create_event(
11211128
creator,
11221129
event_dict,
11231130
prev_event_ids=prev_event,
11241131
depth=depth,
11251132
state_map=state_map,
11261133
for_batch=for_batch,
1127-
current_state_group=current_state_group,
11281134
)
1135+
11291136
depth += 1
11301137
prev_event = [new_event.event_id]
11311138
state_map[(new_event.type, new_event.state_key)] = new_event.event_id
11321139

1133-
return new_event, new_context
1140+
return new_event, new_unpersisted_context
11341141

11351142
try:
11361143
config = self._presets_dict[preset_config]
@@ -1140,10 +1147,10 @@ async def create_event(
11401147
)
11411148

11421149
creation_content.update({"creator": creator_id})
1143-
creation_event, creation_context = await create_event(
1150+
creation_event, unpersisted_creation_context = await create_event(
11441151
EventTypes.Create, creation_content, False
11451152
)
1146-
1153+
creation_context = await unpersisted_creation_context.persist(creation_event)
11471154
logger.debug("Sending %s in new room", EventTypes.Member)
11481155
ev = await self.event_creation_handler.handle_new_client_event(
11491156
requester=creator,
@@ -1187,7 +1194,6 @@ async def create_event(
11871194
power_event, power_context = await create_event(
11881195
EventTypes.PowerLevels, pl_content, True
11891196
)
1190-
current_state_group = power_context._state_group
11911197
events_to_send.append((power_event, power_context))
11921198
else:
11931199
power_level_content: JsonDict = {
@@ -1236,14 +1242,12 @@ async def create_event(
12361242
power_level_content,
12371243
True,
12381244
)
1239-
current_state_group = pl_context._state_group
12401245
events_to_send.append((pl_event, pl_context))
12411246

12421247
if room_alias and (EventTypes.CanonicalAlias, "") not in initial_state:
12431248
room_alias_event, room_alias_context = await create_event(
12441249
EventTypes.CanonicalAlias, {"alias": room_alias.to_string()}, True
12451250
)
1246-
current_state_group = room_alias_context._state_group
12471251
events_to_send.append((room_alias_event, room_alias_context))
12481252

12491253
if (EventTypes.JoinRules, "") not in initial_state:
@@ -1252,7 +1256,6 @@ async def create_event(
12521256
{"join_rule": config["join_rules"]},
12531257
True,
12541258
)
1255-
current_state_group = join_rules_context._state_group
12561259
events_to_send.append((join_rules_event, join_rules_context))
12571260

12581261
if (EventTypes.RoomHistoryVisibility, "") not in initial_state:
@@ -1261,7 +1264,6 @@ async def create_event(
12611264
{"history_visibility": config["history_visibility"]},
12621265
True,
12631266
)
1264-
current_state_group = visibility_context._state_group
12651267
events_to_send.append((visibility_event, visibility_context))
12661268

12671269
if config["guest_can_join"]:
@@ -1271,14 +1273,12 @@ async def create_event(
12711273
{EventContentFields.GUEST_ACCESS: GuestAccess.CAN_JOIN},
12721274
True,
12731275
)
1274-
current_state_group = guest_access_context._state_group
12751276
events_to_send.append((guest_access_event, guest_access_context))
12761277

12771278
for (etype, state_key), content in initial_state.items():
12781279
event, context = await create_event(
12791280
etype, content, True, state_key=state_key
12801281
)
1281-
current_state_group = context._state_group
12821282
events_to_send.append((event, context))
12831283

12841284
if config["encrypted"]:
@@ -1290,9 +1290,16 @@ async def create_event(
12901290
)
12911291
events_to_send.append((encryption_event, encryption_context))
12921292

1293+
datastore = self.hs.get_datastores().state
1294+
events_and_context = (
1295+
await UnpersistedEventContext.batch_persist_unpersisted_contexts(
1296+
events_to_send, room_id, current_state_group, datastore
1297+
)
1298+
)
1299+
12931300
last_event = await self.event_creation_handler.handle_new_client_event(
12941301
creator,
1295-
events_to_send,
1302+
events_and_context,
12961303
ignore_shadow_ban=True,
12971304
ratelimit=False,
12981305
)

0 commit comments

Comments
 (0)