Skip to content

Commit

Permalink
Exit from processConnResults after all tries (#2621)
Browse files Browse the repository at this point in the history
* Exit from processConnResults after all tries

If all server is unavailable then the server picker never return
because we never close the result channel.
Count the number of the results and exit when we reached the
expected size
  • Loading branch information
pappz authored Sep 19, 2024
1 parent 6f0fd1d commit fc4b37f
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 3 deletions.
10 changes: 7 additions & 3 deletions relay/client/picker.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,15 @@ func (sp *ServerPicker) PickServer(parentCtx context.Context, urls []string) (*C

connResultChan := make(chan connResult, totalServers)
successChan := make(chan connResult, 1)

concurrentLimiter := make(chan struct{}, maxConcurrentServers)

for _, url := range urls {
// todo check if we have a successful connection so we do not need to connect to other servers
concurrentLimiter <- struct{}{}
go func(url string) {
defer func() { <-concurrentLimiter }()
defer func() {
<-concurrentLimiter
}()
sp.startConnection(parentCtx, connResultChan, url)
}(url)
}
Expand Down Expand Up @@ -72,7 +75,8 @@ func (sp *ServerPicker) startConnection(ctx context.Context, resultChan chan con

func (sp *ServerPicker) processConnResults(resultChan chan connResult, successChan chan connResult) {
var hasSuccess bool
for cr := range resultChan {
for numOfResults := 0; numOfResults < cap(resultChan); numOfResults++ {
cr := <-resultChan
if cr.Err != nil {
log.Debugf("failed to connect to Relay server: %s: %v", cr.Url, cr.Err)
continue
Expand Down
31 changes: 31 additions & 0 deletions relay/client/picker_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package client

import (
"context"
"errors"
"testing"
"time"
)

func TestServerPicker_UnavailableServers(t *testing.T) {
sp := ServerPicker{
TokenStore: nil,
PeerID: "test",
}

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()

go func() {
_, err := sp.PickServer(ctx, []string{"rel://dummy1", "rel://dummy2"})
if err == nil {
t.Error(err)
}
cancel()
}()

<-ctx.Done()
if errors.Is(ctx.Err(), context.DeadlineExceeded) {
t.Errorf("PickServer() took too long to complete")
}
}

0 comments on commit fc4b37f

Please sign in to comment.