mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-16 18:43:10 -06:00
Fix race in refactored statistics
This commit is contained in:
parent
e54e036948
commit
73c42232fc
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue