Add another yield point to state res v2 (#7746)

This commit is contained in:
Erik Johnston 2020-06-26 10:44:52 +01:00 committed by GitHub
parent 177b2d0c19
commit 831b31e563
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

1
changelog.d/7746.bugfix Normal file
View file

@ -0,0 +1 @@
Fix large state resolutions from stalling Synapse for seconds at a time.

View file

@ -126,6 +126,7 @@ def resolve_events_with_store(
# Now sequentially auth each one # Now sequentially auth each one
resolved_state = yield _iterative_auth_checks( resolved_state = yield _iterative_auth_checks(
clock,
room_id, room_id,
room_version, room_version,
sorted_power_events, sorted_power_events,
@ -154,6 +155,7 @@ def resolve_events_with_store(
logger.debug("resolving remaining events") logger.debug("resolving remaining events")
resolved_state = yield _iterative_auth_checks( resolved_state = yield _iterative_auth_checks(
clock,
room_id, room_id,
room_version, room_version,
leftover_events, leftover_events,
@ -378,12 +380,13 @@ def _reverse_topological_power_sort(
@defer.inlineCallbacks @defer.inlineCallbacks
def _iterative_auth_checks( 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 """Sequentially apply auth checks to each event in given list, updating the
state as it goes along. state as it goes along.
Args: Args:
clock (Clock)
room_id (str) room_id (str)
room_version (str) room_version (str)
event_ids (list[str]): Ordered list of events to apply auth checks to 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() resolved_state = base_state.copy()
room_version_obj = KNOWN_ROOM_VERSIONS[room_version] 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] event = event_map[event_id]
auth_events = {} auth_events = {}
@ -435,6 +438,11 @@ def _iterative_auth_checks(
except AuthError: except AuthError:
pass 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 return resolved_state