Skip to content

Commit 81f9533

Browse files
committedJun 24, 2022
chore: inject Picker to resolvers
1 parent 3a2fbd7 commit 81f9533

9 files changed

+43
-21
lines changed
 

‎pkg/doh/dial.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"net"
88
"sync"
99

10-
"github.com/qdm12/dns/v2/internal/picker"
1110
"github.com/qdm12/dns/v2/internal/server"
1211
"github.com/qdm12/dns/v2/pkg/dot"
1312
"github.com/qdm12/dns/v2/pkg/provider"
@@ -48,7 +47,7 @@ func newDoHDial(settings ResolverSettings) (
4847
},
4948
}
5049

51-
picker := picker.New()
50+
picker := settings.Picker
5251

5352
return func(ctx context.Context, _, _ string) (conn net.Conn, err error) {
5453
// Pick DoH server pseudo-randomly from the chosen providers

‎pkg/doh/interfaces.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package doh
2+
3+
import (
4+
"github.com/qdm12/dns/v2/pkg/provider"
5+
)
6+
7+
type Picker interface {
8+
DoHServer(servers []provider.DoHServer) provider.DoHServer
9+
}

‎pkg/doh/settings.go

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"time"
88

99
"github.com/qdm12/dns/v2/internal/config/defaults"
10+
"github.com/qdm12/dns/v2/internal/picker"
1011
"github.com/qdm12/dns/v2/pkg/cache"
1112
cachenoop "github.com/qdm12/dns/v2/pkg/cache/noop"
1213
"github.com/qdm12/dns/v2/pkg/doh/metrics"
@@ -53,6 +54,11 @@ type ResolverSettings struct {
5354
// Metrics is the metrics interface to record metric data.
5455
// It defaults to a No-Op metrics implementation.
5556
Metrics metrics.DialMetrics
57+
// Picker is the picker to use for each upstream call to pick
58+
// a server from a pool of servers. It must be thread safe.
59+
// It defaults to a fast thread safe pseudo random picker
60+
// with uniform distribution.
61+
Picker Picker
5662
}
5763

5864
type SelfDNS struct {
@@ -103,6 +109,10 @@ func (s *ResolverSettings) SetDefaults() {
103109
if s.Metrics == nil {
104110
s.Metrics = metricsnoop.New()
105111
}
112+
113+
if s.Picker == nil {
114+
s.Picker = picker.New()
115+
}
106116
}
107117

108118
func (s *SelfDNS) SetDefaults() {

‎pkg/doh/settings_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"testing"
55
"time"
66

7+
"github.com/qdm12/dns/v2/internal/picker"
78
cache "github.com/qdm12/dns/v2/pkg/cache/noop"
89
metrics "github.com/qdm12/dns/v2/pkg/doh/metrics/noop"
910
"github.com/qdm12/dns/v2/pkg/filter/mapfilter"
@@ -21,6 +22,7 @@ func Test_ServerSettings_SetDefaults(t *testing.T) {
2122
filter := mapfilter.New(mapfilter.Settings{})
2223
metrics := metrics.New()
2324
logger := log.New()
25+
picker := picker.New()
2426

2527
s := ServerSettings{
2628
Cache: cache,
@@ -30,6 +32,7 @@ func Test_ServerSettings_SetDefaults(t *testing.T) {
3032
Resolver: ResolverSettings{
3133
Warner: logger,
3234
Metrics: metrics,
35+
Picker: picker,
3336
},
3437
}
3538
s.SetDefaults()
@@ -58,6 +61,7 @@ func Test_ServerSettings_SetDefaults(t *testing.T) {
5861
Timeout: 5 * time.Second,
5962
Warner: logger,
6063
Metrics: metrics,
64+
Picker: picker,
6165
},
6266
ListeningAddress: ":53",
6367
}

‎pkg/dot/dial.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"fmt"
77
"net"
88

9-
"github.com/qdm12/dns/v2/internal/picker"
109
"github.com/qdm12/dns/v2/internal/server"
1110
"github.com/qdm12/dns/v2/pkg/dot/metrics"
1211
"github.com/qdm12/dns/v2/pkg/log"
@@ -27,7 +26,7 @@ func newDoTDial(settings ResolverSettings) (
2726
Timeout: settings.Timeout,
2827
}
2928

30-
picker := picker.New()
29+
picker := settings.Picker
3130

3231
return func(ctx context.Context, _, _ string) (net.Conn, error) {
3332
serverName, serverAddress := pickNameAddress(picker,
@@ -75,7 +74,7 @@ func settingsToServers(settings ResolverSettings) (
7574
return dotServers, dnsServers, nil
7675
}
7776

78-
func pickNameAddress(picker picker.DoT, servers []provider.DoTServer,
77+
func pickNameAddress(picker Picker, servers []provider.DoTServer,
7978
ipv6 bool) (name, address string) {
8079
server := picker.DoTServer(servers)
8180
ip := picker.DoTIP(server, ipv6)
@@ -85,7 +84,7 @@ func pickNameAddress(picker picker.DoT, servers []provider.DoTServer,
8584

8685
func onDialError(ctx context.Context, dialErr error,
8786
dotName, dotAddress string, dialer *net.Dialer,
88-
picker picker.DNS, ipv6 bool, dnsServers []provider.DNSServer,
87+
picker Picker, ipv6 bool, dnsServers []provider.DNSServer,
8988
warner log.Warner, metrics metrics.DialMetrics) (
9089
conn net.Conn, err error) {
9190
warner.Warn(dialErr.Error())
@@ -101,7 +100,7 @@ func onDialError(ctx context.Context, dialErr error,
101100
}
102101

103102
func dialPlaintext(ctx context.Context, dialer *net.Dialer,
104-
picker picker.DNS, ipv6 bool, dnsServers []provider.DNSServer,
103+
picker Picker, ipv6 bool, dnsServers []provider.DNSServer,
105104
warner log.Warner, metrics metrics.DialDNSMetrics) (
106105
conn net.Conn, err error) {
107106
dnsServer := picker.DNSServer(dnsServers)

‎pkg/dot/dial_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func Test_settingsToServers(t *testing.T) {
3636
}, dnsServers)
3737
}
3838

39-
//go:generate mockgen -destination=mock_picker_test.go -package $GOPACKAGE -mock_names Interface=MockPicker github.com/qdm12/dns/v2/internal/picker Interface
39+
//go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Picker
4040
//go:generate mockgen -destination=mock_dot_metrics_test.go -package $GOPACKAGE -mock_names Interface=MockDoTMetrics github.com/qdm12/dns/v2/pkg/dot/metrics Interface
4141
//go:generate mockgen -destination=mock_warner_test.go -package $GOPACKAGE github.com/qdm12/dns/v2/pkg/log Warner
4242

Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
1-
package picker
1+
package dot
22

33
import (
44
"net"
55

66
"github.com/qdm12/dns/v2/pkg/provider"
77
)
88

9-
type Interface interface {
9+
type Picker interface {
1010
IP(ips []net.IP) net.IP
1111
DNSServer(servers []provider.DNSServer) provider.DNSServer
1212
DNSIP(server provider.DNSServer, ipv6 bool) net.IP
13-
DoT
14-
}
15-
16-
type DoT interface {
1713
DoTServer(servers []provider.DoTServer) provider.DoTServer
1814
DoTIP(server provider.DoTServer, ipv6 bool) net.IP
1915
}
20-
21-
type DNS interface {
22-
DNSServer(servers []provider.DNSServer) provider.DNSServer
23-
DNSIP(server provider.DNSServer, ipv6 bool) net.IP
24-
}

‎pkg/dot/mock_picker_test.go ‎pkg/dot/mocks_test.go

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎pkg/dot/settings.go

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"time"
88

99
"github.com/qdm12/dns/v2/internal/config/defaults"
10+
"github.com/qdm12/dns/v2/internal/picker"
1011
"github.com/qdm12/dns/v2/pkg/cache"
1112
cachenoop "github.com/qdm12/dns/v2/pkg/cache/noop"
1213
"github.com/qdm12/dns/v2/pkg/dot/metrics"
@@ -56,6 +57,11 @@ type ResolverSettings struct {
5657
// Metrics is the metrics interface to record metric data.
5758
// It defaults to a No-Op metrics implementation.
5859
Metrics metrics.DialMetrics
60+
// Picker is the picker to use for each upstream call to pick
61+
// a server and/or IP address. It must be thread safe.
62+
// It defaults to a fast thread safe pseudo random picker
63+
// with uniform distribution.
64+
Picker Picker
5965
}
6066

6167
func (s *ServerSettings) SetDefaults() {
@@ -97,6 +103,10 @@ func (s *ResolverSettings) SetDefaults() {
97103
if s.Metrics == nil {
98104
s.Metrics = metricsnoop.New()
99105
}
106+
107+
if s.Picker == nil {
108+
s.Picker = picker.New()
109+
}
100110
}
101111

102112
var (

0 commit comments

Comments
 (0)
Please sign in to comment.