diff options
author | reivilibre <oliverw@matrix.org> | 2022-02-22 14:24:31 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-22 14:24:31 +0000 |
commit | dcb6a378372d08a46a76c591704be4dc15c68df3 (patch) | |
tree | cbdae12bd0aabfd87cdcd72a568cf4152dbab426 /synapse/storage/databases | |
parent | Use room version 9 as the default room version (per MSC3589). (#12058) (diff) | |
download | synapse-dcb6a378372d08a46a76c591704be4dc15c68df3.tar.xz |
Cap the number of in-flight requests for state from a single group (#11608)
Diffstat (limited to 'synapse/storage/databases')
-rw-r--r-- | synapse/storage/databases/state/store.py | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/synapse/storage/databases/state/store.py b/synapse/storage/databases/state/store.py index 3af69a2076..b8016f679a 100644 --- a/synapse/storage/databases/state/store.py +++ b/synapse/storage/databases/state/store.py @@ -56,6 +56,7 @@ if TYPE_CHECKING: logger = logging.getLogger(__name__) MAX_STATE_DELTA_HOPS = 100 +MAX_INFLIGHT_REQUESTS_PER_GROUP = 5 @attr.s(slots=True, frozen=True, auto_attribs=True) @@ -258,6 +259,11 @@ class StateGroupDataStore(StateBackgroundUpdateStore, SQLBaseStore): Attempts to gather in-flight requests and re-use them to retrieve state for the given state group, filtered with the given state filter. + If there are more than MAX_INFLIGHT_REQUESTS_PER_GROUP in-flight requests, + and there *still* isn't enough information to complete the request by solely + reusing others, a full state filter will be requested to ensure that subsequent + requests can reuse this request. + Used as part of _get_state_for_group_using_inflight_cache. Returns: @@ -288,6 +294,16 @@ class StateGroupDataStore(StateBackgroundUpdateStore, SQLBaseStore): # to cover our StateFilter and give us the state we need. break + if ( + state_filter_left_over != StateFilter.none() + and len(inflight_requests) >= MAX_INFLIGHT_REQUESTS_PER_GROUP + ): + # There are too many requests for this group. + # To prevent even more from building up, we request the whole + # state filter to guarantee that we can be reused by any subsequent + # requests for this state group. + return (), StateFilter.all() + return reusable_requests, state_filter_left_over async def _get_state_for_group_fire_request( |