Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 9cf6e0e

Browse files
authored
Rip out the DNS lookup limiter (#10190)
As I've written in various places in the past (#7113, #9865) I'm pretty sure this is doing nothing useful at all.
1 parent 8070b89 commit 9cf6e0e

File tree

2 files changed

+1
-104
lines changed

2 files changed

+1
-104
lines changed

changelog.d/10190.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove redundant DNS lookup limiter.

synapse/app/_base.py

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
from synapse.logging.context import PreserveLoggingContext
3939
from synapse.metrics.background_process_metrics import wrap_as_background_process
4040
from synapse.metrics.jemalloc import setup_jemalloc_stats
41-
from synapse.util.async_helpers import Linearizer
4241
from synapse.util.daemonize import daemonize_process
4342
from synapse.util.rlimit import change_resource_limit
4443
from synapse.util.versionstring import get_version_string
@@ -112,8 +111,6 @@ def start_reactor(
112111
run_command (Callable[]): callable that actually runs the reactor
113112
"""
114113

115-
install_dns_limiter(reactor)
116-
117114
def run():
118115
logger.info("Running")
119116
setup_jemalloc_stats()
@@ -398,107 +395,6 @@ def setup_sdnotify(hs):
398395
)
399396

400397

401-
def install_dns_limiter(reactor, max_dns_requests_in_flight=100):
402-
"""Replaces the resolver with one that limits the number of in flight DNS
403-
requests.
404-
405-
This is to workaround https://twistedmatrix.com/trac/ticket/9620, where we
406-
can run out of file descriptors and infinite loop if we attempt to do too
407-
many DNS queries at once
408-
409-
XXX: I'm confused by this. reactor.nameResolver does not use twisted.names unless
410-
you explicitly install twisted.names as the resolver; rather it uses a GAIResolver
411-
backed by the reactor's default threadpool (which is limited to 10 threads). So
412-
(a) I don't understand why twisted ticket 9620 is relevant, and (b) I don't
413-
understand why we would run out of FDs if we did too many lookups at once.
414-
-- richvdh 2020/08/29
415-
"""
416-
new_resolver = _LimitedHostnameResolver(
417-
reactor.nameResolver, max_dns_requests_in_flight
418-
)
419-
420-
reactor.installNameResolver(new_resolver)
421-
422-
423-
class _LimitedHostnameResolver:
424-
"""Wraps a IHostnameResolver, limiting the number of in-flight DNS lookups."""
425-
426-
def __init__(self, resolver, max_dns_requests_in_flight):
427-
self._resolver = resolver
428-
self._limiter = Linearizer(
429-
name="dns_client_limiter", max_count=max_dns_requests_in_flight
430-
)
431-
432-
def resolveHostName(
433-
self,
434-
resolutionReceiver,
435-
hostName,
436-
portNumber=0,
437-
addressTypes=None,
438-
transportSemantics="TCP",
439-
):
440-
# We need this function to return `resolutionReceiver` so we do all the
441-
# actual logic involving deferreds in a separate function.
442-
443-
# even though this is happening within the depths of twisted, we need to drop
444-
# our logcontext before starting _resolve, otherwise: (a) _resolve will drop
445-
# the logcontext if it returns an incomplete deferred; (b) _resolve will
446-
# call the resolutionReceiver *with* a logcontext, which it won't be expecting.
447-
with PreserveLoggingContext():
448-
self._resolve(
449-
resolutionReceiver,
450-
hostName,
451-
portNumber,
452-
addressTypes,
453-
transportSemantics,
454-
)
455-
456-
return resolutionReceiver
457-
458-
@defer.inlineCallbacks
459-
def _resolve(
460-
self,
461-
resolutionReceiver,
462-
hostName,
463-
portNumber=0,
464-
addressTypes=None,
465-
transportSemantics="TCP",
466-
):
467-
468-
with (yield self._limiter.queue(())):
469-
# resolveHostName doesn't return a Deferred, so we need to hook into
470-
# the receiver interface to get told when resolution has finished.
471-
472-
deferred = defer.Deferred()
473-
receiver = _DeferredResolutionReceiver(resolutionReceiver, deferred)
474-
475-
self._resolver.resolveHostName(
476-
receiver, hostName, portNumber, addressTypes, transportSemantics
477-
)
478-
479-
yield deferred
480-
481-
482-
class _DeferredResolutionReceiver:
483-
"""Wraps a IResolutionReceiver and simply resolves the given deferred when
484-
resolution is complete
485-
"""
486-
487-
def __init__(self, receiver, deferred):
488-
self._receiver = receiver
489-
self._deferred = deferred
490-
491-
def resolutionBegan(self, resolutionInProgress):
492-
self._receiver.resolutionBegan(resolutionInProgress)
493-
494-
def addressResolved(self, address):
495-
self._receiver.addressResolved(address)
496-
497-
def resolutionComplete(self):
498-
self._deferred.callback(())
499-
self._receiver.resolutionComplete()
500-
501-
502398
sdnotify_sockaddr = os.getenv("NOTIFY_SOCKET")
503399

504400

0 commit comments

Comments
 (0)