mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-22 17:46:08 +03:00
Add another yield point to state res v2 (#7746)
This commit is contained in:
parent
177b2d0c19
commit
831b31e563
2 changed files with 11 additions and 2 deletions
1
changelog.d/7746.bugfix
Normal file
1
changelog.d/7746.bugfix
Normal file
|
@ -0,0 +1 @@
|
|||
Fix large state resolutions from stalling Synapse for seconds at a time.
|
|
@ -126,6 +126,7 @@ def resolve_events_with_store(
|
|||
|
||||
# Now sequentially auth each one
|
||||
resolved_state = yield _iterative_auth_checks(
|
||||
clock,
|
||||
room_id,
|
||||
room_version,
|
||||
sorted_power_events,
|
||||
|
@ -154,6 +155,7 @@ def resolve_events_with_store(
|
|||
logger.debug("resolving remaining events")
|
||||
|
||||
resolved_state = yield _iterative_auth_checks(
|
||||
clock,
|
||||
room_id,
|
||||
room_version,
|
||||
leftover_events,
|
||||
|
@ -378,12 +380,13 @@ def _reverse_topological_power_sort(
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def _iterative_auth_checks(
|
||||
room_id, room_version, event_ids, base_state, event_map, state_res_store
|
||||
clock, room_id, room_version, event_ids, base_state, event_map, state_res_store
|
||||
):
|
||||
"""Sequentially apply auth checks to each event in given list, updating the
|
||||
state as it goes along.
|
||||
|
||||
Args:
|
||||
clock (Clock)
|
||||
room_id (str)
|
||||
room_version (str)
|
||||
event_ids (list[str]): Ordered list of events to apply auth checks to
|
||||
|
@ -397,7 +400,7 @@ def _iterative_auth_checks(
|
|||
resolved_state = base_state.copy()
|
||||
room_version_obj = KNOWN_ROOM_VERSIONS[room_version]
|
||||
|
||||
for event_id in event_ids:
|
||||
for idx, event_id in enumerate(event_ids, start=1):
|
||||
event = event_map[event_id]
|
||||
|
||||
auth_events = {}
|
||||
|
@ -435,6 +438,11 @@ def _iterative_auth_checks(
|
|||
except AuthError:
|
||||
pass
|
||||
|
||||
# We yield occasionally when we're working with large data sets to
|
||||
# ensure that we don't block the reactor loop for too long.
|
||||
if idx % _YIELD_AFTER_ITERATIONS == 0:
|
||||
yield clock.sleep(0)
|
||||
|
||||
return resolved_state
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue