fix: reset timeout in exchangeWithoutCache's singleflight
This commit is contained in:
parent
025de25fc4
commit
d57e07d611
1 changed files with 19 additions and 1 deletions
|
@ -187,7 +187,10 @@ func (r *Resolver) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, e
|
|||
func (r *Resolver) exchangeWithoutCache(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) {
|
||||
q := m.Question[0]
|
||||
|
||||
ret, err, shared := r.group.Do(q.String(), func() (result any, err error) {
|
||||
ch := r.group.DoChan(q.String(), func() (result any, err error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), resolver.DefaultDNSTimeout) // reset timeout in singleflight
|
||||
defer cancel()
|
||||
|
||||
defer func() {
|
||||
if err != nil {
|
||||
return
|
||||
|
@ -209,6 +212,21 @@ func (r *Resolver) exchangeWithoutCache(ctx context.Context, m *D.Msg) (msg *D.M
|
|||
return r.batchExchange(ctx, r.main, m)
|
||||
})
|
||||
|
||||
var result singleflight.Result
|
||||
|
||||
select {
|
||||
case result = <-ch:
|
||||
break
|
||||
case <-ctx.Done():
|
||||
select {
|
||||
case result = <-ch:
|
||||
break
|
||||
}
|
||||
return nil, ctx.Err()
|
||||
}
|
||||
|
||||
ret, err, shared := result.Val, result.Err, result.Shared
|
||||
|
||||
if err == nil {
|
||||
msg = ret.(*D.Msg)
|
||||
if shared {
|
||||
|
|
Loading…
Reference in a new issue