diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2019-07-05 11:10:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-05 11:10:19 +0100 |
commit | 9481707a52a89022bc5d99c181ceb9e7ec9ec9e9 (patch) | |
tree | 08e06996e3f794da5acfcc266c27ddf5f48e8dd8 /synapse/util | |
parent | Make errors about email password resets much clearer (#5616) (diff) | |
download | synapse-9481707a52a89022bc5d99c181ceb9e7ec9ec9e9.tar.xz |
Fixes to the federation rate limiter (#5621)
- Put the default window_size back to 1000ms (broken by #5181) - Make the `rc_federation` config actually do something - fix an off-by-one error in the 'concurrent' limit - Avoid creating an unused `_PerHostRatelimiter` object for every single incoming request
Diffstat (limited to 'synapse/util')
-rw-r--r-- | synapse/util/ratelimitutils.py | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/synapse/util/ratelimitutils.py b/synapse/util/ratelimitutils.py index 27bceac00e..5ca4521ce3 100644 --- a/synapse/util/ratelimitutils.py +++ b/synapse/util/ratelimitutils.py @@ -36,9 +36,11 @@ class FederationRateLimiter(object): clock (Clock) config (FederationRateLimitConfig) """ - self.clock = clock - self._config = config - self.ratelimiters = {} + + def new_limiter(): + return _PerHostRatelimiter(clock=clock, config=config) + + self.ratelimiters = collections.defaultdict(new_limiter) def ratelimit(self, host): """Used to ratelimit an incoming request from given host @@ -53,11 +55,9 @@ class FederationRateLimiter(object): host (str): Origin of incoming request. Returns: - _PerHostRatelimiter + context manager which returns a deferred. """ - return self.ratelimiters.setdefault( - host, _PerHostRatelimiter(clock=self.clock, config=self._config) - ).ratelimit() + return self.ratelimiters[host].ratelimit() class _PerHostRatelimiter(object): @@ -122,7 +122,7 @@ class _PerHostRatelimiter(object): self.request_times.append(time_now) def queue_request(): - if len(self.current_processing) > self.concurrent_requests: + if len(self.current_processing) >= self.concurrent_requests: queue_defer = defer.Deferred() self.ready_request_queue[request_id] = queue_defer logger.info( |