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

Add NodeTypeNamingNode and NodeTypePaymentProcessingNode to nodeconf

This commit is contained in:
Anton Akentev 2023-11-01 12:42:03 +00:00
parent 1b018a287e
commit fe8cba6225
6 changed files with 237 additions and 46 deletions

View file

@ -3,6 +3,9 @@ package commonspace
import (
"context"
"fmt"
"testing"
"time"
accountService "github.com/anyproto/any-sync/accountservice"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/ocache"
@ -22,8 +25,6 @@ import (
"github.com/anyproto/any-sync/testutil/accounttest"
"github.com/anyproto/go-chash"
"github.com/stretchr/testify/require"
"testing"
"time"
)
//
@ -103,6 +104,14 @@ func (m *mockConf) CoordinatorPeers() []string {
return nil
}
func (m *mockConf) NamingNodePeers() []string {
return nil
}
func (m *mockConf) PaymentProcessingNodePeers() []string {
return nil
}
func (m *mockConf) PeerAddresses(peerId string) (addrs []string, ok bool) {
if peerId == m.configuration.Nodes[0].PeerId {
return m.configuration.Nodes[0].Addresses, true

View file

@ -25,6 +25,8 @@ const (
NodeTypeFile NodeType = "file"
NodeTypeCoordinator NodeType = "coordinator"
NodeTypeNamingNode NodeType = "namingNode"
NodeTypePaymentProcessingNode NodeType = "paymentProcessingNode"
)
type Node struct {

View file

@ -181,6 +181,20 @@ func (mr *MockServiceMockRecorder) Name() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockService)(nil).Name))
}
// NamingNodePeers mocks base method.
func (m *MockService) NamingNodePeers() []string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "NamingNodePeers")
ret0, _ := ret[0].([]string)
return ret0
}
// NamingNodePeers indicates an expected call of NamingNodePeers.
func (mr *MockServiceMockRecorder) NamingNodePeers() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NamingNodePeers", reflect.TypeOf((*MockService)(nil).NamingNodePeers))
}
// NetworkCompatibilityStatus mocks base method.
func (m *MockService) NetworkCompatibilityStatus() nodeconf.NetworkCompatibilityStatus {
m.ctrl.T.Helper()
@ -237,6 +251,20 @@ func (mr *MockServiceMockRecorder) Partition(arg0 any) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Partition", reflect.TypeOf((*MockService)(nil).Partition), arg0)
}
// PaymentProcessingNodePeers mocks base method.
func (m *MockService) PaymentProcessingNodePeers() []string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "PaymentProcessingNodePeers")
ret0, _ := ret[0].([]string)
return ret0
}
// PaymentProcessingNodePeers indicates an expected call of PaymentProcessingNodePeers.
func (mr *MockServiceMockRecorder) PaymentProcessingNodePeers() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaymentProcessingNodePeers", reflect.TypeOf((*MockService)(nil).PaymentProcessingNodePeers))
}
// PeerAddresses mocks base method.
func (m *MockService) PeerAddresses(arg0 string) ([]string, bool) {
m.ctrl.T.Helper()

View file

@ -1,8 +1,9 @@
package nodeconf
import (
"github.com/anyproto/go-chash"
"strings"
"github.com/anyproto/go-chash"
)
type NodeConf interface {
@ -20,6 +21,11 @@ type NodeConf interface {
ConsensusPeers() []string
// CoordinatorPeers returns list of coordinator nodes
CoordinatorPeers() []string
// Please see any-ns-node repo for details
// Usually one network has only 1 naming node, but we support array of NNs
NamingNodePeers() []string
// Please see any-pp-node repo for details
PaymentProcessingNodePeers() []string
// PeerAddresses returns peer addresses by peer id
PeerAddresses(peerId string) (addrs []string, ok bool)
// CHash returns nodes consistent table
@ -36,6 +42,8 @@ type nodeConf struct {
filePeers []string
consensusPeers []string
coordinatorPeers []string
namingNodePeers []string
paymentProcessingNodePeers []string
chash chash.CHash
allMembers []Node
c Configuration
@ -82,6 +90,14 @@ func (c *nodeConf) CoordinatorPeers() []string {
return c.coordinatorPeers
}
func (c *nodeConf) NamingNodePeers() []string {
return c.namingNodePeers
}
func (c *nodeConf) PaymentProcessingNodePeers() []string {
return c.paymentProcessingNodePeers
}
func (c *nodeConf) PeerAddresses(peerId string) (addrs []string, ok bool) {
addrs, ok = c.addrs[peerId]
if ok && len(addrs) == 0 {
@ -113,3 +129,48 @@ func ReplKey(spaceId string) (replKey string) {
}
return spaceId
}
func ConfigurationToNodeConf(c Configuration) (nc *nodeConf, err error) {
nc = &nodeConf{
id: c.Id,
c: c,
// WARN: do not forget to set it later, Configuration does not feature it
//accountId: s.accountId,
addrs: map[string][]string{},
}
if nc.chash, err = chash.New(chash.Config{
PartitionCount: PartitionCount,
ReplicationFactor: ReplicationFactor,
}); err != nil {
return
}
members := make([]chash.Member, 0, len(c.Nodes))
for _, n := range c.Nodes {
if n.HasType(NodeTypeTree) {
members = append(members, n)
}
if n.HasType(NodeTypeConsensus) {
nc.consensusPeers = append(nc.consensusPeers, n.PeerId)
}
if n.HasType(NodeTypeFile) {
nc.filePeers = append(nc.filePeers, n.PeerId)
}
if n.HasType(NodeTypeCoordinator) {
nc.coordinatorPeers = append(nc.coordinatorPeers, n.PeerId)
}
if n.HasType(NodeTypeNamingNode) {
nc.namingNodePeers = append(nc.namingNodePeers, n.PeerId)
}
if n.HasType(NodeTypePaymentProcessingNode) {
nc.paymentProcessingNodePeers = append(nc.paymentProcessingNodePeers, n.PeerId)
}
nc.allMembers = append(nc.allMembers, n)
nc.addrs[n.PeerId] = n.Addresses
}
err = nc.chash.AddMembers(members...)
return
}

View file

@ -2,11 +2,15 @@ package nodeconf
import (
"fmt"
"math/rand"
"testing"
"github.com/anyproto/go-chash"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"math/rand"
"testing"
"go.uber.org/zap"
"gopkg.in/yaml.v3"
)
func TestReplKey(t *testing.T) {
@ -60,6 +64,107 @@ func TestConfiguration_NodeIds(t *testing.T) {
}
func TestNodeConf_NamingNodePeers(t *testing.T) {
ch, err := chash.New(chash.Config{
PartitionCount: PartitionCount,
ReplicationFactor: ReplicationFactor,
})
require.NoError(t, err)
conf := &nodeConf{
id: "last",
accountId: "1",
chash: ch,
namingNodePeers: []string{
"naming-node-1",
"naming-node-2",
"naming-node-3",
},
}
assert.Equal(t, []string{"naming-node-1", "naming-node-2", "naming-node-3"}, conf.NamingNodePeers())
}
func TestNodeConf_PaymentProcessingNodePeers(t *testing.T) {
ch, err := chash.New(chash.Config{
PartitionCount: PartitionCount,
ReplicationFactor: ReplicationFactor,
})
require.NoError(t, err)
conf := &nodeConf{
id: "last",
accountId: "1",
chash: ch,
paymentProcessingNodePeers: []string{
"payment-processing-node-1",
"payment-processing-node-2",
"payment-processing-node-3",
},
}
assert.Equal(t, []string{"payment-processing-node-1", "payment-processing-node-2", "payment-processing-node-3"}, conf.PaymentProcessingNodePeers())
}
func TestNewNodeConfFromYaml(t *testing.T) {
yamlData := `
id: 64ba63209976be4a733bbb91
networkId: N4Gvo3v5wL31RrYgX3PrhAGMYvdWe5rAgtVB8cZySYWrkhb6
nodes:
- peerId: 12D3KooWA8EXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS
addresses:
- 127.0.0.1:4830
types:
- coordinator
- peerId: 12D3KooWA8EXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS
addresses:
- 127.0.0.1:4830
types:
- namingNode
- peerId: 12D3KooXXXEXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS
addresses:
- 127.0.0.1:4830
types:
- paymentProcessingNode
- peerId: 12D3KooYYYEXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS
addresses:
- 127.0.0.1:4830
types:
- file
- peerId: consensus1
addresses:
- 127.0.0.1:4830
types:
- consensus
- peerId: consensus2
addresses:
- 127.0.0.1:4830
types:
- consensus
creationTime: 2023-07-21T11:51:12.970882+01:00
`
var conf Configuration
err := yaml.Unmarshal([]byte(yamlData), &conf)
require.NoError(t, err)
log.Info("conf", zap.Any("conf", conf))
nodeConf, err := ConfigurationToNodeConf(conf)
require.NoError(t, err)
assert.Equal(t, "64ba63209976be4a733bbb91", nodeConf.Id())
assert.Equal(t, "N4Gvo3v5wL31RrYgX3PrhAGMYvdWe5rAgtVB8cZySYWrkhb6", nodeConf.c.NetworkId)
// should not be set by ConfigurationToNodeConf
assert.Equal(t, "", nodeConf.accountId)
assert.Equal(t, []string{"12D3KooYYYEXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS"}, nodeConf.FilePeers())
assert.Equal(t, []string{"consensus1", "consensus2"}, nodeConf.ConsensusPeers())
assert.Equal(t, []string{"12D3KooWA8EXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS"}, nodeConf.CoordinatorPeers())
assert.Equal(t, []string{"12D3KooWA8EXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS"}, nodeConf.NamingNodePeers())
assert.Equal(t, []string{"12D3KooXXXEXV3KjBxEU5EnsPfneLx84vMWAtTBQBeyooN82KSuS"}, nodeConf.PaymentProcessingNodePeers())
}
type testMember string
func (t testMember) Id() string {

View file

@ -3,6 +3,8 @@ package nodeconf
import (
"context"
"sync"
commonaccount "github.com/anyproto/any-sync/accountservice"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/logger"
@ -11,7 +13,6 @@ import (
"github.com/anyproto/any-sync/util/periodicsync"
"github.com/anyproto/go-chash"
"go.uber.org/zap"
"sync"
)
const CName = "common.nodeconf"
@ -117,39 +118,12 @@ func (s *service) setLastConfiguration(c Configuration) (err error) {
return
}
nc := &nodeConf{
id: c.Id,
c: c,
accountId: s.accountId,
addrs: map[string][]string{},
}
if nc.chash, err = chash.New(chash.Config{
PartitionCount: PartitionCount,
ReplicationFactor: ReplicationFactor,
}); err != nil {
nc, err := ConfigurationToNodeConf(c)
if err != nil {
return
}
nc.accountId = s.accountId
members := make([]chash.Member, 0, len(c.Nodes))
for _, n := range c.Nodes {
if n.HasType(NodeTypeTree) {
members = append(members, n)
}
if n.HasType(NodeTypeConsensus) {
nc.consensusPeers = append(nc.consensusPeers, n.PeerId)
}
if n.HasType(NodeTypeFile) {
nc.filePeers = append(nc.filePeers, n.PeerId)
}
if n.HasType(NodeTypeCoordinator) {
nc.coordinatorPeers = append(nc.coordinatorPeers, n.PeerId)
}
nc.allMembers = append(nc.allMembers, n)
nc.addrs[n.PeerId] = n.Addresses
}
if err = nc.chash.AddMembers(members...); err != nil {
return
}
var beforeId = ""
if s.last != nil {
beforeId = s.last.Id()
@ -220,6 +194,18 @@ func (s *service) CoordinatorPeers() []string {
return s.last.CoordinatorPeers()
}
func (s *service) NamingNodePeers() []string {
s.mu.RLock()
defer s.mu.RUnlock()
return s.last.NamingNodePeers()
}
func (s *service) PaymentProcessingNodePeers() []string {
s.mu.RLock()
defer s.mu.RUnlock()
return s.last.PaymentProcessingNodePeers()
}
func (s *service) PeerAddresses(peerId string) ([]string, bool) {
s.mu.RLock()
defer s.mu.RUnlock()