Fix: upstream dns ExchangeContext workaround (#468)

This commit is contained in:
Comzyh 2020-01-10 14:13:44 +08:00 committed by Dreamacro
parent 2c0cc374d3
commit e68c0d088b
4 changed files with 5 additions and 2 deletions

View file

@ -59,6 +59,7 @@ func (p *Picker) Wait() interface{} {
} }
// WaitWithoutCancel blocks until the first result return, if timeout will return nil. // WaitWithoutCancel blocks until the first result return, if timeout will return nil.
// The return of this function will not wait for the cancel of context.
func (p *Picker) WaitWithoutCancel() interface{} { func (p *Picker) WaitWithoutCancel() interface{} {
select { select {
case <-p.firstDone: case <-p.firstDone:

View file

@ -16,6 +16,7 @@ func (c *client) Exchange(m *D.Msg) (msg *D.Msg, err error) {
} }
func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) { func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) {
// Please note that miekg/dns ExchangeContext doesn't respond to context cancel.
msg, _, err = c.Client.ExchangeContext(ctx, m, c.Address) msg, _, err = c.Client.ExchangeContext(ctx, m, c.Address)
return return
} }

View file

@ -180,7 +180,7 @@ func (r *Resolver) IsFakeIP(ip net.IP) bool {
} }
func (r *Resolver) batchExchange(clients []resolver, m *D.Msg) (msg *D.Msg, err error) { func (r *Resolver) batchExchange(clients []resolver, m *D.Msg) (msg *D.Msg, err error) {
fast, ctx := picker.WithTimeout(context.Background(), time.Second * 5) fast, ctx := picker.WithTimeout(context.Background(), time.Second*5)
for _, client := range clients { for _, client := range clients {
r := client r := client
fast.Go(func() (interface{}, error) { fast.Go(func() (interface{}, error) {
@ -192,7 +192,7 @@ func (r *Resolver) batchExchange(clients []resolver, m *D.Msg) (msg *D.Msg, err
}) })
} }
elm := fast.Wait() elm := fast.WaitWithoutCancel()
if elm == nil { if elm == nil {
return nil, errors.New("All DNS requests failed") return nil, errors.New("All DNS requests failed")
} }

View file

@ -134,6 +134,7 @@ func transform(servers []NameServer) []resolver {
NextProtos: []string{"dns"}, NextProtos: []string{"dns"},
}, },
UDPSize: 4096, UDPSize: 4096,
Timeout: 5 * time.Second,
}, },
Address: s.Addr, Address: s.Addr,
}) })