From b7f3df79f892efae61a4415742a40fe41915b4c1 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 26 Jun 2020 10:16:34 +0100 Subject: [PATCH 1/2] Add another yield point to state res v2 --- synapse/state/v2.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/synapse/state/v2.py b/synapse/state/v2.py index 7181ecda9a81..bf6caa094633 100644 --- a/synapse/state/v2.py +++ b/synapse/state/v2.py @@ -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 _get_power_order(event_id): @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 From d708184af3e1bb8e24ef2e624cd99f90c31d0114 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 26 Jun 2020 10:18:16 +0100 Subject: [PATCH 2/2] Newsfile --- changelog.d/7746.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7746.bugfix diff --git a/changelog.d/7746.bugfix b/changelog.d/7746.bugfix new file mode 100644 index 000000000000..86959a5ca4d0 --- /dev/null +++ b/changelog.d/7746.bugfix @@ -0,0 +1 @@ +Fix large state resolutions from stalling Synapse for seconds at a time.