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

Commit 4f991a0

Browse files
committed
batch persist state groups when creating room
1 parent b9bef42 commit 4f991a0

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
@@ -50,6 +50,7 @@
5050
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion
5151
from synapse.event_auth import validate_event_for_room_version
5252
from synapse.events import EventBase
53+
from synapse.events.snapshot import UnpersistedEventContext
5354
from synapse.events.utils import copy_and_fixup_power_levels_contents
5455
from synapse.handlers.relations import BundledAggregations
5556
from synapse.module_api import NOT_SPAM
@@ -211,7 +212,7 @@ async def upgrade_room(
211212
# the required power level to send the tombstone event.
212213
(
213214
tombstone_event,
214-
tombstone_context,
215+
tombstone_unpersisted_context,
215216
) = await self.event_creation_handler.create_event(
216217
requester,
217218
{
@@ -225,6 +226,9 @@ async def upgrade_room(
225226
},
226227
},
227228
)
229+
tombstone_context = await tombstone_unpersisted_context.persist(
230+
tombstone_event
231+
)
228232
validate_event_for_room_version(tombstone_event)
229233
await self._event_auth_handler.check_auth_rules_from_context(
230234
tombstone_event
@@ -1091,7 +1095,7 @@ async def create_event(
10911095
content: JsonDict,
10921096
for_batch: bool,
10931097
**kwargs: Any,
1094-
) -> Tuple[EventBase, synapse.events.snapshot.EventContext]:
1098+
) -> Tuple[EventBase, synapse.events.snapshot.UnpersistedEventContextBase]:
10951099
"""
10961100
Creates an event and associated event context.
10971101
Args:
@@ -1110,20 +1114,23 @@ async def create_event(
11101114

11111115
event_dict = create_event_dict(etype, content, **kwargs)
11121116

1113-
new_event, new_context = await self.event_creation_handler.create_event(
1117+
(
1118+
new_event,
1119+
new_unpersisted_context,
1120+
) = await self.event_creation_handler.create_event(
11141121
creator,
11151122
event_dict,
11161123
prev_event_ids=prev_event,
11171124
depth=depth,
11181125
state_map=state_map,
11191126
for_batch=for_batch,
1120-
current_state_group=current_state_group,
11211127
)
1128+
11221129
depth += 1
11231130
prev_event = [new_event.event_id]
11241131
state_map[(new_event.type, new_event.state_key)] = new_event.event_id
11251132

1126-
return new_event, new_context
1133+
return new_event, new_unpersisted_context
11271134

11281135
try:
11291136
config = self._presets_dict[preset_config]
@@ -1133,10 +1140,10 @@ async def create_event(
11331140
)
11341141

11351142
creation_content.update({"creator": creator_id})
1136-
creation_event, creation_context = await create_event(
1143+
creation_event, unpersisted_creation_context = await create_event(
11371144
EventTypes.Create, creation_content, False
11381145
)
1139-
1146+
creation_context = await unpersisted_creation_context.persist(creation_event)
11401147
logger.debug("Sending %s in new room", EventTypes.Member)
11411148
ev = await self.event_creation_handler.handle_new_client_event(
11421149
requester=creator,
@@ -1180,7 +1187,6 @@ async def create_event(
11801187
power_event, power_context = await create_event(
11811188
EventTypes.PowerLevels, pl_content, True
11821189
)
1183-
current_state_group = power_context._state_group
11841190
events_to_send.append((power_event, power_context))
11851191
else:
11861192
power_level_content: JsonDict = {
@@ -1229,14 +1235,12 @@ async def create_event(
12291235
power_level_content,
12301236
True,
12311237
)
1232-
current_state_group = pl_context._state_group
12331238
events_to_send.append((pl_event, pl_context))
12341239

12351240
if room_alias and (EventTypes.CanonicalAlias, "") not in initial_state:
12361241
room_alias_event, room_alias_context = await create_event(
12371242
EventTypes.CanonicalAlias, {"alias": room_alias.to_string()}, True
12381243
)
1239-
current_state_group = room_alias_context._state_group
12401244
events_to_send.append((room_alias_event, room_alias_context))
12411245

12421246
if (EventTypes.JoinRules, "") not in initial_state:
@@ -1245,7 +1249,6 @@ async def create_event(
12451249
{"join_rule": config["join_rules"]},
12461250
True,
12471251
)
1248-
current_state_group = join_rules_context._state_group
12491252
events_to_send.append((join_rules_event, join_rules_context))
12501253

12511254
if (EventTypes.RoomHistoryVisibility, "") not in initial_state:
@@ -1254,7 +1257,6 @@ async def create_event(
12541257
{"history_visibility": config["history_visibility"]},
12551258
True,
12561259
)
1257-
current_state_group = visibility_context._state_group
12581260
events_to_send.append((visibility_event, visibility_context))
12591261

12601262
if config["guest_can_join"]:
@@ -1264,14 +1266,12 @@ async def create_event(
12641266
{EventContentFields.GUEST_ACCESS: GuestAccess.CAN_JOIN},
12651267
True,
12661268
)
1267-
current_state_group = guest_access_context._state_group
12681269
events_to_send.append((guest_access_event, guest_access_context))
12691270

12701271
for (etype, state_key), content in initial_state.items():
12711272
event, context = await create_event(
12721273
etype, content, True, state_key=state_key
12731274
)
1274-
current_state_group = context._state_group
12751275
events_to_send.append((event, context))
12761276

12771277
if config["encrypted"]:
@@ -1283,9 +1283,16 @@ async def create_event(
12831283
)
12841284
events_to_send.append((encryption_event, encryption_context))
12851285

1286+
datastore = self.hs.get_datastores().state
1287+
events_and_context = (
1288+
await UnpersistedEventContext.batch_persist_unpersisted_contexts(
1289+
events_to_send, room_id, current_state_group, datastore
1290+
)
1291+
)
1292+
12861293
last_event = await self.event_creation_handler.handle_new_client_event(
12871294
creator,
1288-
events_to_send,
1295+
events_and_context,
12891296
ignore_shadow_ban=True,
12901297
ratelimit=False,
12911298
)

0 commit comments

Comments
 (0)