5858from synapse .api .room_versions import KNOWN_ROOM_VERSIONS , RoomVersion
5959from synapse .event_auth import validate_event_for_room_version
6060from synapse .events import EventBase
61+ from synapse .events .snapshot import UnpersistedEventContext
6162from synapse .events .utils import copy_and_fixup_power_levels_contents
6263from synapse .handlers .relations import BundledAggregations
6364from 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