From 2e12ceeaed5124129bb1a71993a243524044f93f Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Tue, 2 Jan 2024 21:49:27 +0800 Subject: [PATCH] chore: stop retry when `couldn't find ip` --- dns/util.go | 6 ++---- tunnel/tunnel.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/dns/util.go b/dns/util.go index f2243917..516c63fb 100644 --- a/dns/util.go +++ b/dns/util.go @@ -289,8 +289,6 @@ func listenPacket(ctx context.Context, proxyAdapter C.ProxyAdapter, proxyName st return proxyAdapter.ListenPacketContext(ctx, metadata, opts...) } -var errIPNotFound = errors.New("couldn't find ip") - func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.Msg, cache bool, err error) { cache = true fast, ctx := picker.WithTimeout[*D.Msg](ctx, resolver.DefaultDNSTimeout) @@ -320,12 +318,12 @@ func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.M case D.TypeAAAA: if len(ips) == 0 { noIpMsg = m - return nil, errIPNotFound + return nil, resolver.ErrIPNotFound } case D.TypeA: if len(ips) == 0 { noIpMsg = m - return nil, errIPNotFound + return nil, resolver.ErrIPNotFound } } } diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index 18c1eb09..cba36d9c 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -2,6 +2,7 @@ package tunnel import ( "context" + "errors" "fmt" "net" "net/netip" @@ -684,6 +685,19 @@ func getRules(metadata *C.Metadata) []C.Rule { } } +func shouldStopRetry(err error) bool { + if errors.Is(err, resolver.ErrIPNotFound) { + return true + } + if errors.Is(err, resolver.ErrIPVersion) { + return true + } + if errors.Is(err, resolver.ErrIPv6Disabled) { + return true + } + return false +} + func retry[T any](ctx context.Context, ft func(context.Context) (T, error), fe func(err error)) (t T, err error) { b := &backoff.Backoff{ Min: 10 * time.Millisecond, @@ -697,6 +711,9 @@ func retry[T any](ctx context.Context, ft func(context.Context) (T, error), fe f if fe != nil { fe(err) } + if shouldStopRetry(err) { + return + } select { case <-time.After(b.Duration()): continue