Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuang-Minh Nguyen <qmnguyen@gitlab.com>2023-07-04 07:26:54 +0300
committerQuang-Minh Nguyen <qmnguyen@gitlab.com>2023-07-04 07:26:54 +0300
commit25fbd040740121576144a38413229d2cc571aca6 (patch)
treedb2ce4998e5f9963bc589d67fa7fe21a1f6412cc
parentc7b8a120abe2f63b6522bd409f2b17a653913230 (diff)
parent45e18fa393973003fd83a857d485e8b50e4864b2 (diff)
Merge branch 'qmnguyen0711/add-lookup-timeout-configuration' into 'master'
Bump grpc v1.56 and add LookupTimeout configuration to DNS resolver See merge request https://gitlab.com/gitlab-org/gitaly/-/merge_requests/5978 Merged-by: Quang-Minh Nguyen <qmnguyen@gitlab.com> Approved-by: karthik nayak <knayak@gitlab.com> Reviewed-by: Justin Tobler <jtobler@gitlab.com> Reviewed-by: karthik nayak <knayak@gitlab.com>
-rw-r--r--client/dial.go1
-rw-r--r--go.mod18
-rw-r--r--go.sum31
-rw-r--r--internal/grpc/dnsresolver/builder.go19
-rw-r--r--internal/grpc/dnsresolver/builder_test.go15
-rw-r--r--internal/grpc/dnsresolver/resolver.go27
-rw-r--r--internal/grpc/dnsresolver/resolver_test.go13
-rw-r--r--internal/grpc/dnsresolver/testhelper_test.go7
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",
diff --git a/go.mod b/go.mod
index 82a81c2d0..4882e66c1 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index 10b4d19f0..e2fcfcb70 100644
--- a/go.sum
+++ b/go.sum
@@ -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{},
})
}