Fix race in refactored statistics

This commit is contained in:
Devon Hudson 2023-01-12 12:20:03 -07:00
parent e54e036948
commit 73c42232fc
No known key found for this signature in database
GPG key ID: CD06B18E77F6A628

View file

@ -83,7 +83,9 @@ func (s *Statistics) ForServer(serverName gomatrixserverlib.ServerName) *ServerS
if err != nil { if err != nil {
logrus.WithError(err).Errorf("Failed to get relay server list for %q", serverName) logrus.WithError(err).Errorf("Failed to get relay server list for %q", serverName)
} else { } else {
server.relayMutex.Lock()
server.knownRelayServers = knownRelayServers server.knownRelayServers = knownRelayServers
server.relayMutex.Unlock()
} }
} }
return server return server
@ -112,6 +114,7 @@ type ServerStatistics struct {
backoffNotifier func() // notifies destination queue when backoff completes backoffNotifier func() // notifies destination queue when backoff completes
notifierMutex sync.Mutex notifierMutex sync.Mutex
knownRelayServers []gomatrixserverlib.ServerName knownRelayServers []gomatrixserverlib.ServerName
relayMutex sync.Mutex
} }
const maxJitterMultiplier = 1.4 const maxJitterMultiplier = 1.4
@ -207,8 +210,8 @@ func (s *ServerStatistics) Failure() (time.Time, bool) {
s.backoffUntil.Store(until) s.backoffUntil.Store(until)
s.statistics.backoffMutex.Lock() s.statistics.backoffMutex.Lock()
defer s.statistics.backoffMutex.Unlock()
s.statistics.backoffTimers[s.serverName] = time.AfterFunc(time.Until(until), s.backoffFinished) s.statistics.backoffTimers[s.serverName] = time.AfterFunc(time.Until(until), s.backoffFinished)
s.statistics.backoffMutex.Unlock()
} }
return s.backoffUntil.Load().(time.Time), false return s.backoffUntil.Load().(time.Time), false
@ -302,6 +305,8 @@ func (s *ServerStatistics) SuccessCount() uint32 {
// KnownRelayServers returns the list of relay servers associated with this // KnownRelayServers returns the list of relay servers associated with this
// server. // server.
func (s *ServerStatistics) KnownRelayServers() []gomatrixserverlib.ServerName { func (s *ServerStatistics) KnownRelayServers() []gomatrixserverlib.ServerName {
s.relayMutex.Lock()
defer s.relayMutex.Unlock()
return s.knownRelayServers return s.knownRelayServers
} }
@ -324,13 +329,18 @@ func (s *ServerStatistics) AddRelayServers(relayServers []gomatrixserverlib.Serv
for _, newServer := range uniqueList { for _, newServer := range uniqueList {
alreadyKnown := false alreadyKnown := false
for _, srv := range s.knownRelayServers { knownRelayServers := s.KnownRelayServers()
for _, srv := range knownRelayServers {
if srv == newServer { if srv == newServer {
alreadyKnown = true alreadyKnown = true
} }
} }
if !alreadyKnown { if !alreadyKnown {
s.knownRelayServers = append(s.knownRelayServers, newServer) {
s.relayMutex.Lock()
s.knownRelayServers = append(s.knownRelayServers, newServer)
s.relayMutex.Unlock()
}
} }
} }
} }