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