diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2018-04-20 11:31:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-20 11:31:17 +0100 |
commit | 11a67b7c9db0da43eb5d9a8df4a0410cbf031d6a (patch) | |
tree | 5c4f2338436ddfc28b4293bf658921519a6168dc /synapse/federation | |
parent | Merge pull request #3117 from matrix-org/rav/refactor_have_events (diff) | |
parent | Reinstate linearizer for federation_server.on_context_state_request (diff) | |
download | synapse-11a67b7c9db0da43eb5d9a8df4a0410cbf031d6a.tar.xz |
Merge pull request #3093 from matrix-org/rav/response_cache_wrap
Refactor ResponseCache usage
Diffstat (limited to 'synapse/federation')
-rw-r--r-- | synapse/federation/federation_server.py | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/synapse/federation/federation_server.py b/synapse/federation/federation_server.py index e4ce037acf..12843fe179 100644 --- a/synapse/federation/federation_server.py +++ b/synapse/federation/federation_server.py @@ -30,7 +30,6 @@ import synapse.metrics from synapse.types import get_domain_from_id from synapse.util import async from synapse.util.caches.response_cache import ResponseCache -from synapse.util.logcontext import make_deferred_yieldable, preserve_fn from synapse.util.logutils import log_function # when processing incoming transactions, we try to handle multiple rooms in @@ -212,16 +211,17 @@ class FederationServer(FederationBase): if not in_room: raise AuthError(403, "Host not in room.") - result = self._state_resp_cache.get((room_id, event_id)) - if not result: - with (yield self._server_linearizer.queue((origin, room_id))): - d = self._state_resp_cache.set( - (room_id, event_id), - preserve_fn(self._on_context_state_request_compute)(room_id, event_id) - ) - resp = yield make_deferred_yieldable(d) - else: - resp = yield make_deferred_yieldable(result) + # we grab the linearizer to protect ourselves from servers which hammer + # us. In theory we might already have the response to this query + # in the cache so we could return it without waiting for the linearizer + # - but that's non-trivial to get right, and anyway somewhat defeats + # the point of the linearizer. + with (yield self._server_linearizer.queue((origin, room_id))): + resp = yield self._state_resp_cache.wrap( + (room_id, event_id), + self._on_context_state_request_compute, + room_id, event_id, + ) defer.returnValue((200, resp)) |