Add a keyword argument to get_json to avoid retrying on DNS failures. Rather than passing MatrixHttpClient.RETRY_DNS_LOOKUP_FAILURES as a fake query string parameter

pull/6/head
Mark Haines 2014-10-02 14:09:15 +01:00
parent 9435830351
commit 574377636e
6 changed files with 16 additions and 20 deletions

View File

@ -159,7 +159,8 @@ class ReplicationLayer(object):
return defer.succeed(None) return defer.succeed(None)
@log_function @log_function
def make_query(self, destination, query_type, args): def make_query(self, destination, query_type, args,
retry_on_dns_fail=True):
"""Sends a federation Query to a remote homeserver of the given type """Sends a federation Query to a remote homeserver of the given type
and arguments. and arguments.
@ -174,7 +175,9 @@ class ReplicationLayer(object):
a Deferred which will eventually yield a JSON object from the a Deferred which will eventually yield a JSON object from the
response response
""" """
return self.transport_layer.make_query(destination, query_type, args) return self.transport_layer.make_query(
destination, query_type, args, retry_on_dns_fail=retry_on_dns_fail
)
@defer.inlineCallbacks @defer.inlineCallbacks
@log_function @log_function

View File

@ -193,13 +193,14 @@ class TransportLayer(object):
@defer.inlineCallbacks @defer.inlineCallbacks
@log_function @log_function
def make_query(self, destination, query_type, args): def make_query(self, destination, query_type, args, retry_on_dns_fail):
path = PREFIX + "/query/%s" % query_type path = PREFIX + "/query/%s" % query_type
response = yield self.client.get_json( response = yield self.client.get_json(
destination=destination, destination=destination,
path=path, path=path,
args=args args=args,
retry_on_dns_fail=retry_on_dns_fail,
) )
defer.returnValue(response) defer.returnValue(response)

View File

@ -18,7 +18,6 @@ from twisted.internet import defer
from ._base import BaseHandler from ._base import BaseHandler
from synapse.api.errors import SynapseError from synapse.api.errors import SynapseError
from synapse.http.client import MatrixHttpClient
from synapse.api.events.room import RoomAliasesEvent from synapse.api.events.room import RoomAliasesEvent
import logging import logging
@ -98,8 +97,8 @@ class DirectoryHandler(BaseHandler):
query_type="directory", query_type="directory",
args={ args={
"room_alias": room_alias.to_string(), "room_alias": room_alias.to_string(),
MatrixHttpClient.RETRY_DNS_LOOKUP_FAILURES: False },
} retry_on_dns_fail=False,
) )
if result and "room_id" in result and "servers" in result: if result and "room_id" in result and "servers" in result:

View File

@ -183,7 +183,7 @@ class MatrixHttpClient(BaseHttpClient):
defer.returnValue((response.code, body)) defer.returnValue((response.code, body))
@defer.inlineCallbacks @defer.inlineCallbacks
def get_json(self, destination, path, args={}): def get_json(self, destination, path, args={}, retry_on_dns_fail=True):
""" Get's some json from the given host homeserver and path """ Get's some json from the given host homeserver and path
Args: Args:
@ -203,13 +203,6 @@ class MatrixHttpClient(BaseHttpClient):
""" """
logger.debug("get_json args: %s", args) logger.debug("get_json args: %s", args)
retry_on_dns_fail = True
if HttpClient.RETRY_DNS_LOOKUP_FAILURES in args:
# FIXME: This isn't ideal, but the interface exposed in get_json
# isn't comprehensive enough to give caller's any control over
# their connection mechanics.
retry_on_dns_fail = args.pop(HttpClient.RETRY_DNS_LOOKUP_FAILURES)
query_bytes = urllib.urlencode(args, True) query_bytes = urllib.urlencode(args, True)
logger.debug("Query bytes: %s Retry DNS: %s", args, retry_on_dns_fail) logger.debug("Query bytes: %s Retry DNS: %s", args, retry_on_dns_fail)

View File

@ -253,7 +253,7 @@ class FederationTestCase(unittest.TestCase):
response = yield self.federation.make_query( response = yield self.federation.make_query(
destination="remote", destination="remote",
query_type="a-question", query_type="a-question",
args={"one": "1", "two": "2"} args={"one": "1", "two": "2"},
) )
self.assertEquals({"your": "response"}, response) self.assertEquals({"your": "response"}, response)
@ -261,7 +261,8 @@ class FederationTestCase(unittest.TestCase):
self.mock_http_client.get_json.assert_called_with( self.mock_http_client.get_json.assert_called_with(
destination="remote", destination="remote",
path="/_matrix/federation/v1/query/a-question", path="/_matrix/federation/v1/query/a-question",
args={"one": "1", "two": "2"} args={"one": "1", "two": "2"},
retry_on_dns_fail=True,
) )
@defer.inlineCallbacks @defer.inlineCallbacks

View File

@ -20,7 +20,6 @@ from twisted.internet import defer
from mock import Mock from mock import Mock
from synapse.server import HomeServer from synapse.server import HomeServer
from synapse.http.client import MatrixHttpClient
from synapse.handlers.directory import DirectoryHandler from synapse.handlers.directory import DirectoryHandler
from synapse.storage.directory import RoomAliasMapping from synapse.storage.directory import RoomAliasMapping
@ -95,8 +94,8 @@ class DirectoryTestCase(unittest.TestCase):
query_type="directory", query_type="directory",
args={ args={
"room_alias": "#another:remote", "room_alias": "#another:remote",
MatrixHttpClient.RETRY_DNS_LOOKUP_FAILURES: False },
} retry_on_dns_fail=False,
) )
@defer.inlineCallbacks @defer.inlineCallbacks