Skip to content

Commit 0145b4e

Browse files
committed
srv_resolver: add 15s timeout to DNS lookups
1 parent 631eed9 commit 0145b4e

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

changelog.d/19026.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Reduces the SRV DNS record lookup timeout to 15 seconds

synapse/http/federation/srv_resolver.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import attr
2828

29+
from twisted.internet import defer
2930
from twisted.internet.error import ConnectError
3031
from twisted.names import client, dns
3132
from twisted.names.error import DNSNameError, DNSNotImplementedError, DomainError
@@ -145,7 +146,7 @@ async def resolve_service(self, service_name: bytes) -> List[Server]:
145146

146147
try:
147148
answers, _, _ = await make_deferred_yieldable(
148-
self._dns_client.lookupService(service_name)
149+
self._dns_client.lookupService(service_name, timeout=(1, 1, 2, 4, 2))
149150
)
150151
except DNSNameError:
151152
# TODO: cache this. We can get the SOA out of the exception, and use
@@ -165,6 +166,10 @@ async def resolve_service(self, service_name: bytes) -> List[Server]:
165166
return list(cache_entry)
166167
else:
167168
raise e
169+
except defer.TimeoutError as e:
170+
raise defer.TimeoutError(
171+
f"Could not resolve DNS for SRV record {service_name!r} due to timeout (50s total)"
172+
) from e
168173

169174
if (
170175
len(answers) == 1

tests/http/federation/test_srv_resolver.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ def do_lookup() -> Generator["Deferred[object]", object, List[Server]]:
6868
test_d = do_lookup()
6969
self.assertNoResult(test_d)
7070

71-
dns_client_mock.lookupService.assert_called_once_with(service_name)
71+
dns_client_mock.lookupService.assert_called_once_with(
72+
service_name, timeout=(15,)
73+
)
7274

7375
result_deferred.callback(([answer_srv], None, None))
7476

@@ -98,7 +100,9 @@ def test_from_cache_expired_and_dns_fail(
98100
servers: List[Server]
99101
servers = yield defer.ensureDeferred(resolver.resolve_service(service_name)) # type: ignore[assignment]
100102

101-
dns_client_mock.lookupService.assert_called_once_with(service_name)
103+
dns_client_mock.lookupService.assert_called_once_with(
104+
service_name, timeout=(15,)
105+
)
102106

103107
self.assertEqual(len(servers), 1)
104108
self.assertEqual(servers, cache[service_name])

0 commit comments

Comments
 (0)