mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-20 12:33:09 -06:00
Fix race in pinecone monolith tests
This commit is contained in:
parent
a91e33037c
commit
f25986d8fd
|
|
@ -465,7 +465,7 @@ func (m *DendriteMonolith) Start() {
|
||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
ServerName: gomatrixserverlib.ServerName(m.PineconeRouter.PublicKey().String()),
|
ServerName: gomatrixserverlib.ServerName(m.PineconeRouter.PublicKey().String()),
|
||||||
FederationAPI: m.federationAPI,
|
FederationAPI: m.federationAPI,
|
||||||
RelayServersQueried: make(map[gomatrixserverlib.ServerName]bool),
|
relayServersQueried: make(map[gomatrixserverlib.ServerName]bool),
|
||||||
RelayAPI: monolith.RelayAPI,
|
RelayAPI: monolith.RelayAPI,
|
||||||
running: *atomic.NewBool(false),
|
running: *atomic.NewBool(false),
|
||||||
}
|
}
|
||||||
|
|
@ -515,9 +515,10 @@ func (m *DendriteMonolith) Stop() {
|
||||||
type RelayServerRetriever struct {
|
type RelayServerRetriever struct {
|
||||||
Context context.Context
|
Context context.Context
|
||||||
ServerName gomatrixserverlib.ServerName
|
ServerName gomatrixserverlib.ServerName
|
||||||
RelayServersQueried map[gomatrixserverlib.ServerName]bool
|
|
||||||
FederationAPI api.FederationInternalAPI
|
FederationAPI api.FederationInternalAPI
|
||||||
RelayAPI relayServerAPI.RelayInternalAPI
|
RelayAPI relayServerAPI.RelayInternalAPI
|
||||||
|
relayServersQueried map[gomatrixserverlib.ServerName]bool
|
||||||
|
queriedServersMutex sync.Mutex
|
||||||
running atomic.Bool
|
running atomic.Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -529,7 +530,7 @@ func (m *RelayServerRetriever) InitializeRelayServers(eLog *logrus.Entry) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
for _, server := range response.RelayServers {
|
for _, server := range response.RelayServers {
|
||||||
m.RelayServersQueried[server] = false
|
m.relayServersQueried[server] = false
|
||||||
}
|
}
|
||||||
|
|
||||||
eLog.Infof("Registered relay servers: %v", response.RelayServers)
|
eLog.Infof("Registered relay servers: %v", response.RelayServers)
|
||||||
|
|
@ -541,11 +542,15 @@ func (m *RelayServerRetriever) SyncRelayServers(stop <-chan bool) {
|
||||||
t := time.NewTimer(relayServerRetryInterval)
|
t := time.NewTimer(relayServerRetryInterval)
|
||||||
for {
|
for {
|
||||||
relayServersToQuery := []gomatrixserverlib.ServerName{}
|
relayServersToQuery := []gomatrixserverlib.ServerName{}
|
||||||
for server, complete := range m.RelayServersQueried {
|
func() {
|
||||||
if !complete {
|
m.queriedServersMutex.Lock()
|
||||||
relayServersToQuery = append(relayServersToQuery, server)
|
defer m.queriedServersMutex.Unlock()
|
||||||
|
for server, complete := range m.relayServersQueried {
|
||||||
|
if !complete {
|
||||||
|
relayServersToQuery = append(relayServersToQuery, server)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}()
|
||||||
if len(relayServersToQuery) == 0 {
|
if len(relayServersToQuery) == 0 {
|
||||||
// All relay servers have been synced.
|
// All relay servers have been synced.
|
||||||
return
|
return
|
||||||
|
|
@ -564,6 +569,17 @@ func (m *RelayServerRetriever) SyncRelayServers(stop <-chan bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *RelayServerRetriever) GetQueriedServerStatus() map[gomatrixserverlib.ServerName]bool {
|
||||||
|
m.queriedServersMutex.Lock()
|
||||||
|
defer m.queriedServersMutex.Unlock()
|
||||||
|
|
||||||
|
result := map[gomatrixserverlib.ServerName]bool{}
|
||||||
|
for server, queried := range m.relayServersQueried {
|
||||||
|
result[server] = queried
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
func (m *RelayServerRetriever) queryRelayServers(relayServers []gomatrixserverlib.ServerName) {
|
func (m *RelayServerRetriever) queryRelayServers(relayServers []gomatrixserverlib.ServerName) {
|
||||||
logrus.Info("querying relay servers for async_events")
|
logrus.Info("querying relay servers for async_events")
|
||||||
for _, server := range relayServers {
|
for _, server := range relayServers {
|
||||||
|
|
@ -578,7 +594,11 @@ func (m *RelayServerRetriever) queryRelayServers(relayServers []gomatrixserverli
|
||||||
response := relayServerAPI.PerformRelayServerSyncResponse{}
|
response := relayServerAPI.PerformRelayServerSyncResponse{}
|
||||||
err = m.RelayAPI.PerformRelayServerSync(context.Background(), &request, &response)
|
err = m.RelayAPI.PerformRelayServerSync(context.Background(), &request, &response)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
m.RelayServersQueried[server] = true
|
func() {
|
||||||
|
m.queriedServersMutex.Lock()
|
||||||
|
defer m.queriedServersMutex.Unlock()
|
||||||
|
m.relayServersQueried[server] = true
|
||||||
|
}()
|
||||||
// TODO : What happens if your relay receives new messages after this point?
|
// TODO : What happens if your relay receives new messages after this point?
|
||||||
// Should you continue to check with them, or should they try and contact you?
|
// Should you continue to check with them, or should they try and contact you?
|
||||||
// They could send a "new_async_events" message your way maybe?
|
// They could send a "new_async_events" message your way maybe?
|
||||||
|
|
|
||||||
|
|
@ -150,32 +150,35 @@ func TestRelayRetrieverInitialization(t *testing.T) {
|
||||||
retriever := RelayServerRetriever{
|
retriever := RelayServerRetriever{
|
||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
ServerName: "server",
|
ServerName: "server",
|
||||||
RelayServersQueried: make(map[gomatrixserverlib.ServerName]bool),
|
relayServersQueried: make(map[gomatrixserverlib.ServerName]bool),
|
||||||
FederationAPI: &FakeFedAPI{},
|
FederationAPI: &FakeFedAPI{},
|
||||||
RelayAPI: &FakeRelayAPI{},
|
RelayAPI: &FakeRelayAPI{},
|
||||||
}
|
}
|
||||||
|
|
||||||
retriever.InitializeRelayServers(logrus.WithField("test", "relay"))
|
retriever.InitializeRelayServers(logrus.WithField("test", "relay"))
|
||||||
assert.Equal(t, 2, len(retriever.RelayServersQueried))
|
relayServers := retriever.GetQueriedServerStatus()
|
||||||
|
assert.Equal(t, 2, len(relayServers))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRelayRetrieverSync(t *testing.T) {
|
func TestRelayRetrieverSync(t *testing.T) {
|
||||||
retriever := RelayServerRetriever{
|
retriever := RelayServerRetriever{
|
||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
ServerName: "server",
|
ServerName: "server",
|
||||||
RelayServersQueried: make(map[gomatrixserverlib.ServerName]bool),
|
relayServersQueried: make(map[gomatrixserverlib.ServerName]bool),
|
||||||
FederationAPI: &FakeFedAPI{},
|
FederationAPI: &FakeFedAPI{},
|
||||||
RelayAPI: &FakeRelayAPI{},
|
RelayAPI: &FakeRelayAPI{},
|
||||||
}
|
}
|
||||||
|
|
||||||
retriever.InitializeRelayServers(logrus.WithField("test", "relay"))
|
retriever.InitializeRelayServers(logrus.WithField("test", "relay"))
|
||||||
assert.Equal(t, 2, len(retriever.RelayServersQueried))
|
relayServers := retriever.GetQueriedServerStatus()
|
||||||
|
assert.Equal(t, 2, len(relayServers))
|
||||||
|
|
||||||
stopRelayServerSync := make(chan bool)
|
stopRelayServerSync := make(chan bool)
|
||||||
go retriever.SyncRelayServers(stopRelayServerSync)
|
go retriever.SyncRelayServers(stopRelayServerSync)
|
||||||
|
|
||||||
check := func(log poll.LogT) poll.Result {
|
check := func(log poll.LogT) poll.Result {
|
||||||
for _, queried := range retriever.RelayServersQueried {
|
relayServers := retriever.GetQueriedServerStatus()
|
||||||
|
for _, queried := range relayServers {
|
||||||
if !queried {
|
if !queried {
|
||||||
return poll.Continue("waiting for all servers to be queried")
|
return poll.Continue("waiting for all servers to be queried")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue