mirror of
https://github.com/tim-beatham/smegmesh.git
synced 2025-08-18 08:59:45 +02:00
Bidirectional syncing
This commit is contained in:
@@ -3,8 +3,10 @@ package sync
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"time"
|
||||
|
||||
crdt "github.com/tim-beatham/wgmesh/pkg/automerge"
|
||||
"github.com/tim-beatham/wgmesh/pkg/ctrlserver"
|
||||
logging "github.com/tim-beatham/wgmesh/pkg/log"
|
||||
"github.com/tim-beatham/wgmesh/pkg/rpc"
|
||||
@@ -123,17 +125,12 @@ func (s *SyncRequesterImpl) SyncMesh(meshId, endpoint string) error {
|
||||
return errors.New("mesh does not exist")
|
||||
}
|
||||
|
||||
syncMeshRequest := rpc.SyncMeshRequest{
|
||||
MeshId: meshId,
|
||||
Changes: mesh.SaveChanges(),
|
||||
}
|
||||
|
||||
c := rpc.NewSyncServiceClient(client)
|
||||
|
||||
ctx, cancel := context.WithTimeout(authContext, time.Second)
|
||||
ctx, cancel := context.WithTimeout(authContext, 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
_, err = c.SyncMesh(ctx, &syncMeshRequest)
|
||||
err = syncMesh(mesh, ctx, c)
|
||||
|
||||
if err != nil {
|
||||
return s.handleErr(meshId, endpoint, err)
|
||||
@@ -144,6 +141,50 @@ func (s *SyncRequesterImpl) SyncMesh(meshId, endpoint string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func syncMesh(mesh *crdt.CrdtNodeManager, ctx context.Context, client rpc.SyncServiceClient) error {
|
||||
stream, err := client.SyncMesh(ctx)
|
||||
|
||||
syncer := mesh.GetSyncer()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for {
|
||||
msg, moreMessages := syncer.GenerateMessage()
|
||||
|
||||
err := stream.Send(&rpc.SyncMeshRequest{MeshId: mesh.MeshId, Changes: msg})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
in, err := stream.Recv()
|
||||
|
||||
if err != nil && err != io.EOF {
|
||||
logging.ErrorLog.Printf("Stream recv error: %s\n", err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
if err != io.EOF && len(in.Changes) != 0 {
|
||||
err = syncer.RecvMessage(in.Changes)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
logging.ErrorLog.Printf("Syncer recv error: %s\n", err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
if !moreMessages {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
logging.InfoLog.Println("SYNC finished")
|
||||
stream.CloseSend()
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewSyncRequester(s *ctrlserver.MeshCtrlServer) SyncRequester {
|
||||
errorHdlr := NewSyncErrorHandler(s.MeshManager)
|
||||
return &SyncRequesterImpl{server: s, errorHdlr: errorHdlr}
|
||||
|
Reference in New Issue
Block a user