Merge pull request #2192 from matrix-org/kegan/simple-http-client-timeouts

Rewrite SimpleHttpClient.request to include timeouts
This commit is contained in:
Kegsay 2017-05-05 11:52:43 +01:00 committed by GitHub
commit a59b0ad1a1
1 changed files with 21 additions and 14 deletions

View File

@ -19,6 +19,7 @@ from synapse.api.errors import (
CodeMessageException, MatrixCodeMessageException, SynapseError, Codes, CodeMessageException, MatrixCodeMessageException, SynapseError, Codes,
) )
from synapse.util.logcontext import preserve_context_over_fn from synapse.util.logcontext import preserve_context_over_fn
from synapse.util import logcontext
import synapse.metrics import synapse.metrics
from synapse.http.endpoint import SpiderEndpoint from synapse.http.endpoint import SpiderEndpoint
@ -72,39 +73,45 @@ class SimpleHttpClient(object):
contextFactory=hs.get_http_client_context_factory() contextFactory=hs.get_http_client_context_factory()
) )
self.user_agent = hs.version_string self.user_agent = hs.version_string
self.clock = hs.get_clock()
if hs.config.user_agent_suffix: if hs.config.user_agent_suffix:
self.user_agent = "%s %s" % (self.user_agent, hs.config.user_agent_suffix,) self.user_agent = "%s %s" % (self.user_agent, hs.config.user_agent_suffix,)
@defer.inlineCallbacks
def request(self, method, uri, *args, **kwargs): def request(self, method, uri, *args, **kwargs):
# A small wrapper around self.agent.request() so we can easily attach # A small wrapper around self.agent.request() so we can easily attach
# counters to it # counters to it
outgoing_requests_counter.inc(method) outgoing_requests_counter.inc(method)
d = preserve_context_over_fn(
self.agent.request, def send_request():
method, uri, *args, **kwargs request_deferred = self.agent.request(
) method, uri, *args, **kwargs
)
return self.clock.time_bound_deferred(
request_deferred,
time_out=60,
)
logger.info("Sending request %s %s", method, uri) logger.info("Sending request %s %s", method, uri)
def _cb(response): try:
with logcontext.PreserveLoggingContext():
response = yield send_request()
incoming_responses_counter.inc(method, response.code) incoming_responses_counter.inc(method, response.code)
logger.info( logger.info(
"Received response to %s %s: %s", "Received response to %s %s: %s",
method, uri, response.code method, uri, response.code
) )
return response defer.returnValue(response)
except Exception as e:
def _eb(failure):
incoming_responses_counter.inc(method, "ERR") incoming_responses_counter.inc(method, "ERR")
logger.info( logger.info(
"Error sending request to %s %s: %s %s", "Error sending request to %s %s: %s %s",
method, uri, failure.type, failure.getErrorMessage() method, uri, type(e).__name__, e.message
) )
return failure raise e
d.addCallbacks(_cb, _eb)
return d
@defer.inlineCallbacks @defer.inlineCallbacks
def post_urlencoded_get_json(self, uri, args={}): def post_urlencoded_get_json(self, uri, args={}):