diff options
-rw-r--r-- | client/dial.go | 1 | ||||
-rw-r--r-- | go.mod | 18 | ||||
-rw-r--r-- | go.sum | 31 | ||||
-rw-r--r-- | internal/grpc/dnsresolver/builder.go | 19 | ||||
-rw-r--r-- | internal/grpc/dnsresolver/builder_test.go | 15 | ||||
-rw-r--r-- | internal/grpc/dnsresolver/resolver.go | 27 | ||||
-rw-r--r-- | internal/grpc/dnsresolver/resolver_test.go | 13 | ||||
-rw-r--r-- | internal/grpc/dnsresolver/testhelper_test.go | 7 |
8 files changed, 80 insertions, 51 deletions
diff --git a/client/dial.go b/client/dial.go index 4776109f7..2d7fc18e3 100644 --- a/client/dial.go +++ b/client/dial.go @@ -79,6 +79,7 @@ type DNSResolverBuilderConfig dnsresolver.BuilderConfig func DefaultDNSResolverBuilderConfig() *DNSResolverBuilderConfig { return &DNSResolverBuilderConfig{ RefreshRate: 5 * time.Minute, + LookupTimeout: 15 * time.Second, Logger: logrus.StandardLogger(), Backoff: backoff.NewDefaultExponential(rand.New(rand.NewSource(time.Now().UnixNano()))), DefaultGrpcPort: "443", @@ -44,19 +44,19 @@ require ( golang.org/x/sync v0.3.0 golang.org/x/sys v0.9.0 golang.org/x/time v0.3.0 - google.golang.org/grpc v1.55.0 + google.golang.org/grpc v1.56.0 google.golang.org/protobuf v1.30.0 ) require ( cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute v1.19.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.12.0 // indirect - cloud.google.com/go/monitoring v1.12.0 // indirect + cloud.google.com/go/iam v0.13.0 // indirect + cloud.google.com/go/monitoring v1.13.0 // indirect cloud.google.com/go/profiler v0.1.0 // indirect cloud.google.com/go/storage v1.29.0 // indirect - cloud.google.com/go/trace v1.8.0 // indirect + cloud.google.com/go/trace v1.9.0 // indirect contrib.go.opencensus.io/exporter/stackdriver v0.13.14 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 // indirect @@ -127,7 +127,7 @@ require ( github.com/google/pprof v0.0.0-20230111200839-76d1ae5aea2b // indirect github.com/google/wire v0.5.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hhatto/gorst v0.0.0-20181029133204-ca9f730cac5b // indirect github.com/imdario/mergo v0.3.13 // indirect @@ -183,14 +183,14 @@ require ( go.uber.org/atomic v1.10.0 // indirect golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/text v0.10.0 // indirect golang.org/x/tools v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gonum.org/v1/gonum v0.8.2 // indirect - google.golang.org/api v0.110.0 // indirect + google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 // indirect gopkg.in/neurosnap/sentences.v1 v1.0.7 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect @@ -124,8 +124,9 @@ cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -218,8 +219,8 @@ cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHD cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.10.0/go.mod h1:nXAECrMt2qHpF6RZUZseteD6QyanL68reN4OXPw0UWM= -cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= @@ -257,8 +258,9 @@ cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0 h1:+X79DyOP/Ny23XIqSIb37AvFWSxDN15w/ktklVvPLso= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0 h1:2qsrgXGVoRXpP7otZ14eE1I568zAa92sJSDPyOJvwjM= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -386,8 +388,9 @@ cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227 cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0 h1:GFPLxbp5/FzdgTzor3nlNYNxMd6hLmzkE7sA9F0qQcA= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0 h1:olxC0QHC59zgJVALtgqfD9tGk0lfeCP5/AGXL3Px/no= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= @@ -1268,8 +1271,9 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= @@ -2427,8 +2431,8 @@ golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2827,8 +2831,9 @@ google.golang.org/api v0.104.0/go.mod h1:JCspTXJbBxa5ySXw4UgUqVer7DfVxbvc/CTUFqA google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2974,8 +2979,8 @@ google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -3020,8 +3025,8 @@ google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.52.1/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.0 h1:+y7Bs8rtMd07LeXmL3NxcTLn7mUkbKZqEpPhMNkwJEE= +google.golang.org/grpc v1.56.0/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/internal/grpc/dnsresolver/builder.go b/internal/grpc/dnsresolver/builder.go index eaf1e4299..8dba5ab54 100644 --- a/internal/grpc/dnsresolver/builder.go +++ b/internal/grpc/dnsresolver/builder.go @@ -28,6 +28,8 @@ type BuilderConfig struct { // RefreshRate determines the periodic refresh rate of the resolver. The resolver may issue // the resolver earlier if client connection demands RefreshRate time.Duration + // LookupTimeout determines the timeout of underlying DNS query. + LookupTimeout time.Duration // Logger defines a logger for logging internal activities Logger *logrus.Logger // Backoff defines the backoff strategy when the resolver fails to resolve or pushes new @@ -94,14 +96,15 @@ func (d *Builder) Build(target resolver.Target, cc resolver.ClientConn, _ resolv logger: logrus.NewEntry(d.opts.Logger).WithField("target", target.URL.String()), retry: d.opts.Backoff, - ctx: ctx, - cancel: cancel, - host: host, - port: port, - cc: cc, - refreshRate: d.opts.RefreshRate, - lookup: lookup, - reqs: make(chan struct{}, 1), + ctx: ctx, + cancel: cancel, + host: host, + port: port, + cc: cc, + refreshRate: d.opts.RefreshRate, + lookupTimeout: d.opts.LookupTimeout, + lookup: lookup, + reqs: make(chan struct{}, 1), } dr.wg.Add(1) diff --git a/internal/grpc/dnsresolver/builder_test.go b/internal/grpc/dnsresolver/builder_test.go index 7cbbf711c..4637a4712 100644 --- a/internal/grpc/dnsresolver/builder_test.go +++ b/internal/grpc/dnsresolver/builder_test.go @@ -4,6 +4,7 @@ import ( "net" "net/url" "testing" + "time" "github.com/miekg/dns" "github.com/stretchr/testify/require" @@ -69,9 +70,10 @@ func TestBuildDNSBuilder_customAuthorityResolver(t *testing.T) { }).Start() builder := NewBuilder(&BuilderConfig{ - RefreshRate: 0, - Logger: testhelper.NewDiscardingLogger(t), - Backoff: &fakeBackoff{}, + RefreshRate: 0, + LookupTimeout: 15 * time.Second, + Logger: testhelper.NewDiscardingLogger(t), + Backoff: &fakeBackoff{}, }) conn := newFakeClientConn(1, 0) @@ -115,9 +117,10 @@ func TestBuildDNSBuilder_staticIPAddress(t *testing.T) { }).Start() builder := NewBuilder(&BuilderConfig{ - RefreshRate: 0, - Logger: testhelper.NewDiscardingLogger(t), - Backoff: &fakeBackoff{}, + RefreshRate: 0, + LookupTimeout: 15 * time.Second, + Logger: testhelper.NewDiscardingLogger(t), + Backoff: &fakeBackoff{}, }) conn := newFakeClientConn(1, 0) diff --git a/internal/grpc/dnsresolver/resolver.go b/internal/grpc/dnsresolver/resolver.go index a6ecf3136..01faa1f81 100644 --- a/internal/grpc/dnsresolver/resolver.go +++ b/internal/grpc/dnsresolver/resolver.go @@ -16,18 +16,19 @@ type dnsResolver struct { logger *logrus.Entry retry backoff.Strategy - ctx context.Context - cancel context.CancelFunc - cc resolver.ClientConn - host string - port string - refreshRate time.Duration - lookup dnsLookuper - reqs chan struct{} - wg sync.WaitGroup + ctx context.Context + cancel context.CancelFunc + cc resolver.ClientConn + host string + port string + refreshRate time.Duration + lookupTimeout time.Duration + lookup dnsLookuper + reqs chan struct{} + wg sync.WaitGroup } -var dnsLookupTimeout = 15 * time.Second +var defaultLookupTimeout = 15 * time.Second type dnsLookuper interface { LookupHost(context.Context, string) ([]string, error) @@ -101,7 +102,11 @@ func (d *dnsResolver) updateState(state *resolver.State) error { } func (d *dnsResolver) resolve() (*resolver.State, error) { - ctx, cancel := context.WithTimeout(d.ctx, dnsLookupTimeout) + timeout := d.lookupTimeout + if timeout == 0 { + timeout = defaultLookupTimeout + } + ctx, cancel := context.WithTimeout(d.ctx, timeout) defer cancel() addrs, err := d.lookup.LookupHost(ctx, d.host) diff --git a/internal/grpc/dnsresolver/resolver_test.go b/internal/grpc/dnsresolver/resolver_test.go index 0f05d20e3..e67f06b6a 100644 --- a/internal/grpc/dnsresolver/resolver_test.go +++ b/internal/grpc/dnsresolver/resolver_test.go @@ -297,6 +297,7 @@ func TestDnsResolver(t *testing.T) { t.Run(tc.name, func(t *testing.T) { builder := NewBuilder(&BuilderConfig{ RefreshRate: 0, // No delay + LookupTimeout: 15 * time.Second, Logger: testhelper.NewDiscardingLogger(t), DefaultGrpcPort: "1234", Backoff: &fakeBackoff{}, @@ -343,19 +344,29 @@ func TestDnsResolver_grpcCallWithOurDNSResolver(t *testing.T) { grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithResolvers(NewBuilder(&BuilderConfig{ RefreshRate: 0, // No delay + LookupTimeout: 500 * time.Millisecond, Logger: testhelper.NewDiscardingLogger(t), DefaultGrpcPort: "1234", Backoff: backoff.NewDefaultExponential(rand.New(rand.NewSource(time.Now().UnixNano()))), })), ) require.NoError(t, err) - defer testhelper.MustClose(t, conn) client := grpc_testing.NewTestServiceClient(conn) for i := 0; i < 10; i++ { _, err = client.UnaryCall(testhelper.Context(t), &grpc_testing.SimpleRequest{}) require.NoError(t, err) } + + testhelper.MustClose(t, conn) + // In the grpc-go versions before v1.56, the resolver is closed when the bound connection is closed. After + // v1.56, the resolver runs more independently. The connection doesn't wait for the resolver to finish anymore. + // After the test suite finishes, there might be some in-flight DNS queries managed by the DNS resolver. When + // the connection is closed, those queries don't make sense anymore. They can stay until they finish. + // Unfortunately, the goroutine detector in the test suite complains about leaked goroutines. The resolver of + // a connection is not accessible from the outside. Hence, this test sets a low lookup timeout and sleep for + // a while until the pending DNS queries go away. + time.Sleep(1 * time.Second) } func spawnTestGRPCServer(t *testing.T) net.Listener { diff --git a/internal/grpc/dnsresolver/testhelper_test.go b/internal/grpc/dnsresolver/testhelper_test.go index eded29045..2e61c77d9 100644 --- a/internal/grpc/dnsresolver/testhelper_test.go +++ b/internal/grpc/dnsresolver/testhelper_test.go @@ -123,9 +123,10 @@ func buildResolverTarget(s *testhelper.FakeDNSServer, addr string) resolver.Targ func newTestDNSBuilder(t *testing.T) *Builder { return NewBuilder(&BuilderConfig{ - RefreshRate: 0, - Logger: testhelper.NewDiscardingLogger(t), - Backoff: &fakeBackoff{}, + RefreshRate: 0, + LookupTimeout: 10 * time.Second, + Logger: testhelper.NewDiscardingLogger(t), + Backoff: &fakeBackoff{}, }) } |