From 763aec1bcc005a147d578974d1e73d4e846fcdcd Mon Sep 17 00:00:00 2001 From: Andrew DeMaria Date: Thu, 5 Sep 2024 11:13:43 -0600 Subject: [PATCH] make GetUnusedPort concurrency safe Kwok can be used nicely in go test with parallelism. However when running with -race, GetUnusedPort is flagged as a data race. Ancedotally, during our tests we have seen port contention and this might help resolve that. Signed-off-by: Andrew DeMaria --- pkg/utils/net/unused_port.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/utils/net/unused_port.go b/pkg/utils/net/unused_port.go index 97d3ec38f..071ab890f 100644 --- a/pkg/utils/net/unused_port.go +++ b/pkg/utils/net/unused_port.go @@ -20,17 +20,21 @@ import ( "context" "fmt" "net" + "sync" "sigs.k8s.io/kwok/pkg/utils/sets" ) var ( - errGetUnusedPort = fmt.Errorf("unable to get an unused port") + errGetUnusedPort = fmt.Errorf("unable to get an unused port") + unusedPortSync sync.Mutex lastUsedPort uint32 = 32767 ) // GetUnusedPort returns an unused port on the local machine. func GetUnusedPort(ctx context.Context, used sets.Sets[uint32]) (uint32, error) { + unusedPortSync.Lock() + defer unusedPortSync.Unlock() for lastUsedPort > 10000 && ctx.Err() == nil { lastUsedPort-- if used.Has(lastUsedPort) {