@@ -18,45 +18,47 @@ const (
1818 maxEndpointsCheckPerLocation = 5
1919)
2020
21- func checkFastestAddress (ctx context.Context , addresses []string ) ( string , error ) {
21+ func checkFastestAddress (ctx context.Context , addresses []string ) string {
2222 ctx , cancel := context .WithCancel (ctx )
2323 defer cancel ()
2424
25- results := make (chan string , len (addresses ))
26- errs := make (chan error , len (addresses ))
25+ type result struct {
26+ address string
27+ err error
28+ }
29+ results := make (chan result , len (addresses ))
30+ defer close (results )
2731
2832 startDial := make (chan struct {})
29- dialer := net.Dialer {}
33+ var dialer net.Dialer
34+
3035 var wg sync.WaitGroup
36+ defer wg .Wait ()
37+
3138 for _ , addr := range addresses {
3239 wg .Add (1 )
3340 go func (address string ) {
3441 defer wg .Done ()
35-
3642 <- startDial
3743 conn , err := dialer .DialContext (ctx , "tcp" , address )
3844 if err == nil {
39- results <- address
4045 cancel ()
41- } else {
42- errs <- err
43- }
44- if conn != nil {
4546 _ = conn .Close ()
4647 }
48+ results <- result {address : address , err : err }
4749 }(addr )
4850 }
4951
5052 close (startDial )
5153
52- wg .Wait ()
53- close (results )
54- close (errs )
55-
56- if res , ok := <- results ; ok {
57- return res , nil
54+ for range addresses {
55+ res := <- results
56+ if res .err == nil {
57+ return res .address
58+ }
5859 }
59- return "" , xerrors .WithStackTrace (<- errs )
60+
61+ return ""
6062}
6163
6264func detectFastestEndpoint (ctx context.Context , endpoints []endpoint.Endpoint ) (endpoint.Endpoint , error ) {
@@ -98,9 +100,9 @@ func detectFastestEndpoint(ctx context.Context, endpoints []endpoint.Endpoint) (
98100 addressesToPing = append (addressesToPing , ip )
99101 }
100102
101- fastestAddress , err := checkFastestAddress (ctx , addressesToPing )
102- if err != nil {
103- return nil , err
103+ fastestAddress := checkFastestAddress (ctx , addressesToPing )
104+ if fastestAddress == "" {
105+ return nil , xerrors . WithStackTrace ( errors . New ( "failed to check fastest address" ))
104106 }
105107 return addressToEndpoint [fastestAddress ], nil
106108}
0 commit comments