tracker/udp/client.go | 6 ++++++ diff --git a/tracker/udp/client.go b/tracker/udp/client.go index 59714c09c20d979d2aa87a5089bca16e55a558eb..aea3ec91fe69f5c552f4ba5259a30dc77778918a 100644 --- a/tracker/udp/client.go +++ b/tracker/udp/client.go @@ -7,10 +7,12 @@ "encoding/binary" "errors" "fmt" "io" + "sync" "time" ) type Client struct { + mu sync.Mutex connId ConnectionId connIdIssued time.Time Dispatcher *Dispatcher @@ -66,6 +68,10 @@ return } func (cl *Client) connect(ctx context.Context) (err error) { + // We could get fancier here and use RWMutex, and even fire off the connection asynchronously + // and provide a grace period while it resolves. + cl.mu.Lock() + defer cl.mu.Unlock() if !cl.connIdIssued.IsZero() && time.Since(cl.connIdIssued) < time.Minute { return nil }