make lightning dns seed fetching async
This commit is contained in:
@@ -22,7 +22,7 @@ import urllib.parse
|
||||
import itertools
|
||||
|
||||
import aiohttp
|
||||
import dns.resolver
|
||||
import dns.asyncresolver
|
||||
import dns.exception
|
||||
from aiorpcx import run_in_thread, NetAddress, ignore_after
|
||||
|
||||
@@ -427,10 +427,9 @@ class LNWorker(Logger, EventListener, NetworkRetryManager[LNPeerAddr]):
|
||||
return [random.choice(fallback_list)]
|
||||
|
||||
# last resort: try dns seeds (BOLT-10)
|
||||
return await run_in_thread(self._get_peers_from_dns_seeds)
|
||||
return await self._get_peers_from_dns_seeds()
|
||||
|
||||
def _get_peers_from_dns_seeds(self) -> Sequence[LNPeerAddr]:
|
||||
# NOTE: potentially long blocking call, do not run directly on asyncio event loop.
|
||||
async def _get_peers_from_dns_seeds(self) -> Sequence[LNPeerAddr]:
|
||||
# Return several peers to reduce the number of dns queries.
|
||||
if not constants.net.LN_DNS_SEEDS:
|
||||
return []
|
||||
@@ -439,7 +438,7 @@ class LNWorker(Logger, EventListener, NetworkRetryManager[LNPeerAddr]):
|
||||
try:
|
||||
# note: this might block for several seconds
|
||||
# this will include bech32-encoded-pubkeys and ports
|
||||
srv_answers = resolve_dns_srv('r{}.{}'.format(
|
||||
srv_answers = await resolve_dns_srv('r{}.{}'.format(
|
||||
constants.net.LN_REALM_BYTE, dns_seed))
|
||||
except dns.exception.DNSException as e:
|
||||
self.logger.info(f'failed querying (1) dns seed "{dns_seed}" for ln peers: {repr(e)}')
|
||||
@@ -451,8 +450,8 @@ class LNWorker(Logger, EventListener, NetworkRetryManager[LNPeerAddr]):
|
||||
peers = []
|
||||
for srv_ans in srv_answers:
|
||||
try:
|
||||
# note: this might block for several seconds
|
||||
answers = dns.resolver.resolve(srv_ans['host'])
|
||||
# note: this might take several seconds
|
||||
answers = await dns.asyncresolver.resolve(srv_ans['host'])
|
||||
except dns.exception.DNSException as e:
|
||||
self.logger.info(f'failed querying (2) dns seed "{dns_seed}" for ln peers: {repr(e)}')
|
||||
continue
|
||||
|
||||
@@ -60,7 +60,7 @@ import aiohttp
|
||||
from aiohttp_socks import ProxyConnector, ProxyType
|
||||
import aiorpcx
|
||||
import certifi
|
||||
import dns.resolver
|
||||
import dns.asyncresolver
|
||||
|
||||
from .i18n import _
|
||||
from .logging import get_logger, Logger
|
||||
@@ -1851,9 +1851,9 @@ def list_enabled_bits(x: int) -> Sequence[int]:
|
||||
return tuple(i for i, b in enumerate(rev_bin) if b == '1')
|
||||
|
||||
|
||||
def resolve_dns_srv(host: str):
|
||||
async def resolve_dns_srv(host: str):
|
||||
# FIXME this method is not using the network proxy. (although the proxy might not support UDP?)
|
||||
srv_records = dns.resolver.resolve(host, 'SRV')
|
||||
srv_records = await dns.asyncresolver.resolve(host, 'SRV')
|
||||
# priority: prefer lower
|
||||
# weight: tie breaker; prefer higher
|
||||
srv_records = sorted(srv_records, key=lambda x: (x.priority, -x.weight))
|
||||
|
||||
Reference in New Issue
Block a user