1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 05:57:03 +09:00

merge coordinator addrs in place; happy path test

This commit is contained in:
Anatolii Smolianinov 2024-09-16 19:49:02 +02:00
parent 5a691f42d9
commit 24f660e43d
No known key found for this signature in database
GPG key ID: 5E259D1D468B99F4
2 changed files with 118 additions and 30 deletions

View file

@ -9,6 +9,7 @@ import (
"github.com/anyproto/go-chash"
"go.uber.org/zap"
"fmt"
commonaccount "github.com/anyproto/any-sync/accountservice"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/logger"
@ -63,41 +64,59 @@ type service struct {
networkProtoVersionChecker NetworkProtoVersionChecker
}
func mergedTreeNodes(configNodes []Node, lastStoredNodes []Node) (mergedAddrs []string) {
treeNodes := make(map[string]int)
mustRewriteNods := false
// Merges nodes in app config coordinator nodes with nodes from file (lastStored).
// This is important to avoid the situation when locally stored configuration
// has obsolete coordinator nodes so client can't fetch up-to-date connection info
// (i.e. treeNodes)
func mergeCoordinatorAddrs(appConfig Configuration, lastStored Configuration) (mustRewriteLocalConfig bool) {
mustRewriteLocalConfig = false
for _, node := range lastStoredNodes {
appNodesByPeer := make(map[string]*Node)
for i, node := range appConfig.Nodes {
if node.HasType(NodeTypeCoordinator) {
for _, addr := range node.Addresses {
treeNodes[addr] = 1
}
appNodesByPeer[node.PeerId] = &appConfig.Nodes[i]
}
}
for _, node := range configNodes {
storedNodesByPeer := make(map[string]*Node)
for i, node := range lastStored.Nodes {
if node.HasType(NodeTypeCoordinator) {
for _, addr := range node.Addresses {
if _, found := treeNodes[addr]; !found {
mustRewriteNods = true
storedNodesByPeer[node.PeerId] = &lastStored.Nodes[i]
}
}
for appPeerId, appNode := range appNodesByPeer {
if storedNode, found := storedNodesByPeer[appPeerId]; found {
// merge addresses: add missing from app config to stored
storedAddrs := make(map[string]bool)
for _, addr := range storedNode.Addresses {
storedAddrs[addr] = true
}
for _, appAddr := range appNode.Addresses {
// assumming appNode.Addresses has no duplicates
if _, found := storedAddrs[appAddr]; !found {
mustRewriteLocalConfig = true
storedNode.Addresses = append(storedNode.Addresses, appAddr)
fmt.Printf("%#v\n", storedNode)
}
treeNodes[addr] += 1
}
} else {
// append a whole node to stored config
mustRewriteLocalConfig = true
newNode := Node{}
newNode.Addresses = make([]string, len(appNode.Addresses))
copy(newNode.Addresses, appNode.Addresses)
lastStored.Nodes = append(lastStored.Nodes, newNode)
}
}
fmt.Printf("%#v\n", lastStored.Nodes[0])
if mustRewriteNods {
mergedAddrs = make([]string, 0)
for addr, _ := range treeNodes {
mergedAddrs = append(mergedAddrs, addr)
}
return
}
return nil
return
}
func (s *service) Init(a *app.App) (err error) {
s.config = a.MustComponent("config").(ConfigGetter).GetNodeConf()
s.accountId = a.MustComponent(commonaccount.CName).(commonaccount.Service).Account().PeerId
@ -109,14 +128,7 @@ func (s *service) Init(a *app.App) (err error) {
err = nil
}
if mergedAddrs := mergedTreeNodes(s.config.Nodes, lastStored.Nodes); mergedAddrs != nil {
for _, node := range lastStored.Nodes {
if node.HasType(NodeTypeCoordinator) {
node.Addresses = mergedAddrs
break // can we break here? node structure in yaml allows to have multiple sections with the same nodeType
}
}
}
mergeCoordinatorAddrs(s.config, lastStored)
var updatePeriodSec = 600
if confUpd, ok := a.MustComponent("config").(ConfigUpdateGetter); ok && confUpd.GetNodeConfUpdateInterval() > 0 {

View file

@ -217,3 +217,79 @@ func newTestConf() *testConf {
},
}
}
func TestService_mergeCoordinatorAddrs(t *testing.T) {
confApp := Configuration{
Id: "test",
NetworkId: "testNetwork",
Nodes: []Node{
{
PeerId: "12D3KooWKLCajM89S8unbt3tgGbRLgmiWnFZT3adn9A5pQciBSLa",
Addresses: []string{"127.0.0.1:4830", "192.168.1.1:8833"},
Types: []NodeType{NodeTypeCoordinator},
},
{
PeerId: "12D3KooWKnXTtbveMDUFfeSqR5dt9a4JW66tZQXG7C7PdDh3vqGu",
Addresses: []string{"127.0.0.1:4730"},
Types: []NodeType{NodeTypeTree},
},
{
PeerId: "12D3KooWKgVN2kW8xw5Uvm2sLUnkeUNQYAvcWvF58maTzev7FjPi",
Addresses: []string{"127.0.0.1:4731"},
Types: []NodeType{NodeTypeTree},
},
{
PeerId: "12D3KooWCUPYuMnQhu9yREJgQyjcz8zWY83rZGmDLwb9YR6QkbZX",
Addresses: []string{"127.0.0.1:4732"},
Types: []NodeType{NodeTypeTree},
},
{
PeerId: "12D3KooWQxiZ5a7vcy4DTJa8Gy1eVUmwb5ojN4SrJC9Rjxzigw6C",
Addresses: []string{"127.0.0.1:4733"},
Types: []NodeType{NodeTypeFile},
},
},
CreationTime: time.Now(),
}
confStored := Configuration{
Id: "test",
NetworkId: "testNetwork",
Nodes: []Node{
{
PeerId: "12D3KooWKLCajM89S8unbt3tgGbRLgmiWnFZT3adn9A5pQciBSLa",
Addresses: []string{"127.0.0.1:4830"},
Types: []NodeType{NodeTypeCoordinator},
},
{
PeerId: "12D3KooWKnXTtbveMDUFfeSqR5dt9a4JW66tZQXG7C7PdDh3vqGu",
Addresses: []string{"127.0.0.1:4730"},
Types: []NodeType{NodeTypeTree},
},
{
PeerId: "12D3KooWKgVN2kW8xw5Uvm2sLUnkeUNQYAvcWvF58maTzev7FjPi",
Addresses: []string{"127.0.0.1:4731"},
Types: []NodeType{NodeTypeTree},
},
{
PeerId: "12D3KooWCUPYuMnQhu9yREJgQyjcz8zWY83rZGmDLwb9YR6QkbZX",
Addresses: []string{"127.0.0.1:4732"},
Types: []NodeType{NodeTypeTree},
},
{
PeerId: "12D3KooWQxiZ5a7vcy4DTJa8Gy1eVUmwb5ojN4SrJC9Rjxzigw6C",
Addresses: []string{"127.0.0.1:4733"},
Types: []NodeType{NodeTypeFile},
},
},
CreationTime: time.Now(),
}
t.Run("coorditor nodes are merged", func(t *testing.T) {
mergeCoordinatorAddrs(confApp, confStored)
assert.Equal(t, 2, len(confStored.Nodes[0].Addresses))
assert.Equal(t, "127.0.0.1:4830", confStored.Nodes[0].Addresses[0])
assert.Equal(t, "192.168.1.1:8833", confStored.Nodes[0].Addresses[1])
})
}