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

Commit 831b31e

Browse files
authored
Add another yield point to state res v2 (#7746)
1 parent 177b2d0 commit 831b31e

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

changelog.d/7746.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix large state resolutions from stalling Synapse for seconds at a time.

synapse/state/v2.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def resolve_events_with_store(
126126

127127
# Now sequentially auth each one
128128
resolved_state = yield _iterative_auth_checks(
129+
clock,
129130
room_id,
130131
room_version,
131132
sorted_power_events,
@@ -154,6 +155,7 @@ def resolve_events_with_store(
154155
logger.debug("resolving remaining events")
155156

156157
resolved_state = yield _iterative_auth_checks(
158+
clock,
157159
room_id,
158160
room_version,
159161
leftover_events,
@@ -378,12 +380,13 @@ def _get_power_order(event_id):
378380

379381
@defer.inlineCallbacks
380382
def _iterative_auth_checks(
381-
room_id, room_version, event_ids, base_state, event_map, state_res_store
383+
clock, room_id, room_version, event_ids, base_state, event_map, state_res_store
382384
):
383385
"""Sequentially apply auth checks to each event in given list, updating the
384386
state as it goes along.
385387
386388
Args:
389+
clock (Clock)
387390
room_id (str)
388391
room_version (str)
389392
event_ids (list[str]): Ordered list of events to apply auth checks to
@@ -397,7 +400,7 @@ def _iterative_auth_checks(
397400
resolved_state = base_state.copy()
398401
room_version_obj = KNOWN_ROOM_VERSIONS[room_version]
399402

400-
for event_id in event_ids:
403+
for idx, event_id in enumerate(event_ids, start=1):
401404
event = event_map[event_id]
402405

403406
auth_events = {}
@@ -435,6 +438,11 @@ def _iterative_auth_checks(
435438
except AuthError:
436439
pass
437440

441+
# We yield occasionally when we're working with large data sets to
442+
# ensure that we don't block the reactor loop for too long.
443+
if idx % _YIELD_AFTER_ITERATIONS == 0:
444+
yield clock.sleep(0)
445+
438446
return resolved_state
439447

440448

0 commit comments

Comments
 (0)