From: Cuong Manh Le Date: Sat, 13 Aug 2022 17:29:20 +0000 (+0700) Subject: net: avoid relying on singleflight.Group.DoChan to detect hook called X-Git-Tag: go1.20rc1~1436 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7ee220c56768021179b7c4be19631be82773b9da;p=gostls13.git net: avoid relying on singleflight.Group.DoChan to detect hook called So next CLs can revert changes to "internal/singleflight" in CL #82795, then replace it with "golang.org/x/sync/singleflight" instead. For #31697 Change-Id: I873ce30d7e051539aa6dc5d4f21e558869a6d132 Reviewed-on: https://go-review.googlesource.com/c/go/+/423654 TryBot-Result: Gopher Robot Reviewed-by: David Chase Reviewed-by: Bryan Mills Reviewed-by: Brad Fitzpatrick Run-TryBot: Cuong Manh Le --- diff --git a/src/net/lookup.go b/src/net/lookup.go index 7f3d20126c..3cc53f1db6 100644 --- a/src/net/lookup.go +++ b/src/net/lookup.go @@ -316,14 +316,15 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP 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 @@ -335,11 +336,9 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP // 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{ @@ -352,6 +351,7 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP } return nil, err case r := <-ch: + dnsWaitGroup.Done() lookupGroupCancel() err := r.Err if err != nil {