|
|
@ -211,11 +211,17 @@ class FederationServer(FederationBase): |
|
|
|
if not in_room: |
|
|
|
if not in_room: |
|
|
|
raise AuthError(403, "Host not in room.") |
|
|
|
raise AuthError(403, "Host not in room.") |
|
|
|
|
|
|
|
|
|
|
|
resp = yield self._state_resp_cache.wrap( |
|
|
|
# we grab the linearizer to protect ourselves from servers which hammer |
|
|
|
(room_id, event_id), |
|
|
|
# us. In theory we might already have the response to this query |
|
|
|
self._on_context_state_request_compute, |
|
|
|
# in the cache so we could return it without waiting for the linearizer |
|
|
|
room_id, event_id, |
|
|
|
# - 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)) |
|
|
|
defer.returnValue((200, resp)) |
|
|
|
|
|
|
|
|
|
|
|