Skip to content

Commit 00ba493

Browse files
committed
Resolve feedbacks.
1 parent 8862fe5 commit 00ba493

File tree

4 files changed

+60
-17
lines changed

4 files changed

+60
-17
lines changed

internal/resolver/dns/dns_resolver.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,7 @@ type dnsBuilder struct{}
107107

108108
// Build creates and starts a DNS resolver that watches the name resolution of
109109
// the target.
110-
func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (
111-
resolver.Resolver, error,
112-
) {
110+
func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
113111
host, port, err := parseTarget(target.Endpoint(), defaultPort)
114112
if err != nil {
115113
return nil, err
@@ -325,12 +323,10 @@ func (d *dnsResolver) lookupHost(ctx context.Context) ([]resolver.Address, error
325323
}
326324

327325
func (d *dnsResolver) lookup() (*resolver.State, error) {
328-
ctxSRV, cancelSRV := context.WithTimeout(d.ctx, ResolvingTimeout)
329-
defer cancelSRV()
330-
srv, srvErr := d.lookupSRV(ctxSRV)
331-
ctxHost, cancelHost := context.WithTimeout(d.ctx, ResolvingTimeout)
332-
defer cancelHost()
333-
addrs, hostErr := d.lookupHost(ctxHost)
326+
ctx, cancel := context.WithTimeout(d.ctx, ResolvingTimeout)
327+
defer cancel()
328+
srv, srvErr := d.lookupSRV(ctx)
329+
addrs, hostErr := d.lookupHost(ctx)
334330
if hostErr != nil && (srvErr != nil || len(srv) == 0) {
335331
return nil, hostErr
336332
}
@@ -340,9 +336,7 @@ func (d *dnsResolver) lookup() (*resolver.State, error) {
340336
state = grpclbstate.Set(state, &grpclbstate.State{BalancerAddresses: srv})
341337
}
342338
if !d.disableServiceConfig {
343-
ctxTXT, cancelTXT := context.WithTimeout(d.ctx, ResolvingTimeout)
344-
defer cancelTXT()
345-
state.ServiceConfig = d.lookupTXT(ctxTXT)
339+
state.ServiceConfig = d.lookupTXT(ctx)
346340
}
347341
return &state, nil
348342
}

internal/resolver/dns/dns_resolver_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
dnsinternal "google.golang.org/grpc/internal/resolver/dns/internal"
4040
"google.golang.org/grpc/internal/testutils"
4141
"google.golang.org/grpc/resolver"
42+
dnspublic "google.golang.org/grpc/resolver/dns"
4243
"google.golang.org/grpc/serviceconfig"
4344

4445
_ "google.golang.org/grpc" // To initialize internal.ParseServiceConfig
@@ -1215,3 +1216,32 @@ func (s) TestReportError(t *testing.T) {
12151216
}
12161217
}
12171218
}
1219+
1220+
// Test verifies that when the DNS resolver gets timeout error when net.Resolver
1221+
// takes too long to resolve a target.
1222+
func (s) TestResolveTimeout(t *testing.T) {
1223+
// Set DNS resolving timeout to 7ms
1224+
dnspublic.SetResolvingTimeout(7 * time.Millisecond)
1225+
1226+
// Time to run test this should not longer than 10s.
1227+
ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout)
1228+
defer cancel()
1229+
1230+
// We are trying to resolve hostname which takes infinity time to resolve.
1231+
const target = "infinity"
1232+
tr := &testNetResolver{}
1233+
tr.UpdateHostLookupTable(map[string][]string{target: {"1.2.3.4"}})
1234+
overrideNetResolver(t, tr)
1235+
1236+
r, _, errCh := buildResolverWithTestClientConn(t, target)
1237+
r.ResolveNow(resolver.ResolveNowOptions{})
1238+
1239+
select {
1240+
case <-ctx.Done():
1241+
t.Fatal("Timeout when waiting for an error from the resolver")
1242+
case err := <-errCh:
1243+
if err == nil || !strings.Contains(err.Error(), "hostLookup timeout") {
1244+
t.Fatalf(`we expect to see timed out error`)
1245+
}
1246+
}
1247+
}

internal/resolver/dns/fake_net_resolver_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ package dns_test
2121
import (
2222
"context"
2323
"net"
24+
"strings"
2425
"sync"
26+
"time"
2527

2628
"google.golang.org/grpc/internal/testutils"
2729
)
@@ -47,9 +49,28 @@ func (tr *testNetResolver) LookupHost(ctx context.Context, host string) ([]strin
4749
tr.mu.Lock()
4850
defer tr.mu.Unlock()
4951

52+
// trigger a timeout if the host name contains "infinity"
53+
if strings.Contains(host, "infinity") {
54+
<-time.After(88 * time.Millisecond)
55+
}
56+
57+
// return timeout error if context reached its deadline
58+
select {
59+
case <-ctx.Done():
60+
return nil, &net.DNSError{
61+
Err: "hostLookup timeout",
62+
Name: host,
63+
Server: "fake",
64+
IsTemporary: true,
65+
}
66+
67+
default:
68+
}
69+
5070
if addrs, ok := tr.hostLookupTable[host]; ok {
5171
return addrs, nil
5272
}
73+
5374
return nil, &net.DNSError{
5475
Err: "hostLookup error",
5576
Name: host,

resolver/dns/dns_resolver.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,10 @@ import (
3232

3333
// SetResolvingTimeout sets the maximum duration for DNS resolution requests.
3434
//
35-
// This function updates the global `ResolvingTimeout` variable, which specifies
36-
// how long a DNS resolution attempt will wait before it is canceled.
35+
// This function affects the global timeout used by all channels using the DNS name resolver scheme.
3736
//
38-
// It is recommended to call this function at application startup, before any
39-
// gRPC calls are made. Modifying this value after initialization is not
40-
// thread-safe.
37+
// It must be called only at application startup, before any gRPC calls are made.
38+
// Modifying this value after initialization is not thread-safe.
4139
//
4240
// The default value is 10 seconds. Setting the timeout too low may result
4341
// in premature timeouts during resolution, while setting it too high may

0 commit comments

Comments
 (0)