From f90ca34fb963b21ca404d88a1a06851d65a09562 Mon Sep 17 00:00:00 2001 From: f321x Date: Fri, 16 May 2025 12:42:59 +0200 Subject: [PATCH] use async dns interface in dnshacks --- electrum/dns_hacks.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/electrum/dns_hacks.py b/electrum/dns_hacks.py index 707847a0b..43e0c2613 100644 --- a/electrum/dns_hacks.py +++ b/electrum/dns_hacks.py @@ -7,18 +7,16 @@ import socket import concurrent from concurrent import futures import ipaddress -from typing import Optional +import asyncio import dns -import dns.resolver +import dns.asyncresolver from .logging import get_logger - +from .util import get_asyncio_loop _logger = get_logger(__name__) -_dns_threads_executor = None # type: Optional[concurrent.futures.Executor] - def configure_dns_resolver() -> None: # Store this somewhere so we can un-monkey-patch: @@ -38,16 +36,11 @@ def configure_dns_resolver() -> None: def _prepare_windows_dns_hack(): # enable dns cache - resolver = dns.resolver.get_default_resolver() + resolver = dns.asyncresolver.get_default_resolver() if resolver.cache is None: resolver.cache = dns.resolver.Cache() # ensure overall timeout for requests is long enough resolver.lifetime = max(resolver.lifetime or 1, 30.0) - # prepare threads - global _dns_threads_executor - if _dns_threads_executor is None: - _dns_threads_executor = concurrent.futures.ThreadPoolExecutor(max_workers=20, - thread_name_prefix='dns_resolver') def _is_force_system_dns_for_host(host: str) -> bool: @@ -69,8 +62,15 @@ def _fast_getaddrinfo(host, *args, **kwargs): addrs = [] expected_errors = (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, concurrent.futures.CancelledError, concurrent.futures.TimeoutError) - ipv6_fut = _dns_threads_executor.submit(dns.resolver.resolve, host, dns.rdatatype.AAAA) - ipv4_fut = _dns_threads_executor.submit(dns.resolver.resolve, host, dns.rdatatype.A) + loop = get_asyncio_loop() + ipv6_fut = asyncio.run_coroutine_threadsafe( + dns.asyncresolver.resolve(host, dns.rdatatype.AAAA), + loop, + ) + ipv4_fut = asyncio.run_coroutine_threadsafe( + dns.asyncresolver.resolve(host, dns.rdatatype.A), + loop, + ) # try IPv6 try: answers = ipv6_fut.result()