From 20fa815c21f4ddf369025141020fca402cbef5d8 Mon Sep 17 00:00:00 2001 From: battlmonstr Date: Mon, 10 Jun 2024 16:10:20 +0200 Subject: [PATCH] downloader: Number of DNS requests seem excessive (#5145) --- erigon-lib/downloader/downloader.go | 7 +++ .../downloadercfg/dns_cache_resolver.go | 49 +++++++++++++++++++ erigon-lib/go.mod | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 erigon-lib/downloader/downloadercfg/dns_cache_resolver.go diff --git a/erigon-lib/downloader/downloader.go b/erigon-lib/downloader/downloader.go index 10653fbeed4..2915fa6ca29 100644 --- a/erigon-lib/downloader/downloader.go +++ b/erigon-lib/downloader/downloader.go @@ -2591,10 +2591,17 @@ func openClient(ctx context.Context, dbDir, snapDir string, cfg *torrent.ClientC //}) cfg.DefaultStorage = m + dnsResolver := &downloadercfg.DnsCacheResolver{RefreshTimeout: 24 * time.Hour} + cfg.TrackerDialContext = dnsResolver.DialContext + torrentClient, err = torrent.NewClient(cfg) if err != nil { return nil, nil, nil, nil, fmt.Errorf("torrent.NewClient: %w", err) } + go func() { + dnsResolver.Run(ctx) + }() + return db, c, m, torrentClient, nil } diff --git a/erigon-lib/downloader/downloadercfg/dns_cache_resolver.go b/erigon-lib/downloader/downloadercfg/dns_cache_resolver.go new file mode 100644 index 00000000000..1aab7c41f7d --- /dev/null +++ b/erigon-lib/downloader/downloadercfg/dns_cache_resolver.go @@ -0,0 +1,49 @@ +package downloadercfg + +import ( + "context" + "net" + "time" + + "github.com/rs/dnscache" +) + +// DnsCacheResolver resolves DNS requests for an HTTP client using an in-memory cache. +type DnsCacheResolver struct { + RefreshTimeout time.Duration + + resolver dnscache.Resolver +} + +func (r *DnsCacheResolver) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + host, port, err := net.SplitHostPort(address) + if err != nil { + return nil, err + } + ips, err := r.resolver.LookupHost(ctx, host) + if err != nil { + return nil, err + } + var conn net.Conn + for _, ip := range ips { + var dialer net.Dialer + conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip, port)) + if err == nil { + break + } + } + return conn, err +} + +func (r *DnsCacheResolver) Run(ctx context.Context) { + ticker := time.NewTicker(r.RefreshTimeout) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + r.resolver.Refresh(true) + } + } +} diff --git a/erigon-lib/go.mod b/erigon-lib/go.mod index 175d8181fa6..088ea142fa0 100644 --- a/erigon-lib/go.mod +++ b/erigon-lib/go.mod @@ -8,6 +8,7 @@ require ( github.com/ledgerwatch/interfaces v0.0.0-20240320062914-b57f05746087 github.com/ledgerwatch/log/v3 v3.9.0 github.com/ledgerwatch/secp256k1 v1.0.0 + github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 ) require ( @@ -125,7 +126,6 @@ require ( github.com/prometheus/common v0.48.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/showwin/speedtest-go v1.6.12 github.com/sirupsen/logrus v1.9.3 // indirect