Timer in go that syncs with random nodes in the mesh every

given time interval.
This commit is contained in:
Tim Beatham
2023-10-20 12:41:06 +01:00
parent ec87afc235
commit c200544cee
16 changed files with 208 additions and 30 deletions

View File

@@ -1,5 +1,13 @@
package sync
import (
"errors"
crdt "github.com/tim-beatham/wgmesh/pkg/automerge"
"github.com/tim-beatham/wgmesh/pkg/lib"
"github.com/tim-beatham/wgmesh/pkg/manager"
)
// Syncer: picks random nodes from the mesh
type Syncer interface {
Sync(meshId string) error
@@ -7,14 +15,65 @@ type Syncer interface {
}
type SyncerImpl struct {
manager *manager.MeshManger
requester SyncRequester
authenticatedNodes []crdt.MeshNodeCrdt
}
const subSetLength = 5
const maxAuthentications = 30
// Sync: Sync random nodes
func (s *SyncerImpl) Sync(meshId string) error {
mesh := s.manager.GetMesh(meshId)
if mesh == nil {
return errors.New("the provided mesh does not exist")
}
snapshot, err := mesh.GetCrdt()
if err != nil {
return err
}
pubKey, err := s.manager.GetPublicKey(meshId)
if err != nil {
return err
}
excludedNodes := map[string]struct{}{
pubKey.String(): {},
}
meshNodes := lib.MapValuesWithExclude(snapshot.Nodes, excludedNodes)
randomSubset := lib.RandomSubsetOfLength(meshNodes, subSetLength)
for _, n := range randomSubset {
err := s.requester.SyncMesh(meshId, n.HostEndpoint)
if err != nil {
return err
}
}
return nil
}
// SyncMeshes:
// SyncMeshes: Sync all meshes
func (s *SyncerImpl) SyncMeshes() error {
for _, m := range s.manager.Meshes {
err := s.Sync(m.MeshId)
if err != nil {
return err
}
}
return nil
}
func NewSyncer(m *manager.MeshManger, r SyncRequester) Syncer {
return &SyncerImpl{manager: m, requester: r}
}