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

Commit 91bb97f

Browse files
committed
batch persist state groups when creating room
1 parent 4d3621f commit 91bb97f

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
@@ -49,6 +49,7 @@
4949
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion
5050
from synapse.event_auth import validate_event_for_room_version
5151
from synapse.events import EventBase
52+
from synapse.events.snapshot import UnpersistedEventContext
5253
from synapse.events.utils import copy_and_fixup_power_levels_contents
5354
from synapse.handlers.relations import BundledAggregations
5455
from synapse.module_api import NOT_SPAM
@@ -210,7 +211,7 @@ async def upgrade_room(
210211
# the required power level to send the tombstone event.
211212
(
212213
tombstone_event,
213-
tombstone_context,
214+
tombstone_unpersisted_context,
214215
) = await self.event_creation_handler.create_event(
215216
requester,
216217
{
@@ -224,6 +225,9 @@ async def upgrade_room(
224225
},
225226
},
226227
)
228+
tombstone_context = await tombstone_unpersisted_context.persist(
229+
tombstone_event
230+
)
227231
validate_event_for_room_version(tombstone_event)
228232
await self._event_auth_handler.check_auth_rules_from_context(
229233
tombstone_event
@@ -1090,7 +1094,7 @@ async def create_event(
10901094
content: JsonDict,
10911095
for_batch: bool,
10921096
**kwargs: Any,
1093-
) -> Tuple[EventBase, synapse.events.snapshot.EventContext]:
1097+
) -> Tuple[EventBase, synapse.events.snapshot.UnpersistedEventContextBase]:
10941098
"""
10951099
Creates an event and associated event context.
10961100
Args:
@@ -1109,20 +1113,23 @@ async def create_event(
11091113

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

1112-
new_event, new_context = await self.event_creation_handler.create_event(
1116+
(
1117+
new_event,
1118+
new_unpersisted_context,
1119+
) = await self.event_creation_handler.create_event(
11131120
creator,
11141121
event_dict,
11151122
prev_event_ids=prev_event,
11161123
depth=depth,
11171124
state_map=state_map,
11181125
for_batch=for_batch,
1119-
current_state_group=current_state_group,
11201126
)
1127+
11211128
depth += 1
11221129
prev_event = [new_event.event_id]
11231130
state_map[(new_event.type, new_event.state_key)] = new_event.event_id
11241131

1125-
return new_event, new_context
1132+
return new_event, new_unpersisted_context
11261133

11271134
try:
11281135
config = self._presets_dict[preset_config]
@@ -1132,10 +1139,10 @@ async def create_event(
11321139
)
11331140

11341141
creation_content.update({"creator": creator_id})
1135-
creation_event, creation_context = await create_event(
1142+
creation_event, unpersisted_creation_context = await create_event(
11361143
EventTypes.Create, creation_content, False
11371144
)
1138-
1145+
creation_context = await unpersisted_creation_context.persist(creation_event)
11391146
logger.debug("Sending %s in new room", EventTypes.Member)
11401147
ev = await self.event_creation_handler.handle_new_client_event(
11411148
requester=creator,
@@ -1179,7 +1186,6 @@ async def create_event(
11791186
power_event, power_context = await create_event(
11801187
EventTypes.PowerLevels, pl_content, True
11811188
)
1182-
current_state_group = power_context._state_group
11831189
events_to_send.append((power_event, power_context))
11841190
else:
11851191
power_level_content: JsonDict = {
@@ -1228,14 +1234,12 @@ async def create_event(
12281234
power_level_content,
12291235
True,
12301236
)
1231-
current_state_group = pl_context._state_group
12321237
events_to_send.append((pl_event, pl_context))
12331238

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

12411245
if (EventTypes.JoinRules, "") not in initial_state:
@@ -1244,7 +1248,6 @@ async def create_event(
12441248
{"join_rule": config["join_rules"]},
12451249
True,
12461250
)
1247-
current_state_group = join_rules_context._state_group
12481251
events_to_send.append((join_rules_event, join_rules_context))
12491252

12501253
if (EventTypes.RoomHistoryVisibility, "") not in initial_state:
@@ -1253,7 +1256,6 @@ async def create_event(
12531256
{"history_visibility": config["history_visibility"]},
12541257
True,
12551258
)
1256-
current_state_group = visibility_context._state_group
12571259
events_to_send.append((visibility_event, visibility_context))
12581260

12591261
if config["guest_can_join"]:
@@ -1263,14 +1265,12 @@ async def create_event(
12631265
{EventContentFields.GUEST_ACCESS: GuestAccess.CAN_JOIN},
12641266
True,
12651267
)
1266-
current_state_group = guest_access_context._state_group
12671268
events_to_send.append((guest_access_event, guest_access_context))
12681269

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

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

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

0 commit comments

Comments
 (0)