mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-07-28 19:38:36 -04:00
Batch up storing state groups when creating new room (#14918)
This commit is contained in:
parent
335f52d595
commit
1c95ddd09b
14 changed files with 371 additions and 49 deletions
|
@ -496,3 +496,129 @@ class StateStoreTestCase(HomeserverTestCase):
|
|||
|
||||
self.assertEqual(is_all, True)
|
||||
self.assertDictEqual({(e5.type, e5.state_key): e5.event_id}, state_dict)
|
||||
|
||||
def test_batched_state_group_storing(self) -> None:
|
||||
creation_event = self.inject_state_event(
|
||||
self.room, self.u_alice, EventTypes.Create, "", {}
|
||||
)
|
||||
state_to_event = self.get_success(
|
||||
self.storage.state.get_state_groups(
|
||||
self.room.to_string(), [creation_event.event_id]
|
||||
)
|
||||
)
|
||||
current_state_group = list(state_to_event.keys())[0]
|
||||
|
||||
# create some unpersisted events and event contexts to store against room
|
||||
events_and_context = []
|
||||
builder = self.event_builder_factory.for_room_version(
|
||||
RoomVersions.V1,
|
||||
{
|
||||
"type": EventTypes.Name,
|
||||
"sender": self.u_alice.to_string(),
|
||||
"state_key": "",
|
||||
"room_id": self.room.to_string(),
|
||||
"content": {"name": "first rename of room"},
|
||||
},
|
||||
)
|
||||
|
||||
event1, unpersisted_context1 = self.get_success(
|
||||
self.event_creation_handler.create_new_client_event(builder)
|
||||
)
|
||||
events_and_context.append((event1, unpersisted_context1))
|
||||
|
||||
builder2 = self.event_builder_factory.for_room_version(
|
||||
RoomVersions.V1,
|
||||
{
|
||||
"type": EventTypes.JoinRules,
|
||||
"sender": self.u_alice.to_string(),
|
||||
"state_key": "",
|
||||
"room_id": self.room.to_string(),
|
||||
"content": {"join_rule": "private"},
|
||||
},
|
||||
)
|
||||
|
||||
event2, unpersisted_context2 = self.get_success(
|
||||
self.event_creation_handler.create_new_client_event(builder2)
|
||||
)
|
||||
events_and_context.append((event2, unpersisted_context2))
|
||||
|
||||
builder3 = self.event_builder_factory.for_room_version(
|
||||
RoomVersions.V1,
|
||||
{
|
||||
"type": EventTypes.Message,
|
||||
"sender": self.u_alice.to_string(),
|
||||
"room_id": self.room.to_string(),
|
||||
"content": {"body": "hello from event 3", "msgtype": "m.text"},
|
||||
},
|
||||
)
|
||||
|
||||
event3, unpersisted_context3 = self.get_success(
|
||||
self.event_creation_handler.create_new_client_event(builder3)
|
||||
)
|
||||
events_and_context.append((event3, unpersisted_context3))
|
||||
|
||||
builder4 = self.event_builder_factory.for_room_version(
|
||||
RoomVersions.V1,
|
||||
{
|
||||
"type": EventTypes.JoinRules,
|
||||
"sender": self.u_alice.to_string(),
|
||||
"state_key": "",
|
||||
"room_id": self.room.to_string(),
|
||||
"content": {"join_rule": "public"},
|
||||
},
|
||||
)
|
||||
|
||||
event4, unpersisted_context4 = self.get_success(
|
||||
self.event_creation_handler.create_new_client_event(builder4)
|
||||
)
|
||||
events_and_context.append((event4, unpersisted_context4))
|
||||
|
||||
processed_events_and_context = self.get_success(
|
||||
self.hs.get_datastores().state.store_state_deltas_for_batched(
|
||||
events_and_context, self.room.to_string(), current_state_group
|
||||
)
|
||||
)
|
||||
|
||||
# check that only state events are in state_groups, and all state events are in state_groups
|
||||
res = self.get_success(
|
||||
self.store.db_pool.simple_select_list(
|
||||
table="state_groups",
|
||||
keyvalues=None,
|
||||
retcols=("event_id",),
|
||||
)
|
||||
)
|
||||
|
||||
events = []
|
||||
for result in res:
|
||||
self.assertNotIn(event3.event_id, result)
|
||||
events.append(result.get("event_id"))
|
||||
|
||||
for event, _ in processed_events_and_context:
|
||||
if event.is_state():
|
||||
self.assertIn(event.event_id, events)
|
||||
|
||||
# check that each unique state has state group in state_groups_state and that the
|
||||
# type/state key is correct, and check that each state event's state group
|
||||
# has an entry and prev event in state_group_edges
|
||||
for event, context in processed_events_and_context:
|
||||
if event.is_state():
|
||||
state = self.get_success(
|
||||
self.store.db_pool.simple_select_list(
|
||||
table="state_groups_state",
|
||||
keyvalues={"state_group": context.state_group_after_event},
|
||||
retcols=("type", "state_key"),
|
||||
)
|
||||
)
|
||||
self.assertEqual(event.type, state[0].get("type"))
|
||||
self.assertEqual(event.state_key, state[0].get("state_key"))
|
||||
|
||||
groups = self.get_success(
|
||||
self.store.db_pool.simple_select_list(
|
||||
table="state_group_edges",
|
||||
keyvalues={"state_group": str(context.state_group_after_event)},
|
||||
retcols=("*",),
|
||||
)
|
||||
)
|
||||
self.assertEqual(
|
||||
context.state_group_before_event, groups[0].get("prev_state_group")
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue