|
38 | 38 | from synapse.logging.context import PreserveLoggingContext |
39 | 39 | from synapse.metrics.background_process_metrics import wrap_as_background_process |
40 | 40 | from synapse.metrics.jemalloc import setup_jemalloc_stats |
41 | | -from synapse.util.async_helpers import Linearizer |
42 | 41 | from synapse.util.daemonize import daemonize_process |
43 | 42 | from synapse.util.rlimit import change_resource_limit |
44 | 43 | from synapse.util.versionstring import get_version_string |
@@ -112,8 +111,6 @@ def start_reactor( |
112 | 111 | run_command (Callable[]): callable that actually runs the reactor |
113 | 112 | """ |
114 | 113 |
|
115 | | - install_dns_limiter(reactor) |
116 | | - |
117 | 114 | def run(): |
118 | 115 | logger.info("Running") |
119 | 116 | setup_jemalloc_stats() |
@@ -398,107 +395,6 @@ def setup_sdnotify(hs): |
398 | 395 | ) |
399 | 396 |
|
400 | 397 |
|
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 | | - |
502 | 398 | sdnotify_sockaddr = os.getenv("NOTIFY_SOCKET") |
503 | 399 |
|
504 | 400 |
|
|
0 commit comments