Remove unnecessary reactor reference from `_PerHostRatelimiter` (#14842)

Fix up #14812 to avoid introducing a reference to the reactor.

Signed-off-by: Sean Quah <seanq@matrix.org>
pull/14855/head
Sean Quah 2023-01-16 13:16:19 +00:00 committed by GitHub
parent 7801fd74da
commit a302d3ecf7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 7 additions and 14 deletions

1
changelog.d/14842.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a long-standing bug where Synapse would exhaust the stack when processing many federation requests where the remote homeserver has disconencted early.

View File

@ -310,7 +310,6 @@ class UsernameAvailabilityRestServlet(RestServlet):
self.hs = hs
self.registration_handler = hs.get_registration_handler()
self.ratelimiter = FederationRateLimiter(
hs.get_reactor(),
hs.get_clock(),
FederationRatelimitSettings(
# Time window of 2s

View File

@ -768,7 +768,6 @@ class HomeServer(metaclass=abc.ABCMeta):
@cache_in_self
def get_federation_ratelimiter(self) -> FederationRateLimiter:
return FederationRateLimiter(
self.get_reactor(),
self.get_clock(),
config=self.config.ratelimiting.rc_federation,
metrics_name="federation_servlets",

View File

@ -34,7 +34,6 @@ from prometheus_client.core import Counter
from typing_extensions import ContextManager
from twisted.internet import defer
from twisted.internet.interfaces import IReactorTime
from synapse.api.errors import LimitExceededError
from synapse.config.ratelimiting import FederationRatelimitSettings
@ -147,14 +146,12 @@ class FederationRateLimiter:
def __init__(
self,
reactor: IReactorTime,
clock: Clock,
config: FederationRatelimitSettings,
metrics_name: Optional[str] = None,
):
"""
Args:
reactor
clock
config
metrics_name: The name of the rate limiter so we can differentiate it
@ -166,7 +163,7 @@ class FederationRateLimiter:
def new_limiter() -> "_PerHostRatelimiter":
return _PerHostRatelimiter(
reactor=reactor, clock=clock, config=config, metrics_name=metrics_name
clock=clock, config=config, metrics_name=metrics_name
)
self.ratelimiters: DefaultDict[
@ -197,14 +194,12 @@ class FederationRateLimiter:
class _PerHostRatelimiter:
def __init__(
self,
reactor: IReactorTime,
clock: Clock,
config: FederationRatelimitSettings,
metrics_name: Optional[str] = None,
):
"""
Args:
reactor
clock
config
metrics_name: The name of the rate limiter so we can differentiate it
@ -212,7 +207,6 @@ class _PerHostRatelimiter:
for this rate limiter.
from the rest in the metrics
"""
self.reactor = reactor
self.clock = clock
self.metrics_name = metrics_name
@ -388,4 +382,4 @@ class _PerHostRatelimiter:
except KeyError:
pass
self.reactor.callLater(0.0, start_next_request)
self.clock.call_later(0.0, start_next_request)

View File

@ -30,7 +30,7 @@ class FederationRateLimiterTestCase(TestCase):
"""A simple test with the default values"""
reactor, clock = get_clock()
rc_config = build_rc_config()
ratelimiter = FederationRateLimiter(reactor, clock, rc_config)
ratelimiter = FederationRateLimiter(clock, rc_config)
with ratelimiter.ratelimit("testhost") as d1:
# shouldn't block
@ -40,7 +40,7 @@ class FederationRateLimiterTestCase(TestCase):
"""Test what happens when we hit the concurrent limit"""
reactor, clock = get_clock()
rc_config = build_rc_config({"rc_federation": {"concurrent": 2}})
ratelimiter = FederationRateLimiter(reactor, clock, rc_config)
ratelimiter = FederationRateLimiter(clock, rc_config)
with ratelimiter.ratelimit("testhost") as d1:
# shouldn't block
@ -67,7 +67,7 @@ class FederationRateLimiterTestCase(TestCase):
rc_config = build_rc_config(
{"rc_federation": {"sleep_limit": 2, "sleep_delay": 500}}
)
ratelimiter = FederationRateLimiter(reactor, clock, rc_config)
ratelimiter = FederationRateLimiter(clock, rc_config)
with ratelimiter.ratelimit("testhost") as d1:
# shouldn't block
@ -98,7 +98,7 @@ class FederationRateLimiterTestCase(TestCase):
}
}
)
ratelimiter = FederationRateLimiter(reactor, clock, rc_config)
ratelimiter = FederationRateLimiter(clock, rc_config)
with ratelimiter.ratelimit("testhost") as d:
# shouldn't block