Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit f60ad60

Browse files
committed
persist contexts after creat_event instead of during
1 parent b5f01e8 commit f60ad60

File tree

9 files changed

+46
-28
lines changed

9 files changed

+46
-28
lines changed

synapse/handlers/message.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ async def create_event(
574574
state_map: Optional[StateMap[str]] = None,
575575
for_batch: bool = False,
576576
current_state_group: Optional[int] = None,
577-
) -> Tuple[EventBase, EventContext]:
577+
) -> Tuple[EventBase, UnpersistedEventContextBase]:
578578
"""
579579
Given a dict from a client, create a new event. If bool for_batch is true, will
580580
create an event using the prev_event_ids, and will create an event context for
@@ -721,7 +721,6 @@ async def create_event(
721721
current_state_group=current_state_group,
722722
)
723723

724-
context = await unpersisted_context.persist(event)
725724

726725
# In an ideal world we wouldn't need the second part of this condition. However,
727726
# this behaviour isn't spec'd yet, meaning we should be able to deactivate this
@@ -739,7 +738,7 @@ async def create_event(
739738
assert state_map is not None
740739
prev_event_id = state_map.get((EventTypes.Member, event.sender))
741740
else:
742-
prev_state_ids = await context.get_prev_state_ids(
741+
prev_state_ids = await unpersisted_context.get_prev_state_ids(
743742
StateFilter.from_types([(EventTypes.Member, None)])
744743
)
745744
prev_event_id = prev_state_ids.get((EventTypes.Member, event.sender))
@@ -764,8 +763,7 @@ async def create_event(
764763
)
765764

766765
self.validator.validate_new(event, self.config)
767-
768-
return event, context
766+
return event, unpersisted_context
769767

770768
async def _is_exempt_from_privacy_policy(
771769
self, builder: EventBuilder, requester: Requester
@@ -1005,7 +1003,7 @@ async def create_and_send_nonmember_event(
10051003
max_retries = 5
10061004
for i in range(max_retries):
10071005
try:
1008-
event, context = await self.create_event(
1006+
event, unpersisted_context = await self.create_event(
10091007
requester,
10101008
event_dict,
10111009
txn_id=txn_id,
@@ -1016,6 +1014,7 @@ async def create_and_send_nonmember_event(
10161014
historical=historical,
10171015
depth=depth,
10181016
)
1017+
context = await unpersisted_context.persist(event)
10191018

10201019
assert self.hs.is_mine_id(event.sender), "User must be our own: %s" % (
10211020
event.sender,
@@ -1190,7 +1189,6 @@ async def create_new_client_event(
11901189
if for_batch:
11911190
assert prev_event_ids is not None
11921191
assert state_map is not None
1193-
assert current_state_group is not None
11941192
auth_ids = self._event_auth_handler.compute_auth_events(builder, state_map)
11951193
event = await builder.build(
11961194
prev_event_ids=prev_event_ids, auth_event_ids=auth_ids, depth=depth
@@ -2040,7 +2038,7 @@ async def _send_dummy_event_for_room(self, room_id: str) -> bool:
20402038
max_retries = 5
20412039
for i in range(max_retries):
20422040
try:
2043-
event, context = await self.create_event(
2041+
event, unpersisted_context = await self.create_event(
20442042
requester,
20452043
{
20462044
"type": EventTypes.Dummy,
@@ -2049,6 +2047,7 @@ async def _send_dummy_event_for_room(self, room_id: str) -> bool:
20492047
"sender": user_id,
20502048
},
20512049
)
2050+
context = await unpersisted_context.persist(event)
20522051

20532052
event.internal_metadata.proactively_send = False
20542053

synapse/handlers/room_batch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ async def persist_historical_events(
327327
# Mark all events as historical
328328
event_dict["content"][EventContentFields.MSC2716_HISTORICAL] = True
329329

330-
event, context = await self.event_creation_handler.create_event(
330+
event, unpersisted_context = await self.event_creation_handler.create_event(
331331
await self.create_requester_for_user_id_from_app_service(
332332
ev["sender"], app_service_requester.app_service
333333
),
@@ -345,7 +345,7 @@ async def persist_historical_events(
345345
historical=True,
346346
depth=inherited_depth,
347347
)
348-
348+
context = await unpersisted_context.persist(event)
349349
assert context._state_group
350350

351351
# Normally this is done when persisting the event but we have to

synapse/handlers/room_member.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,10 @@ async def _local_membership_update(
398398
max_retries = 5
399399
for i in range(max_retries):
400400
try:
401-
event, context = await self.event_creation_handler.create_event(
401+
(
402+
event,
403+
unpersisted_context,
404+
) = await self.event_creation_handler.create_event(
402405
requester,
403406
{
404407
"type": EventTypes.Member,
@@ -419,7 +422,7 @@ async def _local_membership_update(
419422
outlier=outlier,
420423
historical=historical,
421424
)
422-
425+
context = await unpersisted_context.persist(event)
423426
prev_state_ids = await context.get_prev_state_ids(
424427
StateFilter.from_types([(EventTypes.Member, None)])
425428
)
@@ -1892,14 +1895,18 @@ async def _generate_local_out_of_band_leave(
18921895
max_retries = 5
18931896
for i in range(max_retries):
18941897
try:
1895-
event, context = await self.event_creation_handler.create_event(
1898+
(
1899+
event,
1900+
unpersisted_context,
1901+
) = await self.event_creation_handler.create_event(
18961902
requester,
18971903
event_dict,
18981904
txn_id=txn_id,
18991905
prev_event_ids=prev_event_ids,
19001906
auth_event_ids=auth_event_ids,
19011907
outlier=True,
19021908
)
1909+
context = await unpersisted_context.persist(event)
19031910
event.internal_metadata.out_of_band_membership = True
19041911

19051912
result_event = (

tests/handlers/test_message.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ def test_duplicated_txn_id(self) -> None:
106106

107107
txn_id = "something_suitably_random"
108108

109-
event1, context = self._create_duplicate_event(txn_id)
109+
event1, unpersisted_context = self._create_duplicate_event(txn_id)
110+
context = self.get_success(unpersisted_context.persist(event1))
110111

111112
ret_event1 = self.get_success(
112113
self.handler.handle_new_client_event(
@@ -118,7 +119,8 @@ def test_duplicated_txn_id(self) -> None:
118119

119120
self.assertEqual(event1.event_id, ret_event1.event_id)
120121

121-
event2, context = self._create_duplicate_event(txn_id)
122+
event2, unpersisted_context = self._create_duplicate_event(txn_id)
123+
context = self.get_success(unpersisted_context.persist(event2))
122124

123125
# We want to test that the deduplication at the persit event end works,
124126
# so we want to make sure we test with different events.
@@ -139,7 +141,9 @@ def test_duplicated_txn_id(self) -> None:
139141

140142
# Let's test that calling `persist_event` directly also does the right
141143
# thing.
142-
event3, context = self._create_duplicate_event(txn_id)
144+
event3, unpersisted_context = self._create_duplicate_event(txn_id)
145+
context = self.get_success(unpersisted_context.persist(event3))
146+
143147
self.assertNotEqual(event1.event_id, event3.event_id)
144148

145149
ret_event3, event_pos3, _ = self.get_success(
@@ -153,7 +157,8 @@ def test_duplicated_txn_id(self) -> None:
153157

154158
# Let's test that calling `persist_events` directly also does the right
155159
# thing.
156-
event4, context = self._create_duplicate_event(txn_id)
160+
event4, unpersisted_context = self._create_duplicate_event(txn_id)
161+
context = self.get_success(unpersisted_context.persist(event4))
157162
self.assertNotEqual(event1.event_id, event3.event_id)
158163

159164
events, _ = self.get_success(
@@ -173,8 +178,10 @@ def test_duplicated_txn_id_one_call(self) -> None:
173178
txn_id = "something_else_suitably_random"
174179

175180
# Create two duplicate events to persist at the same time
176-
event1, context1 = self._create_duplicate_event(txn_id)
177-
event2, context2 = self._create_duplicate_event(txn_id)
181+
event1, unpersisted_context1 = self._create_duplicate_event(txn_id)
182+
context1 = self.get_success(unpersisted_context1.persist(event1))
183+
event2, unpersisted_context2 = self._create_duplicate_event(txn_id)
184+
context2 = self.get_success(unpersisted_context2.persist(event2))
178185

179186
# Ensure their event IDs are different to start with
180187
self.assertNotEqual(event1.event_id, event2.event_id)

tests/handlers/test_register.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ def test_auto_create_auto_join_room_preset_invalid_permissions(self) -> None:
503503
# Lower the permissions of the inviter.
504504
event_creation_handler = self.hs.get_event_creation_handler()
505505
requester = create_requester(inviter)
506-
event, context = self.get_success(
506+
event, unpersisted_context = self.get_success(
507507
event_creation_handler.create_event(
508508
requester,
509509
{
@@ -515,6 +515,7 @@ def test_auto_create_auto_join_room_preset_invalid_permissions(self) -> None:
515515
},
516516
)
517517
)
518+
context = self.get_success(unpersisted_context.persist(event))
518519
self.get_success(
519520
event_creation_handler.handle_new_client_event(
520521
requester, events_and_context=[(event, context)]

tests/push/test_bulk_push_rule_evaluator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def test_action_for_event_by_user_handles_noninteger_power_levels(self) -> None:
7878

7979
# Create a new message event, and try to evaluate it under the dodgy
8080
# power level event.
81-
event, context = self.get_success(
81+
event, unpersisted_context = self.get_success(
8282
self.event_creation_handler.create_event(
8383
self.requester,
8484
{
@@ -92,6 +92,7 @@ def test_action_for_event_by_user_handles_noninteger_power_levels(self) -> None:
9292
},
9393
)
9494
)
95+
context = self.get_success(unpersisted_context.persist(event))
9596

9697
bulk_evaluator = BulkPushRuleEvaluator(self.hs)
9798
# should not raise
@@ -102,7 +103,7 @@ def test_action_for_event_by_user_disabled_by_config(self) -> None:
102103
"""Ensure that push rules are not calculated when disabled in the config"""
103104

104105
# Create a new message event which should cause a notification.
105-
event, context = self.get_success(
106+
event, unpersisted_context = self.get_success(
106107
self.event_creation_handler.create_event(
107108
self.requester,
108109
{
@@ -116,6 +117,7 @@ def test_action_for_event_by_user_disabled_by_config(self) -> None:
116117
},
117118
)
118119
)
120+
context = self.get_success(unpersisted_context.persist(event))
119121

120122
bulk_evaluator = BulkPushRuleEvaluator(self.hs)
121123
# Mock the method which calculates push rules -- we do this instead of

tests/rest/client/test_rooms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ def test_post_room_no_keys(self) -> None:
715715
self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
716716
self.assertTrue("room_id" in channel.json_body)
717717
assert channel.resource_usage is not None
718-
self.assertEqual(33, channel.resource_usage.db_txn_count)
718+
self.assertEqual(30, channel.resource_usage.db_txn_count)
719719

720720
def test_post_room_initial_state(self) -> None:
721721
# POST with initial_state config key, expect new room id
@@ -728,7 +728,7 @@ def test_post_room_initial_state(self) -> None:
728728
self.assertEqual(HTTPStatus.OK, channel.code, channel.result)
729729
self.assertTrue("room_id" in channel.json_body)
730730
assert channel.resource_usage is not None
731-
self.assertEqual(36, channel.resource_usage.db_txn_count)
731+
self.assertEqual(32, channel.resource_usage.db_txn_count)
732732

733733
def test_post_room_visibility_key(self) -> None:
734734
# POST with visibility config key, expect new room id

tests/storage/test_event_chain.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ def _generate_room(self) -> Tuple[str, List[Set[str]]]:
522522
latest_event_ids = self.get_success(
523523
self.store.get_prev_events_for_room(room_id)
524524
)
525-
event, context = self.get_success(
525+
event, unpersisted_context = self.get_success(
526526
event_handler.create_event(
527527
self.requester,
528528
{
@@ -535,14 +535,15 @@ def _generate_room(self) -> Tuple[str, List[Set[str]]]:
535535
prev_event_ids=latest_event_ids,
536536
)
537537
)
538+
context = self.get_success(unpersisted_context.persist(event))
538539
self.get_success(
539540
event_handler.handle_new_client_event(
540541
self.requester, events_and_context=[(event, context)]
541542
)
542543
)
543544
state1 = set(self.get_success(context.get_current_state_ids()).values())
544545

545-
event, context = self.get_success(
546+
event, unpersisted_context = self.get_success(
546547
event_handler.create_event(
547548
self.requester,
548549
{
@@ -555,6 +556,7 @@ def _generate_room(self) -> Tuple[str, List[Set[str]]]:
555556
prev_event_ids=latest_event_ids,
556557
)
557558
)
559+
context = self.get_success(unpersisted_context.persist(event))
558560
self.get_success(
559561
event_handler.handle_new_client_event(
560562
self.requester, events_and_context=[(event, context)]

tests/unittest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ def create_and_send_event(
715715
event_creator = self.hs.get_event_creation_handler()
716716
requester = create_requester(user)
717717

718-
event, context = self.get_success(
718+
event, unpersisted_context = self.get_success(
719719
event_creator.create_event(
720720
requester,
721721
{
@@ -727,7 +727,7 @@ def create_and_send_event(
727727
prev_event_ids=prev_event_ids,
728728
)
729729
)
730-
730+
context = self.get_success(unpersisted_context.persist(event))
731731
if soft_failed:
732732
event.internal_metadata.soft_failed = True
733733

0 commit comments

Comments
 (0)