5050from synapse .api .room_versions import KNOWN_ROOM_VERSIONS , RoomVersion
5151from synapse .event_auth import validate_event_for_room_version
5252from synapse .events import EventBase
53+ from synapse .events .snapshot import UnpersistedEventContext
5354from synapse .events .utils import copy_and_fixup_power_levels_contents
5455from synapse .handlers .relations import BundledAggregations
5556from 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