diff --git a/synapse/app/_base.py b/synapse/app/_base.py
index bb4d53d778..f2c1028b5d 100644
--- a/synapse/app/_base.py
+++ b/synapse/app/_base.py
@@ -31,6 +31,7 @@ import twisted
from twisted.internet import defer, error, reactor
from twisted.logger import LoggingFile, LogLevel
from twisted.protocols.tls import TLSMemoryBIOFactory
+from twisted.python.threadpool import ThreadPool
import synapse
from synapse.api.constants import MAX_PDU_SIZE
@@ -44,10 +45,12 @@ from synapse.events.spamcheck import load_legacy_spam_checkers
from synapse.events.third_party_rules import load_legacy_third_party_event_rules
from synapse.handlers.auth import load_legacy_password_auth_providers
from synapse.logging.context import PreserveLoggingContext
+from synapse.metrics import register_threadpool
from synapse.metrics.background_process_metrics import wrap_as_background_process
from synapse.metrics.jemalloc import setup_jemalloc_stats
from synapse.util.caches.lrucache import setup_expire_lru_cache_entries
from synapse.util.daemonize import daemonize_process
+from synapse.util.gai_resolver import GAIResolver
from synapse.util.rlimit import change_resource_limit
from synapse.util.versionstring import get_version_string
@@ -294,7 +297,7 @@ def listen_ssl(
return r
-def refresh_certificate(hs):
+def refresh_certificate(hs: "HomeServer"):
"""
Refresh the TLS certificates that Synapse is using by re-reading them from
disk and updating the TLS context factories to use them.
@@ -338,9 +341,23 @@ async def start(hs: "HomeServer"):
Args:
hs: homeserver instance
"""
+ reactor = hs.get_reactor()
+
+ # We want to use a separate thread pool for the resolver so that large
+ # numbers of DNS requests don't starve out other users of the threadpool.
+ resolver_threadpool = ThreadPool(name="gai_resolver")
+ resolver_threadpool.start()
+ reactor.addSystemEventTrigger("during", "shutdown", resolver_threadpool.stop)
+ reactor.installNameResolver(
+ GAIResolver(reactor, getThreadPool=lambda: resolver_threadpool)
+ )
+
+ # Register the threadpools with our metrics.
+ register_threadpool("default", reactor.getThreadPool())
+ register_threadpool("gai_resolver", resolver_threadpool)
+
# Set up the SIGHUP machinery.
if hasattr(signal, "SIGHUP"):
- reactor = hs.get_reactor()
@wrap_as_background_process("sighup")
def handle_sighup(*args, **kwargs):
@@ -419,11 +436,11 @@ async def start(hs: "HomeServer"):
atexit.register(gc.freeze)
-def setup_sentry(hs):
+def setup_sentry(hs: "HomeServer"):
"""Enable sentry integration, if enabled in configuration
Args:
- hs (synapse.server.HomeServer)
+ hs
"""
if not hs.config.metrics.sentry_enabled:
@@ -449,7 +466,7 @@ def setup_sentry(hs):
scope.set_tag("worker_name", name)
-def setup_sdnotify(hs):
+def setup_sdnotify(hs: "HomeServer"):
"""Adds process state hooks to tell systemd what we are up to."""
# Tell systemd our state, if we're using it. This will silently fail if
|