Skip to content

Commit 432785e

Browse files
mjd95bwplotka
authored andcommitted
querier: do A lookups after SRV lookups for store discovery (#865)
* do A lookups after SRV lookups for store discovery * add missing trailing period * re-add old behaviour under dnssrvnoa+
1 parent b4d233e commit 432785e

File tree

2 files changed

+73
-6
lines changed

2 files changed

+73
-6
lines changed

pkg/discovery/dns/resolver.go

+23-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import (
1212
type QType string
1313

1414
const (
15-
A = QType("dns")
16-
SRV = QType("dnssrv")
15+
A = QType("dns")
16+
SRV = QType("dnssrv")
17+
SRVNoA = QType("dnssrvnoa")
1718
)
1819

1920
type Resolver interface {
@@ -72,6 +73,26 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string
7273
res = append(res, appendScheme(scheme, net.JoinHostPort(ip.String(), port)))
7374
}
7475
case SRV:
76+
_, recs, err := s.resolver.LookupSRV(ctx, "", "", host)
77+
if err != nil {
78+
return nil, errors.Wrapf(err, "lookup SRV records %q", host)
79+
}
80+
for _, rec := range recs {
81+
// Only use port from SRV record if no explicit port was specified.
82+
resPort := port
83+
if resPort == "" {
84+
resPort = strconv.Itoa(int(rec.Port))
85+
}
86+
// Do A lookup for the domain in SRV answer.
87+
resIPs, err := s.resolver.LookupIPAddr(ctx, rec.Target)
88+
if err != nil {
89+
return nil, errors.Wrapf(err, "look IP addresses %q", rec.Target)
90+
}
91+
for _, resIP := range resIPs {
92+
res = append(res, appendScheme(scheme, net.JoinHostPort(resIP.String(), resPort)))
93+
}
94+
}
95+
case SRVNoA:
7596
_, recs, err := s.resolver.LookupSRV(ctx, "", "", host)
7697
if err != nil {
7798
return nil, errors.Wrapf(err, "lookup SRV records %q", host)

pkg/discovery/dns/resolver_test.go

+50-4
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,57 @@ var (
7777
resolver: &mockHostnameResolver{},
7878
},
7979
{
80-
testName: "multiple srv records from srv lookup",
80+
testName: "multiple SRV records from SRV lookup",
8181
addr: "_test._tcp.mycompany.com",
8282
qtype: SRV,
8383
expectedResult: []string{"192.168.0.1:8080", "192.168.0.2:8081"},
8484
expectedErr: nil,
85+
resolver: &mockHostnameResolver{
86+
resultSRVs: map[string][]*net.SRV{
87+
"_test._tcp.mycompany.com": {
88+
&net.SRV{Target: "alt1.mycompany.com.", Port: 8080},
89+
&net.SRV{Target: "alt2.mycompany.com.", Port: 8081},
90+
},
91+
},
92+
resultIPs: map[string][]net.IPAddr{
93+
"alt1.mycompany.com.": {net.IPAddr{IP: net.ParseIP("192.168.0.1")}},
94+
"alt2.mycompany.com.": {net.IPAddr{IP: net.ParseIP("192.168.0.2")}},
95+
},
96+
},
97+
},
98+
{
99+
testName: "multiple SRV records from SRV lookup with specified port",
100+
addr: "_test._tcp.mycompany.com:8082",
101+
qtype: SRV,
102+
expectedResult: []string{"192.168.0.1:8082", "192.168.0.2:8082"},
103+
expectedErr: nil,
104+
resolver: &mockHostnameResolver{
105+
resultSRVs: map[string][]*net.SRV{
106+
"_test._tcp.mycompany.com": {
107+
&net.SRV{Target: "alt1.mycompany.com.", Port: 8080},
108+
&net.SRV{Target: "alt2.mycompany.com.", Port: 8081},
109+
},
110+
},
111+
resultIPs: map[string][]net.IPAddr{
112+
"alt1.mycompany.com.": {net.IPAddr{IP: net.ParseIP("192.168.0.1")}},
113+
"alt2.mycompany.com.": {net.IPAddr{IP: net.ParseIP("192.168.0.2")}},
114+
},
115+
},
116+
},
117+
{
118+
testName: "error from SRV resolver",
119+
addr: "_test._tcp.mycompany.com",
120+
qtype: SRV,
121+
expectedResult: nil,
122+
expectedErr: errors.Wrapf(errorFromResolver, "lookup SRV records \"_test._tcp.mycompany.com\""),
123+
resolver: &mockHostnameResolver{err: errorFromResolver},
124+
},
125+
{
126+
testName: "multiple SRV records from SRV no A lookup",
127+
addr: "_test._tcp.mycompany.com",
128+
qtype: SRVNoA,
129+
expectedResult: []string{"192.168.0.1:8080", "192.168.0.2:8081"},
130+
expectedErr: nil,
85131
resolver: &mockHostnameResolver{
86132
resultSRVs: map[string][]*net.SRV{
87133
"_test._tcp.mycompany.com": {
@@ -92,9 +138,9 @@ var (
92138
},
93139
},
94140
{
95-
testName: "multiple srv records from srv lookup",
141+
testName: "multiple SRV records from SRV no A lookup with specified port",
96142
addr: "_test._tcp.mycompany.com:8082",
97-
qtype: SRV,
143+
qtype: SRVNoA,
98144
expectedResult: []string{"192.168.0.1:8082", "192.168.0.2:8082"},
99145
expectedErr: nil,
100146
resolver: &mockHostnameResolver{
@@ -107,7 +153,7 @@ var (
107153
},
108154
},
109155
{
110-
testName: "error from SRV resolver",
156+
testName: "error from SRV no A lookup",
111157
addr: "_test._tcp.mycompany.com",
112158
qtype: SRV,
113159
expectedResult: nil,

0 commit comments

Comments
 (0)