Fix incorrect juggling of logging contexts in `_PerHostRatelimiter` (#13554)

Signed-off-by: Sean Quah <seanq@matrix.org>

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
This commit is contained in:
Sean Quah 2022-08-18 16:26:26 +01:00 committed by GitHub
parent d64653d062
commit b251cff819
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 10 deletions

1
changelog.d/13554.misc Normal file
View File

@ -0,0 +1 @@
Instrument `FederationStateIdsServlet` (`/state_ids`) for understandable traces in Jaeger.

View File

@ -154,7 +154,9 @@ class _PerHostRatelimiter:
self.host = host self.host = host
request_id = object() request_id = object()
ret = self._on_enter(request_id) # Ideally we'd use `Deferred.fromCoroutine()` here, to save on redundant
# type-checking, but we'd need Twisted >= 21.2.
ret = defer.ensureDeferred(self._on_enter_with_tracing(request_id))
try: try:
yield ret yield ret
finally: finally:
@ -175,6 +177,10 @@ class _PerHostRatelimiter:
""" """
return len(self.request_times) > self.sleep_limit return len(self.request_times) > self.sleep_limit
async def _on_enter_with_tracing(self, request_id: object) -> None:
with start_active_span("ratelimit wait"), queue_wait_timer.time():
await self._on_enter(request_id)
def _on_enter(self, request_id: object) -> "defer.Deferred[None]": def _on_enter(self, request_id: object) -> "defer.Deferred[None]":
time_now = self.clock.time_msec() time_now = self.clock.time_msec()
@ -257,17 +263,8 @@ class _PerHostRatelimiter:
# Ensure that we've properly cleaned up. # Ensure that we've properly cleaned up.
self.sleeping_requests.discard(request_id) self.sleeping_requests.discard(request_id)
self.ready_request_queue.pop(request_id, None) self.ready_request_queue.pop(request_id, None)
wait_span_scope.__exit__(None, None, None)
wait_timer_cm.__exit__(None, None, None)
return r return r
# Tracing
wait_span_scope = start_active_span("ratelimit wait")
wait_span_scope.__enter__()
# Metrics
wait_timer_cm = queue_wait_timer.time()
wait_timer_cm.__enter__()
ret_defer.addCallbacks(on_start, on_err) ret_defer.addCallbacks(on_start, on_err)
ret_defer.addBoth(on_both) ret_defer.addBoth(on_both)
return make_deferred_yieldable(ret_defer) return make_deferred_yieldable(ret_defer)