Skip to content

Commit 888dc5c

Browse files
committed
fix(test): retry MockBroker Listen for EADDRINUSE
Some of the FV tests involve shutting down a MockBroker and then re-creating a new one on the same ip:port. Sometimes this fails because the port shows as still being in-use. Add some rudimentary retry attempts for this case to try and close the FV flakiness in that area. Signed-off-by: Dominic Evans <[email protected]>
1 parent d09a287 commit 888dc5c

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

mockbroker.go

+21-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"reflect"
1111
"strconv"
1212
"sync"
13+
"syscall"
1314
"time"
1415

1516
"github.com/davecgh/go-spew/spew"
@@ -410,10 +411,29 @@ func NewMockBroker(t TestReporter, brokerID int32) *MockBroker {
410411
// NewMockBrokerAddr behaves like newMockBroker but listens on the address you give
411412
// it rather than just some ephemeral port.
412413
func NewMockBrokerAddr(t TestReporter, brokerID int32, addr string) *MockBroker {
413-
listener, err := net.Listen("tcp", addr)
414+
var (
415+
listener net.Listener
416+
err error
417+
)
418+
419+
// retry up to 20 times if address already in use (e.g., if replacing broker which hasn't cleanly shutdown)
420+
for i := 0; i < 20; i++ {
421+
listener, err = net.Listen("tcp", addr)
422+
if err != nil {
423+
if errors.Is(err, syscall.EADDRINUSE) {
424+
Logger.Printf("*** mockbroker/%d waiting for %s (address already in use)", brokerID, addr)
425+
time.Sleep(time.Millisecond * 100)
426+
continue
427+
}
428+
t.Fatal(err)
429+
}
430+
break
431+
}
432+
414433
if err != nil {
415434
t.Fatal(err)
416435
}
436+
417437
return NewMockBrokerListener(t, brokerID, listener)
418438
}
419439

0 commit comments

Comments
 (0)