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