Correctly create power level event during initial room creation (#14361)

This commit is contained in:
Shay 2022-11-07 13:38:50 -08:00 committed by GitHub
parent 2193513346
commit 7894251bce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 4 deletions

1
changelog.d/14361.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a bug introduced in v1.71.0rc1 where the power level event was incorrectly created during initial room creation.

View File

@ -1080,6 +1080,19 @@ class RoomCreationHandler:
for_batch: bool, for_batch: bool,
**kwargs: Any, **kwargs: Any,
) -> Tuple[EventBase, synapse.events.snapshot.EventContext]: ) -> Tuple[EventBase, synapse.events.snapshot.EventContext]:
"""
Creates an event and associated event context.
Args:
etype: the type of event to be created
content: content of the event
for_batch: whether the event is being created for batch persisting. If
bool for_batch is true, this will create an event using the prev_event_ids,
and will create an event context for the event using the parameters state_map
and current_state_group, thus these parameters must be provided in this
case if for_batch is True. The subsequently created event and context
are suitable for being batched up and bulk persisted to the database
with other similarly created events.
"""
nonlocal depth nonlocal depth
nonlocal prev_event nonlocal prev_event
@ -1139,13 +1152,21 @@ class RoomCreationHandler:
depth += 1 depth += 1
state_map[(EventTypes.Member, creator.user.to_string())] = member_event_id state_map[(EventTypes.Member, creator.user.to_string())] = member_event_id
# we need the state group of the membership event as it is the current state group
event_to_state = (
await self._storage_controllers.state.get_state_group_for_events(
[member_event_id]
)
)
current_state_group = event_to_state[member_event_id]
events_to_send = [] events_to_send = []
# We treat the power levels override specially as this needs to be one # We treat the power levels override specially as this needs to be one
# of the first events that get sent into a room. # of the first events that get sent into a room.
pl_content = initial_state.pop((EventTypes.PowerLevels, ""), None) pl_content = initial_state.pop((EventTypes.PowerLevels, ""), None)
if pl_content is not None: if pl_content is not None:
power_event, power_context = await create_event( power_event, power_context = await create_event(
EventTypes.PowerLevels, pl_content, False EventTypes.PowerLevels, pl_content, True
) )
current_state_group = power_context._state_group current_state_group = power_context._state_group
events_to_send.append((power_event, power_context)) events_to_send.append((power_event, power_context))
@ -1194,7 +1215,7 @@ class RoomCreationHandler:
pl_event, pl_context = await create_event( pl_event, pl_context = await create_event(
EventTypes.PowerLevels, EventTypes.PowerLevels,
power_level_content, power_level_content,
False, True,
) )
current_state_group = pl_context._state_group current_state_group = pl_context._state_group
events_to_send.append((pl_event, pl_context)) events_to_send.append((pl_event, pl_context))

View File

@ -715,7 +715,7 @@ class RoomsCreateTestCase(RoomBase):
self.assertEqual(HTTPStatus.OK, channel.code, channel.result) self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
self.assertTrue("room_id" in channel.json_body) self.assertTrue("room_id" in channel.json_body)
assert channel.resource_usage is not None assert channel.resource_usage is not None
self.assertEqual(34, channel.resource_usage.db_txn_count) self.assertEqual(33, channel.resource_usage.db_txn_count)
def test_post_room_initial_state(self) -> None: def test_post_room_initial_state(self) -> None:
# POST with initial_state config key, expect new room id # POST with initial_state config key, expect new room id
@ -728,7 +728,7 @@ class RoomsCreateTestCase(RoomBase):
self.assertEqual(HTTPStatus.OK, channel.code, channel.result) self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
self.assertTrue("room_id" in channel.json_body) self.assertTrue("room_id" in channel.json_body)
assert channel.resource_usage is not None assert channel.resource_usage is not None
self.assertEqual(37, channel.resource_usage.db_txn_count) self.assertEqual(36, channel.resource_usage.db_txn_count)
def test_post_room_visibility_key(self) -> None: def test_post_room_visibility_key(self) -> None:
# POST with visibility config key, expect new room id # POST with visibility config key, expect new room id