lookupKey := network + "\000" + host
dnsWaitGroup.Add(1)
- ch, called := r.getLookupGroup().DoChan(lookupKey, func() (any, error) {
- defer dnsWaitGroup.Done()
+ ch, _ := r.getLookupGroup().DoChan(lookupKey, func() (any, error) {
return testHookLookupIP(lookupGroupCtx, resolverFunc, network, host)
})
- if !called {
+
+ dnsWaitGroupDone := func(ch <-chan singleflight.Result, cancelFn context.CancelFunc) {
+ <-ch
dnsWaitGroup.Done()
+ cancelFn()
}
-
select {
case <-ctx.Done():
// Our context was canceled. If we are the only
// See issues 8602, 20703, 22724.
if r.getLookupGroup().ForgetUnshared(lookupKey) {
lookupGroupCancel()
+ go dnsWaitGroupDone(ch, func() {})
} else {
- go func() {
- <-ch
- lookupGroupCancel()
- }()
+ go dnsWaitGroupDone(ch, lookupGroupCancel)
}
ctxErr := ctx.Err()
err := &DNSError{
}
return nil, err
case r := <-ch:
+ dnsWaitGroup.Done()
lookupGroupCancel()
err := r.Err
if err != nil {