WIP refactoring syncstatus headsync

This commit is contained in:
mcrakhman 2022-12-25 15:08:26 +01:00 committed by Mikhail Iudin
parent 934f413807
commit 53e945b956
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
32 changed files with 390 additions and 286 deletions

View File

@ -2,15 +2,15 @@ package clientspace
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"go.uber.org/zap" "go.uber.org/zap"
) )
type statusReceiver struct { type statusReceiver struct {
} }
func (s *statusReceiver) UpdateTree(ctx context.Context, treeId string, status statusservice.SyncStatus) (err error) { func (s *statusReceiver) UpdateTree(ctx context.Context, treeId string, status syncstatus.SyncStatus) (err error) {
log.With(zap.String("treeId", treeId), zap.Bool("synced", status == statusservice.SyncStatusSynced)). log.With(zap.String("treeId", treeId), zap.Bool("synced", status == syncstatus.SyncStatusSynced)).
Debug("updating sync status") Debug("updating sync status")
return nil return nil
} }

View File

@ -8,7 +8,6 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
) )
@ -17,7 +16,7 @@ type Service interface {
CreateDocument(spaceId string) (id string, err error) CreateDocument(spaceId string) (id string, err error)
DeleteDocument(spaceId, documentId string) (err error) DeleteDocument(spaceId, documentId string) (err error)
AllDocumentIds(spaceId string) (ids []string, err error) AllDocumentIds(spaceId string) (ids []string, err error)
AllDocumentHeads(spaceId string) (ids []diffservice.TreeHeads, err error) AllDocumentHeads(spaceId string) (ids []headsync.TreeHeads, err error)
AddText(spaceId, documentId, text string, isSnapshot bool) (root, head string, err error) AddText(spaceId, documentId, text string, isSnapshot bool) (root, head string, err error)
DumpDocumentTree(spaceId, documentId string) (dump string, err error) DumpDocumentTree(spaceId, documentId string) (dump string, err error)
TreeParams(spaceId, documentId string) (root string, head []string, err error) TreeParams(spaceId, documentId string) (root string, head []string, err error)
@ -74,7 +73,7 @@ func (s *service) AllDocumentIds(spaceId string) (ids []string, err error) {
return return
} }
func (s *service) AllDocumentHeads(spaceId string) (ids []diffservice.TreeHeads, err error) { func (s *service) AllDocumentHeads(spaceId string) (ids []headsync.TreeHeads, err error) {
space, err := s.spaceService.GetSpace(context.Background(), spaceId) space, err := s.spaceService.GetSpace(context.Background(), spaceId)
if err != nil { if err != nil {
return return

View File

@ -3,7 +3,7 @@ package commonspace
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
) )
@ -12,10 +12,10 @@ type commonSpaceGetter struct {
spaceId string spaceId string
aclList *syncacl.SyncACL aclList *syncacl.SyncACL
treeGetter treegetter.TreeGetter treeGetter treegetter.TreeGetter
settings settingsdocument.SettingsDocument settings settings.SettingsObject
} }
func newCommonSpaceGetter(spaceId string, aclList *syncacl.SyncACL, treeGetter treegetter.TreeGetter, settings settingsdocument.SettingsDocument) objectgetter.ObjectGetter { func newCommonSpaceGetter(spaceId string, aclList *syncacl.SyncACL, treeGetter treegetter.TreeGetter, settings settings.SettingsObject) objectgetter.ObjectGetter {
return &commonSpaceGetter{ return &commonSpaceGetter{
spaceId: spaceId, spaceId: spaceId,
aclList: aclList, aclList: aclList,

View File

@ -1,12 +1,11 @@
package diffservice package headsync
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
@ -31,7 +30,7 @@ func newDiffSyncer(
cache treegetter.TreeGetter, cache treegetter.TreeGetter,
storage storage.SpaceStorage, storage storage.SpaceStorage,
clientFactory spacesyncproto.ClientFactory, clientFactory spacesyncproto.ClientFactory,
statusService statusservice.StatusService, syncStatus syncstatus.SyncStatusUpdater,
log *zap.Logger) DiffSyncer { log *zap.Logger) DiffSyncer {
return &diffSyncer{ return &diffSyncer{
diff: diff, diff: diff,
@ -41,7 +40,7 @@ func newDiffSyncer(
confConnector: confConnector, confConnector: confConnector,
clientFactory: clientFactory, clientFactory: clientFactory,
log: log, log: log,
statusService: statusService, syncStatus: syncStatus,
} }
} }
@ -54,7 +53,7 @@ type diffSyncer struct {
clientFactory spacesyncproto.ClientFactory clientFactory spacesyncproto.ClientFactory
log *zap.Logger log *zap.Logger
deletionState deletionstate.DeletionState deletionState deletionstate.DeletionState
statusService statusservice.StatusService syncStatus syncstatus.SyncStatusUpdater
} }
func (d *diffSyncer) Init(deletionState deletionstate.DeletionState) { func (d *diffSyncer) Init(deletionState deletionstate.DeletionState) {
@ -96,26 +95,28 @@ func (d *diffSyncer) Sync(ctx context.Context) error {
func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) {
var ( var (
cl = d.clientFactory.Client(p) cl = d.clientFactory.Client(p)
rdiff = remotediff.NewRemoteDiff(d.spaceId, cl) rdiff = NewRemoteDiff(d.spaceId, cl)
stateCounter uint64 = 0 stateCounter = d.syncStatus.StateCounter()
) )
stateCounter = d.statusService.StateCounter()
newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff)
err = rpcerr.Unwrap(err) err = rpcerr.Unwrap(err)
if err != nil && err != spacesyncproto.ErrSpaceMissing { if err != nil && err != spacesyncproto.ErrSpaceMissing {
d.statusService.SetNodesOnline(p.Id(), false) d.syncStatus.SetNodesOnline(p.Id(), false)
return err return err
} }
d.statusService.SetNodesOnline(p.Id(), true) d.syncStatus.SetNodesOnline(p.Id(), true)
if err == spacesyncproto.ErrSpaceMissing { if err == spacesyncproto.ErrSpaceMissing {
return d.sendPushSpaceRequest(ctx, cl) return d.sendPushSpaceRequest(ctx, cl)
} }
totalLen := len(newIds) + len(changedIds) + len(removedIds) totalLen := len(newIds) + len(changedIds) + len(removedIds)
// not syncing ids which were removed through settings document // not syncing ids which were removed through settings document
filteredIds := d.deletionState.FilterJoin(newIds, changedIds, removedIds) filteredIds := d.deletionState.FilterJoin(newIds, changedIds, removedIds)
d.statusService.RemoveAllExcept(p.Id(), filteredIds, stateCounter) d.syncStatus.RemoveAllExcept(p.Id(), filteredIds, stateCounter)
ctx = peer.CtxWithPeerId(ctx, p.Id()) ctx = peer.CtxWithPeerId(ctx, p.Id())
d.pingTreesInCache(ctx, filteredIds) d.pingTreesInCache(ctx, filteredIds)

View File

@ -1,15 +1,14 @@
package diffservice package headsync
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate/mock_deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf"
@ -111,7 +110,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
spaceId := "spaceId" spaceId := "spaceId"
aclRootId := "aclRootId" aclRootId := "aclRootId"
l := logger.NewNamed(spaceId) l := logger.NewNamed(spaceId)
diffSyncer := newDiffSyncer(spaceId, diffMock, connectorMock, cacheMock, stMock, factory, statusservice.NewNoOpStatusService(), l) diffSyncer := newDiffSyncer(spaceId, diffMock, connectorMock, cacheMock, stMock, factory, syncstatus.NewNoOpSyncStatus(), l)
delState.EXPECT().AddObserver(gomock.Any()) delState.EXPECT().AddObserver(gomock.Any())
diffSyncer.Init(delState) diffSyncer.Init(delState)
@ -120,7 +119,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
GetResponsiblePeers(gomock.Any(), spaceId). GetResponsiblePeers(gomock.Any(), spaceId).
Return([]peer.Peer{mockPeer{}}, nil) Return([]peer.Peer{mockPeer{}}, nil)
diffMock.EXPECT(). diffMock.EXPECT().
Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). Diff(gomock.Any(), gomock.Eq(NewRemoteDiff(spaceId, clientMock))).
Return([]string{"new"}, []string{"changed"}, nil, nil) Return([]string{"new"}, []string{"changed"}, nil, nil)
delState.EXPECT().FilterJoin(gomock.Any()).Return([]string{"new", "changed"}) delState.EXPECT().FilterJoin(gomock.Any()).Return([]string{"new", "changed"})
for _, arg := range []string{"new", "changed"} { for _, arg := range []string{"new", "changed"} {
@ -175,7 +174,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
GetResponsiblePeers(gomock.Any(), spaceId). GetResponsiblePeers(gomock.Any(), spaceId).
Return([]peer.Peer{mockPeer{}}, nil) Return([]peer.Peer{mockPeer{}}, nil)
diffMock.EXPECT(). diffMock.EXPECT().
Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). Diff(gomock.Any(), gomock.Eq(NewRemoteDiff(spaceId, clientMock))).
Return(nil, nil, nil, spacesyncproto.ErrSpaceMissing) Return(nil, nil, nil, spacesyncproto.ErrSpaceMissing)
stMock.EXPECT().ACLStorage().Return(aclStorageMock, nil) stMock.EXPECT().ACLStorage().Return(aclStorageMock, nil)
@ -199,7 +198,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
GetResponsiblePeers(gomock.Any(), spaceId). GetResponsiblePeers(gomock.Any(), spaceId).
Return([]peer.Peer{mockPeer{}}, nil) Return([]peer.Peer{mockPeer{}}, nil)
diffMock.EXPECT(). diffMock.EXPECT().
Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). Diff(gomock.Any(), gomock.Eq(NewRemoteDiff(spaceId, clientMock))).
Return(nil, nil, nil, spacesyncproto.ErrUnexpected) Return(nil, nil, nil, spacesyncproto.ErrUnexpected)
require.NoError(t, diffSyncer.Sync(ctx)) require.NoError(t, diffSyncer.Sync(ctx))

View File

@ -1,13 +1,12 @@
//go:generate mockgen -destination mock_diffservice/mock_diffservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice DiffSyncer //go:generate mockgen -destination mock_headsync/mock_headsync.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync DiffSyncer
package diffservice package headsync
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
@ -22,7 +21,7 @@ type TreeHeads struct {
Heads []string Heads []string
} }
type DiffService interface { type HeadSync interface {
UpdateHeads(id string, heads []string) UpdateHeads(id string, heads []string)
HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error)
RemoveObjects(ids []string) RemoveObjects(ids []string)
@ -33,7 +32,7 @@ type DiffService interface {
Close() (err error) Close() (err error)
} }
type diffService struct { type headSync struct {
spaceId string spaceId string
periodicSync periodicsync.PeriodicSync periodicSync periodicsync.PeriodicSync
storage storage.SpaceStorage storage storage.SpaceStorage
@ -44,22 +43,22 @@ type diffService struct {
syncPeriod int syncPeriod int
} }
func NewDiffService( func NewHeadSync(
spaceId string, spaceId string,
syncPeriod int, syncPeriod int,
storage storage.SpaceStorage, storage storage.SpaceStorage,
confConnector nodeconf.ConfConnector, confConnector nodeconf.ConfConnector,
cache treegetter.TreeGetter, cache treegetter.TreeGetter,
statusService statusservice.StatusService, syncStatus syncstatus.SyncStatusUpdater,
log *zap.Logger) DiffService { log *zap.Logger) HeadSync {
diff := ldiff.New(16, 16) diff := ldiff.New(16, 16)
l := log.With(zap.String("spaceId", spaceId)) l := log.With(zap.String("spaceId", spaceId))
factory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient) factory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient)
syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, statusService, l) syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, syncStatus, l)
periodicSync := periodicsync.NewPeriodicSync(syncPeriod, time.Minute, syncer.Sync, l) periodicSync := periodicsync.NewPeriodicSync(syncPeriod, time.Minute, syncer.Sync, l)
return &diffService{ return &headSync{
spaceId: spaceId, spaceId: spaceId,
storage: storage, storage: storage,
syncer: syncer, syncer: syncer,
@ -70,25 +69,25 @@ func NewDiffService(
} }
} }
func (d *diffService) Init(objectIds []string, deletionState deletionstate.DeletionState) { func (d *headSync) Init(objectIds []string, deletionState deletionstate.DeletionState) {
d.fillDiff(objectIds) d.fillDiff(objectIds)
d.syncer.Init(deletionState) d.syncer.Init(deletionState)
d.periodicSync.Run() d.periodicSync.Run()
} }
func (d *diffService) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) { func (d *headSync) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) {
return remotediff.HandleRangeRequest(ctx, d.diff, req) return HandleRangeRequest(ctx, d.diff, req)
} }
func (d *diffService) UpdateHeads(id string, heads []string) { func (d *headSync) UpdateHeads(id string, heads []string) {
d.syncer.UpdateHeads(id, heads) d.syncer.UpdateHeads(id, heads)
} }
func (d *diffService) AllIds() []string { func (d *headSync) AllIds() []string {
return d.diff.Ids() return d.diff.Ids()
} }
func (d *diffService) DebugAllHeads() (res []TreeHeads) { func (d *headSync) DebugAllHeads() (res []TreeHeads) {
els := d.diff.Elements() els := d.diff.Elements()
for _, el := range els { for _, el := range els {
idHead := TreeHeads{ idHead := TreeHeads{
@ -100,16 +99,16 @@ func (d *diffService) DebugAllHeads() (res []TreeHeads) {
return return
} }
func (d *diffService) RemoveObjects(ids []string) { func (d *headSync) RemoveObjects(ids []string) {
d.syncer.RemoveObjects(ids) d.syncer.RemoveObjects(ids)
} }
func (d *diffService) Close() (err error) { func (d *headSync) Close() (err error) {
d.periodicSync.Close() d.periodicSync.Close()
return nil return nil
} }
func (d *diffService) fillDiff(objectIds []string) { func (d *headSync) fillDiff(objectIds []string) {
var els = make([]ldiff.Element, 0, len(objectIds)) var els = make([]ldiff.Element, 0, len(objectIds))
for _, id := range objectIds { for _, id := range objectIds {
st, err := d.storage.TreeStorage(id) st, err := d.storage.TreeStorage(id)

View File

@ -1,9 +1,9 @@
package diffservice package headsync
import ( import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice/mock_diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync/mock_headsync"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate/mock_deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
mock_storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage" mock_storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
@ -23,12 +23,12 @@ func TestDiffService(t *testing.T) {
storageMock := mock_storage.NewMockSpaceStorage(ctrl) storageMock := mock_storage.NewMockSpaceStorage(ctrl)
treeStorageMock := mock_storage2.NewMockTreeStorage(ctrl) treeStorageMock := mock_storage2.NewMockTreeStorage(ctrl)
diffMock := mock_ldiff.NewMockDiff(ctrl) diffMock := mock_ldiff.NewMockDiff(ctrl)
syncer := mock_diffservice.NewMockDiffSyncer(ctrl) syncer := mock_headsync.NewMockDiffSyncer(ctrl)
delState := mock_deletionstate.NewMockDeletionState(ctrl) delState := mock_deletionstate.NewMockDeletionState(ctrl)
syncPeriod := 1 syncPeriod := 1
initId := "initId" initId := "initId"
service := &diffService{ service := &headSync{
spaceId: spaceId, spaceId: spaceId,
storage: storageMock, storage: storageMock,
periodicSync: pSyncMock, periodicSync: pSyncMock,

View File

@ -1,14 +1,14 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice (interfaces: DiffSyncer) // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync (interfaces: DiffSyncer)
// Package mock_diffservice is a generated GoMock package. // Package mock_headsync is a generated GoMock package.
package mock_diffservice package mock_headsync
import ( import (
context "context" context "context"
reflect "reflect" reflect "reflect"
deletionstate "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" deletionstate "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )

View File

@ -1,4 +1,4 @@
package remotediff package headsync
import ( import (
"context" "context"

View File

@ -1,4 +1,4 @@
package remotediff package headsync
import ( import (
"context" "context"

View File

@ -15,10 +15,10 @@ type rpcHandler struct {
} }
func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) {
return r.s.DiffService().HandleRangeRequest(ctx, req) return r.s.HeadSync().HandleRangeRequest(ctx, req)
} }
func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) {
// TODO: if needed we can launch full sync here // TODO: if needed we can launch full sync here
return r.s.SyncService().StreamPool().AddAndReadStreamSync(stream) return r.s.ObjectSync().StreamPool().AddAndReadStreamSync(stream)
} }

View File

@ -5,11 +5,11 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
@ -110,19 +110,20 @@ func (s *service) NewSpace(ctx context.Context, id string) (Space, error) {
lastConfiguration := s.configurationService.GetLast() lastConfiguration := s.configurationService.GetLast()
confConnector := nodeconf.NewConfConnector(lastConfiguration, s.pool) confConnector := nodeconf.NewConfConnector(lastConfiguration, s.pool)
statusService := statusservice.NewNoOpStatusService() syncStatus := syncstatus.NewNoOpSyncStatus()
// this will work only for clients, not the best solution, but... // this will work only for clients, not the best solution, but...
if !lastConfiguration.IsResponsible(st.Id()) { if !lastConfiguration.IsResponsible(st.Id()) {
statusService = statusservice.NewStatusService(st.Id(), lastConfiguration, st) // TODO: move it to the client package and add possibility to inject SyncStatusProvider from the client
syncStatus = syncstatus.NewSyncStatusProvider(st.Id(), syncstatus.DefaultDeps(lastConfiguration, st))
} }
diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, confConnector, s.treeGetter, statusService, log) headSync := headsync.NewHeadSync(id, s.config.SyncPeriod, st, confConnector, s.treeGetter, syncStatus, log)
syncService := syncservice.NewSyncService(id, confConnector, s.config.SyncPeriod) objectSync := syncservice.NewSyncService(id, confConnector, s.config.SyncPeriod)
sp := &space{ sp := &space{
id: id, id: id,
syncService: syncService, objectSync: objectSync,
diffService: diffService, headSync: headSync,
statusService: statusService, syncStatus: syncStatus,
cache: s.treeGetter, cache: s.treeGetter,
account: s.account, account: s.account,
configuration: lastConfiguration, configuration: lastConfiguration,

View File

@ -1,4 +1,4 @@
package settingsdocument package settings
import ( import (
"context" "context"

View File

@ -1,8 +1,8 @@
package settingsdocument package settings
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
"go.uber.org/zap" "go.uber.org/zap"

View File

@ -1,8 +1,8 @@
package settingsdocument package settings
import ( import (
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate/mock_deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter"

View File

@ -1,4 +1,4 @@
//go:generate mockgen -destination mock_deletionstate/mock_deletionstate.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate DeletionState //go:generate mockgen -destination mock_deletionstate/mock_deletionstate.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate DeletionState
package deletionstate package deletionstate
import ( import (

View File

@ -1,5 +1,5 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate (interfaces: DeletionState) // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate (interfaces: DeletionState)
// Package mock_deletionstate is a generated GoMock package. // Package mock_deletionstate is a generated GoMock package.
package mock_deletionstate package mock_deletionstate
@ -7,7 +7,7 @@ package mock_deletionstate
import ( import (
reflect "reflect" reflect "reflect"
deletionstate "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" deletionstate "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )

View File

@ -1,4 +1,4 @@
package settingsdocument package settings
import ( import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"

View File

@ -1,4 +1,4 @@
package settingsdocument package settings
import ( import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"

View File

@ -0,0 +1,86 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings (interfaces: DeletedIdsProvider,Deleter)
// Package mock_settings is a generated GoMock package.
package mock_settings
import (
reflect "reflect"
tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
gomock "github.com/golang/mock/gomock"
)
// MockDeletedIdsProvider is a mock of DeletedIdsProvider interface.
type MockDeletedIdsProvider struct {
ctrl *gomock.Controller
recorder *MockDeletedIdsProviderMockRecorder
}
// MockDeletedIdsProviderMockRecorder is the mock recorder for MockDeletedIdsProvider.
type MockDeletedIdsProviderMockRecorder struct {
mock *MockDeletedIdsProvider
}
// NewMockDeletedIdsProvider creates a new mock instance.
func NewMockDeletedIdsProvider(ctrl *gomock.Controller) *MockDeletedIdsProvider {
mock := &MockDeletedIdsProvider{ctrl: ctrl}
mock.recorder = &MockDeletedIdsProviderMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockDeletedIdsProvider) EXPECT() *MockDeletedIdsProviderMockRecorder {
return m.recorder
}
// ProvideIds mocks base method.
func (m *MockDeletedIdsProvider) ProvideIds(arg0 tree.ObjectTree, arg1 string) ([]string, string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ProvideIds", arg0, arg1)
ret0, _ := ret[0].([]string)
ret1, _ := ret[1].(string)
ret2, _ := ret[2].(error)
return ret0, ret1, ret2
}
// ProvideIds indicates an expected call of ProvideIds.
func (mr *MockDeletedIdsProviderMockRecorder) ProvideIds(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProvideIds", reflect.TypeOf((*MockDeletedIdsProvider)(nil).ProvideIds), arg0, arg1)
}
// MockDeleter is a mock of Deleter interface.
type MockDeleter struct {
ctrl *gomock.Controller
recorder *MockDeleterMockRecorder
}
// MockDeleterMockRecorder is the mock recorder for MockDeleter.
type MockDeleterMockRecorder struct {
mock *MockDeleter
}
// NewMockDeleter creates a new mock instance.
func NewMockDeleter(ctrl *gomock.Controller) *MockDeleter {
mock := &MockDeleter{ctrl: ctrl}
mock.recorder = &MockDeleterMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockDeleter) EXPECT() *MockDeleterMockRecorder {
return m.recorder
}
// Delete mocks base method.
func (m *MockDeleter) Delete() {
m.ctrl.T.Helper()
m.ctrl.Call(m, "Delete")
}
// Delete indicates an expected call of Delete.
func (mr *MockDeleterMockRecorder) Delete() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockDeleter)(nil).Delete))
}

View File

@ -1,8 +1,8 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument (interfaces: DeletedIdsProvider,Deleter) // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings (interfaces: DeletedIdsProvider,Deleter)
// Package mock_settingsdocument is a generated GoMock package. // Package mock_settings is a generated GoMock package.
package mock_settingsdocument package mock_settings
import ( import (
reflect "reflect" reflect "reflect"

View File

@ -1,12 +1,12 @@
//go:generate mockgen -destination mock_settingsdocument/mock_settingsdocument.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument DeletedIdsProvider,Deleter //go:generate mockgen -destination mock_settings/mock_settings.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings DeletedIdsProvider,Deleter
package settingsdocument package settings
import ( import (
"context" "context"
"errors" "errors"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
@ -15,18 +15,18 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
var log = logger.NewNamed("commonspace.settingsdocument") var log = logger.NewNamed("commonspace.settings")
type SettingsDocument interface { type SettingsObject interface {
synctree.SyncTree synctree.SyncTree
Init(ctx context.Context) (err error) Init(ctx context.Context) (err error)
DeleteObject(id string) (err error) DeleteObject(id string) (err error)
} }
var ( var (
ErrDeleteSelf = errors.New("cannot delete seld") ErrDeleteSelf = errors.New("cannot delete self")
ErrAlreadyDeleted = errors.New("the document is already deleted") ErrAlreadyDeleted = errors.New("the object is already deleted")
ErrDocDoesNotExist = errors.New("the document does not exist") ErrObjDoesNotExist = errors.New("the object does not exist")
) )
type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error)
@ -42,7 +42,7 @@ type Deps struct {
del Deleter del Deleter
} }
type settingsDocument struct { type settingsObject struct {
synctree.SyncTree synctree.SyncTree
account account.Service account account.Service
spaceId string spaceId string
@ -56,7 +56,7 @@ type settingsDocument struct {
lastChangeId string lastChangeId string
} }
func NewSettingsDocument(deps Deps, spaceId string) (doc SettingsDocument) { func NewSettingsObject(deps Deps, spaceId string) (obj SettingsObject) {
var deleter Deleter var deleter Deleter
if deps.del == nil { if deps.del == nil {
deleter = newDeleter(deps.Store, deps.DeletionState, deps.TreeGetter) deleter = newDeleter(deps.Store, deps.DeletionState, deps.TreeGetter)
@ -71,7 +71,7 @@ func NewSettingsDocument(deps Deps, spaceId string) (doc SettingsDocument) {
loop.notify() loop.notify()
}) })
s := &settingsDocument{ s := &settingsObject{
loop: loop, loop: loop,
spaceId: spaceId, spaceId: spaceId,
account: deps.Account, account: deps.Account,
@ -88,11 +88,11 @@ func NewSettingsDocument(deps Deps, spaceId string) (doc SettingsDocument) {
s.prov = deps.prov s.prov = deps.prov
} }
doc = s obj = s
return return
} }
func (s *settingsDocument) updateIds(tr tree.ObjectTree, lastChangeId string) { func (s *settingsObject) updateIds(tr tree.ObjectTree, lastChangeId string) {
s.lastChangeId = lastChangeId s.lastChangeId = lastChangeId
ids, lastId, err := s.prov.ProvideIds(tr, s.lastChangeId) ids, lastId, err := s.prov.ProvideIds(tr, s.lastChangeId)
if err != nil { if err != nil {
@ -106,17 +106,17 @@ func (s *settingsDocument) updateIds(tr tree.ObjectTree, lastChangeId string) {
} }
// Update is called as part of UpdateListener interface // Update is called as part of UpdateListener interface
func (s *settingsDocument) Update(tr tree.ObjectTree) { func (s *settingsObject) Update(tr tree.ObjectTree) {
s.updateIds(tr, s.lastChangeId) s.updateIds(tr, s.lastChangeId)
} }
// Rebuild is called as part of UpdateListener interface (including when the object is built for the first time, e.g. on Init call) // Rebuild is called as part of UpdateListener interface (including when the object is built for the first time, e.g. on Init call)
func (s *settingsDocument) Rebuild(tr tree.ObjectTree) { func (s *settingsObject) Rebuild(tr tree.ObjectTree) {
// at initial build "s" may not contain the object tree, so it is safer to provide it from the function parameter // at initial build "s" may not contain the object tree, so it is safer to provide it from the function parameter
s.updateIds(tr, "") s.updateIds(tr, "")
} }
func (s *settingsDocument) Init(ctx context.Context) (err error) { func (s *settingsObject) Init(ctx context.Context) (err error) {
settingsId := s.store.SpaceSettingsId() settingsId := s.store.SpaceSettingsId()
log.Debug("space settings id", zap.String("id", settingsId)) log.Debug("space settings id", zap.String("id", settingsId))
s.SyncTree, err = s.buildFunc(ctx, settingsId, s) s.SyncTree, err = s.buildFunc(ctx, settingsId, s)
@ -128,12 +128,12 @@ func (s *settingsDocument) Init(ctx context.Context) (err error) {
return return
} }
func (s *settingsDocument) Close() error { func (s *settingsObject) Close() error {
s.loop.Close() s.loop.Close()
return s.SyncTree.Close() return s.SyncTree.Close()
} }
func (s *settingsDocument) DeleteObject(id string) (err error) { func (s *settingsObject) DeleteObject(id string) (err error) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
if s.ID() == id { if s.ID() == id {
@ -146,7 +146,7 @@ func (s *settingsDocument) DeleteObject(id string) (err error) {
} }
_, err = s.store.TreeStorage(id) _, err = s.store.TreeStorage(id)
if err != nil { if err != nil {
err = ErrDocDoesNotExist err = ErrObjDoesNotExist
return return
} }

View File

@ -1,10 +1,10 @@
package settingsdocument package settings
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account/mock_account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account/mock_account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate/mock_deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/mock_settingsdocument" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/mock_settings"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
@ -42,12 +42,12 @@ func (t *testSyncTreeMock) Unlock() {
type settingsFixture struct { type settingsFixture struct {
spaceId string spaceId string
docId string docId string
doc *settingsDocument doc *settingsObject
ctrl *gomock.Controller ctrl *gomock.Controller
treeGetter *mock_treegetter.MockTreeGetter treeGetter *mock_treegetter.MockTreeGetter
spaceStorage *mock_storage.MockSpaceStorage spaceStorage *mock_storage.MockSpaceStorage
provider *mock_settingsdocument.MockDeletedIdsProvider provider *mock_settings.MockDeletedIdsProvider
deleter *mock_settingsdocument.MockDeleter deleter *mock_settings.MockDeleter
syncTree *mock_synctree.MockSyncTree syncTree *mock_synctree.MockSyncTree
delState *mock_deletionstate.MockDeletionState delState *mock_deletionstate.MockDeletionState
account *mock_account.MockService account *mock_account.MockService
@ -55,21 +55,21 @@ type settingsFixture struct {
func newSettingsFixture(t *testing.T) *settingsFixture { func newSettingsFixture(t *testing.T) *settingsFixture {
spaceId := "spaceId" spaceId := "spaceId"
docId := "documentId" objectId := "objectId"
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
acc := mock_account.NewMockService(ctrl) acc := mock_account.NewMockService(ctrl)
treeGetter := mock_treegetter.NewMockTreeGetter(ctrl) treeGetter := mock_treegetter.NewMockTreeGetter(ctrl)
st := mock_storage.NewMockSpaceStorage(ctrl) st := mock_storage.NewMockSpaceStorage(ctrl)
delState := mock_deletionstate.NewMockDeletionState(ctrl) delState := mock_deletionstate.NewMockDeletionState(ctrl)
prov := mock_settingsdocument.NewMockDeletedIdsProvider(ctrl) prov := mock_settings.NewMockDeletedIdsProvider(ctrl)
syncTree := mock_synctree.NewMockSyncTree(ctrl) syncTree := mock_synctree.NewMockSyncTree(ctrl)
del := mock_settingsdocument.NewMockDeleter(ctrl) del := mock_settings.NewMockDeleter(ctrl)
delState.EXPECT().AddObserver(gomock.Any()) delState.EXPECT().AddObserver(gomock.Any())
buildFunc := BuildTreeFunc(func(ctx context.Context, id string, listener updatelistener.UpdateListener) (synctree.SyncTree, error) { buildFunc := BuildTreeFunc(func(ctx context.Context, id string, listener updatelistener.UpdateListener) (synctree.SyncTree, error) {
require.Equal(t, docId, id) require.Equal(t, objectId, id)
return newTestObjMock(syncTree), nil return newTestObjMock(syncTree), nil
}) })
@ -82,10 +82,10 @@ func newSettingsFixture(t *testing.T) *settingsFixture {
prov: prov, prov: prov,
del: del, del: del,
} }
doc := NewSettingsDocument(deps, spaceId).(*settingsDocument) doc := NewSettingsObject(deps, spaceId).(*settingsObject)
return &settingsFixture{ return &settingsFixture{
spaceId: spaceId, spaceId: spaceId,
docId: docId, docId: objectId,
doc: doc, doc: doc,
ctrl: ctrl, ctrl: ctrl,
treeGetter: treeGetter, treeGetter: treeGetter,
@ -102,7 +102,7 @@ func (fx *settingsFixture) stop() {
fx.ctrl.Finish() fx.ctrl.Finish()
} }
func TestSettingsDocument_Init(t *testing.T) { func TestSettingsObject_Init(t *testing.T) {
fx := newSettingsFixture(t) fx := newSettingsFixture(t)
defer fx.stop() defer fx.stop()
@ -116,7 +116,7 @@ func TestSettingsDocument_Init(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
} }
func TestSettingsDocument_DeleteObject(t *testing.T) { func TestSettingsObject_DeleteObject(t *testing.T) {
fx := newSettingsFixture(t) fx := newSettingsFixture(t)
defer fx.stop() defer fx.stop()
@ -164,7 +164,7 @@ func TestSettingsDocument_DeleteObject(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
} }
func TestSettingsDocument_Rebuild(t *testing.T) { func TestSettingsObject_Rebuild(t *testing.T) {
fx := newSettingsFixture(t) fx := newSettingsFixture(t)
defer fx.stop() defer fx.stop()

View File

@ -5,14 +5,14 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
@ -71,7 +71,7 @@ type Space interface {
Init(ctx context.Context) error Init(ctx context.Context) error
StoredIds() []string StoredIds() []string
DebugAllHeads() []diffservice.TreeHeads DebugAllHeads() []headsync.TreeHeads
Description() (SpaceDescription, error) Description() (SpaceDescription, error)
SpaceSyncRpc() RpcHandler SpaceSyncRpc() RpcHandler
@ -81,7 +81,7 @@ type Space interface {
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error)
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
StatusService() statusservice.StatusService StatusService() syncstatus.SyncStatusUpdater
Close() error Close() error
} }
@ -93,22 +93,22 @@ type space struct {
rpc *rpcHandler rpc *rpcHandler
syncService syncservice.SyncService objectSync syncservice.SyncService
diffService diffservice.DiffService headSync headsync.HeadSync
statusService statusservice.StatusService syncStatus syncstatus.SyncStatusUpdater
storage storage.SpaceStorage storage storage.SpaceStorage
cache treegetter.TreeGetter cache treegetter.TreeGetter
account account.Service account account.Service
aclList *syncacl.SyncACL aclList *syncacl.SyncACL
configuration nodeconf.Configuration configuration nodeconf.Configuration
settingsDocument settingsdocument.SettingsDocument settingsObject settings.SettingsObject
isClosed atomic.Bool isClosed atomic.Bool
treesUsed atomic.Int32 treesUsed atomic.Int32
} }
func (s *space) LastUsage() time.Time { func (s *space) LastUsage() time.Time {
return s.syncService.LastUsage() return s.objectSync.LastUsage()
} }
func (s *space) Locked() bool { func (s *space) Locked() bool {
@ -164,10 +164,10 @@ func (s *space) Init(ctx context.Context) (err error) {
if err != nil { if err != nil {
return return
} }
s.aclList = syncacl.NewSyncACL(aclList, s.syncService.StreamPool()) s.aclList = syncacl.NewSyncACL(aclList, s.objectSync.StreamPool())
deletionState := deletionstate.NewDeletionState(s.storage) deletionState := deletionstate.NewDeletionState(s.storage)
deps := settingsdocument.Deps{ deps := settings.Deps{
BuildFunc: func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) { BuildFunc: func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) {
res, err := s.BuildTree(ctx, id, listener) res, err := s.BuildTree(ctx, id, listener)
if err != nil { if err != nil {
@ -181,16 +181,16 @@ func (s *space) Init(ctx context.Context) (err error) {
Store: s.storage, Store: s.storage,
DeletionState: deletionState, DeletionState: deletionState,
} }
s.settingsDocument = settingsdocument.NewSettingsDocument(deps, s.id) s.settingsObject = settings.NewSettingsObject(deps, s.id)
objectGetter := newCommonSpaceGetter(s.id, s.aclList, s.cache, s.settingsDocument) objectGetter := newCommonSpaceGetter(s.id, s.aclList, s.cache, s.settingsObject)
s.syncService.Init(objectGetter) s.objectSync.Init(objectGetter)
s.diffService.Init(initialIds, deletionState) s.headSync.Init(initialIds, deletionState)
err = s.settingsDocument.Init(ctx) err = s.settingsObject.Init(ctx)
if err != nil { if err != nil {
return return
} }
s.statusService.Run() s.syncStatus.Run()
return nil return nil
} }
@ -199,24 +199,24 @@ func (s *space) SpaceSyncRpc() RpcHandler {
return s.rpc return s.rpc
} }
func (s *space) SyncService() syncservice.SyncService { func (s *space) ObjectSync() syncservice.SyncService {
return s.syncService return s.objectSync
} }
func (s *space) DiffService() diffservice.DiffService { func (s *space) HeadSync() headsync.HeadSync {
return s.diffService return s.headSync
} }
func (s *space) StatusService() statusservice.StatusService { func (s *space) StatusService() syncstatus.SyncStatusUpdater {
return s.statusService return s.syncStatus
} }
func (s *space) StoredIds() []string { func (s *space) StoredIds() []string {
return s.diffService.AllIds() return s.headSync.AllIds()
} }
func (s *space) DebugAllHeads() []diffservice.TreeHeads { func (s *space) DebugAllHeads() []headsync.TreeHeads {
return s.diffService.DebugAllHeads() return s.headSync.DebugAllHeads()
} }
func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload) (id string, err error) { func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload) (id string, err error) {
@ -227,12 +227,12 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
SyncService: s.syncService, SyncService: s.objectSync,
Configuration: s.configuration, Configuration: s.configuration,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
StatusService: s.statusService, SyncStatus: s.syncStatus,
HeadNotifiable: s.diffService, HeadNotifiable: s.headSync,
} }
return synctree.DeriveSyncTree(ctx, deps) return synctree.DeriveSyncTree(ctx, deps)
} }
@ -245,12 +245,12 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
SyncService: s.syncService, SyncService: s.objectSync,
Configuration: s.configuration, Configuration: s.configuration,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
StatusService: s.statusService, SyncStatus: s.syncStatus,
HeadNotifiable: s.diffService, HeadNotifiable: s.headSync,
} }
return synctree.CreateSyncTree(ctx, deps) return synctree.CreateSyncTree(ctx, deps)
} }
@ -262,20 +262,20 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene
} }
deps := synctree.BuildDeps{ deps := synctree.BuildDeps{
SpaceId: s.id, SpaceId: s.id,
SyncService: s.syncService, SyncService: s.objectSync,
Configuration: s.configuration, Configuration: s.configuration,
HeadNotifiable: s.diffService, HeadNotifiable: s.headSync,
Listener: listener, Listener: listener,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
TreeUsage: &s.treesUsed, TreeUsage: &s.treesUsed,
StatusService: s.statusService, SyncStatus: s.syncStatus,
} }
return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps) return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps)
} }
func (s *space) DeleteTree(ctx context.Context, id string) (err error) { func (s *space) DeleteTree(ctx context.Context, id string) (err error) {
return s.settingsDocument.DeleteObject(id) return s.settingsObject.DeleteObject(id)
} }
func (s *space) Close() error { func (s *space) Close() error {
@ -285,13 +285,13 @@ func (s *space) Close() error {
log.With(zap.String("id", s.id)).Debug("space closed") log.With(zap.String("id", s.id)).Debug("space closed")
}() }()
var mError errs.Group var mError errs.Group
if err := s.diffService.Close(); err != nil { if err := s.headSync.Close(); err != nil {
mError.Add(err) mError.Add(err)
} }
if err := s.syncService.Close(); err != nil { if err := s.objectSync.Close(); err != nil {
mError.Add(err) mError.Add(err)
} }
if err := s.settingsDocument.Close(); err != nil { if err := s.settingsObject.Close(); err != nil {
mError.Add(err) mError.Add(err)
} }
if err := s.aclList.Close(); err != nil { if err := s.aclList.Close(); err != nil {
@ -300,7 +300,7 @@ func (s *space) Close() error {
if err := s.storage.Close(); err != nil { if err := s.storage.Close(); err != nil {
mError.Add(err) mError.Add(err)
} }
if err := s.statusService.Close(); err != nil { if err := s.syncStatus.Close(); err != nil {
mError.Add(err) mError.Add(err)
} }

View File

@ -1,40 +0,0 @@
package statusservice
type noOpStatusService struct{}
func NewNoOpStatusService() StatusService {
return &noOpStatusService{}
}
func (n *noOpStatusService) HeadsChange(treeId string, heads []string) {
}
func (n *noOpStatusService) HeadsReceive(senderId, treeId string, heads []string) {
}
func (n *noOpStatusService) Watch(treeId string) (err error) {
return
}
func (n *noOpStatusService) Unwatch(treeId string) {
}
func (n *noOpStatusService) SetNodesOnline(senderId string, online bool) {
}
func (n *noOpStatusService) StateCounter() uint64 {
return 0
}
func (n *noOpStatusService) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) {
}
func (n *noOpStatusService) SetUpdateReceiver(updater UpdateReceiver) {
}
func (n *noOpStatusService) Run() {
}
func (n *noOpStatusService) Close() error {
return nil
}

View File

@ -0,0 +1,30 @@
package syncstatus
type noOpSyncStatus struct{}
func NewNoOpSyncStatus() SyncStatusUpdater {
return &noOpSyncStatus{}
}
func (n *noOpSyncStatus) HeadsChange(treeId string, heads []string) {
}
func (n *noOpSyncStatus) HeadsReceive(senderId, treeId string, heads []string) {
}
func (n *noOpSyncStatus) SetNodesOnline(senderId string, online bool) {
}
func (n *noOpSyncStatus) StateCounter() uint64 {
return 0
}
func (n *noOpSyncStatus) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) {
}
func (n *noOpSyncStatus) Run() {
}
func (n *noOpSyncStatus) Close() error {
return nil
}

View File

@ -1,4 +1,4 @@
package statusservice package syncstatus
import ( import (
"context" "context"
@ -15,31 +15,40 @@ import (
) )
const ( const (
statusServiceUpdateInterval = 5 syncUpdateInterval = 5
statusServiceTimeout = time.Second syncTimeout = time.Second
) )
var log = logger.NewNamed("commonspace.statusservice") var log = logger.NewNamed("commonspace.syncstatus")
type UpdateReceiver interface { type UpdateReceiver interface {
UpdateTree(ctx context.Context, treeId string, status SyncStatus) (err error) UpdateTree(ctx context.Context, treeId string, status SyncStatus) (err error)
UpdateNodeConnection(online bool) UpdateNodeConnection(online bool)
} }
type StatusService interface { type SyncStatusUpdater interface {
HeadsChange(treeId string, heads []string) HeadsChange(treeId string, heads []string)
HeadsReceive(senderId, treeId string, heads []string) HeadsReceive(senderId, treeId string, heads []string)
Watch(treeId string) (err error)
Unwatch(treeId string)
SetNodesOnline(senderId string, online bool) SetNodesOnline(senderId string, online bool)
StateCounter() uint64 StateCounter() uint64
RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64)
SetUpdateReceiver(updater UpdateReceiver)
Run() Run()
Close() error Close() error
} }
type SyncStatusWatcher interface {
Watch(treeId string) (err error)
Unwatch(treeId string)
SetUpdateReceiver(updater UpdateReceiver)
}
type SyncStatusProvider interface {
SyncStatusUpdater
SyncStatusWatcher
}
type SyncStatus int type SyncStatus int
const ( const (
@ -60,7 +69,7 @@ type treeStatus struct {
heads []string heads []string
} }
type statusService struct { type syncStatusProvider struct {
sync.Mutex sync.Mutex
configuration nodeconf.Configuration configuration nodeconf.Configuration
periodicSync periodicsync.PeriodicSync periodicSync periodicsync.PeriodicSync
@ -74,36 +83,57 @@ type statusService struct {
nodesOnline bool nodesOnline bool
treeStatusBuf []treeStatus treeStatusBuf []treeStatus
updateIntervalSecs int
updateTimeout time.Duration
} }
func NewStatusService(spaceId string, configuration nodeconf.Configuration, store storage.SpaceStorage) StatusService { type SyncStatusDeps struct {
return &statusService{ UpdateIntervalSecs int
spaceId: spaceId, UpdateTimeout time.Duration
treeHeads: map[string]treeHeadsEntry{}, Configuration nodeconf.Configuration
watchers: map[string]struct{}{}, Storage storage.SpaceStorage
configuration: configuration, }
storage: store,
stateCounter: 0, func DefaultDeps(configuration nodeconf.Configuration, store storage.SpaceStorage) SyncStatusDeps {
return SyncStatusDeps{
UpdateIntervalSecs: syncUpdateInterval,
UpdateTimeout: syncTimeout,
Configuration: configuration,
Storage: store,
} }
} }
func (s *statusService) SetUpdateReceiver(updater UpdateReceiver) { func NewSyncStatusProvider(spaceId string, deps SyncStatusDeps) SyncStatusProvider {
return &syncStatusProvider{
spaceId: spaceId,
treeHeads: map[string]treeHeadsEntry{},
watchers: map[string]struct{}{},
updateIntervalSecs: deps.UpdateIntervalSecs,
updateTimeout: deps.UpdateTimeout,
configuration: deps.Configuration,
storage: deps.Storage,
stateCounter: 0,
}
}
func (s *syncStatusProvider) SetUpdateReceiver(updater UpdateReceiver) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
s.updateReceiver = updater s.updateReceiver = updater
} }
func (s *statusService) Run() { func (s *syncStatusProvider) Run() {
s.periodicSync = periodicsync.NewPeriodicSync( s.periodicSync = periodicsync.NewPeriodicSync(
statusServiceUpdateInterval, s.updateIntervalSecs,
statusServiceTimeout, s.updateTimeout,
s.update, s.update,
log) log)
s.periodicSync.Run() s.periodicSync.Run()
} }
func (s *statusService) HeadsChange(treeId string, heads []string) { func (s *syncStatusProvider) HeadsChange(treeId string, heads []string) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
@ -118,7 +148,7 @@ func (s *statusService) HeadsChange(treeId string, heads []string) {
s.stateCounter++ s.stateCounter++
} }
func (s *statusService) SetNodesOnline(senderId string, online bool) { func (s *syncStatusProvider) SetNodesOnline(senderId string, online bool) {
if !s.isSenderResponsible(senderId) { if !s.isSenderResponsible(senderId) {
return return
} }
@ -129,7 +159,7 @@ func (s *statusService) SetNodesOnline(senderId string, online bool) {
s.nodesOnline = online s.nodesOnline = online
} }
func (s *statusService) update(ctx context.Context) (err error) { func (s *syncStatusProvider) update(ctx context.Context) (err error) {
s.treeStatusBuf = s.treeStatusBuf[:0] s.treeStatusBuf = s.treeStatusBuf[:0]
s.Lock() s.Lock()
@ -158,7 +188,7 @@ func (s *statusService) update(ctx context.Context) (err error) {
return return
} }
func (s *statusService) HeadsReceive(senderId, treeId string, heads []string) { func (s *syncStatusProvider) HeadsReceive(senderId, treeId string, heads []string) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
@ -187,7 +217,7 @@ func (s *statusService) HeadsReceive(senderId, treeId string, heads []string) {
s.treeHeads[treeId] = curTreeHeads s.treeHeads[treeId] = curTreeHeads
} }
func (s *statusService) Watch(treeId string) (err error) { func (s *syncStatusProvider) Watch(treeId string) (err error) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
_, ok := s.treeHeads[treeId] _, ok := s.treeHeads[treeId]
@ -217,7 +247,7 @@ func (s *statusService) Watch(treeId string) (err error) {
return return
} }
func (s *statusService) Unwatch(treeId string) { func (s *syncStatusProvider) Unwatch(treeId string) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
@ -226,19 +256,19 @@ func (s *statusService) Unwatch(treeId string) {
} }
} }
func (s *statusService) Close() (err error) { func (s *syncStatusProvider) Close() (err error) {
s.periodicSync.Close() s.periodicSync.Close()
return return
} }
func (s *statusService) StateCounter() uint64 { func (s *syncStatusProvider) StateCounter() uint64 {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
return s.stateCounter return s.stateCounter
} }
func (s *statusService) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) { func (s *syncStatusProvider) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) {
// if sender is not a responsible node, then this should have no effect // if sender is not a responsible node, then this should have no effect
if !s.isSenderResponsible(senderId) { if !s.isSenderResponsible(senderId) {
return return
@ -261,6 +291,6 @@ func (s *statusService) RemoveAllExcept(senderId string, differentRemoteIds []st
} }
} }
func (s *statusService) isSenderResponsible(senderId string) bool { func (s *syncStatusProvider) isSenderResponsible(senderId string) bool {
return slices.Contains(s.configuration.NodeIds(s.spaceId), senderId) return slices.Contains(s.configuration.NodeIds(s.spaceId), senderId)
} }

View File

@ -5,10 +5,10 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
@ -40,13 +40,13 @@ type SyncTree interface {
type syncTree struct { type syncTree struct {
tree.ObjectTree tree.ObjectTree
synchandler.SyncHandler synchandler.SyncHandler
syncClient SyncClient syncClient SyncClient
statusService statusservice.StatusService syncStatus syncstatus.SyncStatusUpdater
notifiable HeadNotifiable notifiable HeadNotifiable
listener updatelistener.UpdateListener listener updatelistener.UpdateListener
treeUsage *atomic.Int32 treeUsage *atomic.Int32
isClosed bool isClosed bool
isDeleted bool isDeleted bool
} }
var log = logger.NewNamed("commonspace.synctree").Sugar() var log = logger.NewNamed("commonspace.synctree").Sugar()
@ -63,7 +63,7 @@ type CreateDeps struct {
SyncService syncservice.SyncService SyncService syncservice.SyncService
AclList list.ACLList AclList list.ACLList
SpaceStorage spacestorage.SpaceStorage SpaceStorage spacestorage.SpaceStorage
StatusService statusservice.StatusService SyncStatus syncstatus.SyncStatusUpdater
HeadNotifiable HeadNotifiable HeadNotifiable HeadNotifiable
} }
@ -77,7 +77,7 @@ type BuildDeps struct {
SpaceStorage spacestorage.SpaceStorage SpaceStorage spacestorage.SpaceStorage
TreeStorage storage.TreeStorage TreeStorage storage.TreeStorage
TreeUsage *atomic.Int32 TreeUsage *atomic.Int32
StatusService statusservice.StatusService SyncStatus syncstatus.SyncStatusUpdater
} }
func newWrappedSyncClient( func newWrappedSyncClient(
@ -106,7 +106,7 @@ func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
deps.HeadNotifiable.UpdateHeads(id, heads) deps.HeadNotifiable.UpdateHeads(id, heads)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil) headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
deps.StatusService.HeadsChange(id, heads) deps.SyncStatus.HeadsChange(id, heads)
syncClient.BroadcastAsync(headUpdate) syncClient.BroadcastAsync(headUpdate)
return return
} }
@ -127,7 +127,7 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
deps.HeadNotifiable.UpdateHeads(id, heads) deps.HeadNotifiable.UpdateHeads(id, heads)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil) headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
deps.StatusService.HeadsChange(id, heads) deps.SyncStatus.HeadsChange(id, heads)
syncClient.BroadcastAsync(headUpdate) syncClient.BroadcastAsync(headUpdate)
return return
} }
@ -219,14 +219,14 @@ func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t Sy
deps.SyncService, deps.SyncService,
deps.Configuration) deps.Configuration)
syncTree := &syncTree{ syncTree := &syncTree{
ObjectTree: objTree, ObjectTree: objTree,
syncClient: syncClient, syncClient: syncClient,
notifiable: deps.HeadNotifiable, notifiable: deps.HeadNotifiable,
treeUsage: deps.TreeUsage, treeUsage: deps.TreeUsage,
listener: deps.Listener, listener: deps.Listener,
statusService: deps.StatusService, syncStatus: deps.SyncStatus,
} }
syncHandler := newSyncTreeHandler(syncTree, syncClient, deps.StatusService) syncHandler := newSyncTreeHandler(syncTree, syncClient, deps.SyncStatus)
syncTree.SyncHandler = syncHandler syncTree.SyncHandler = syncHandler
t = syncTree t = syncTree
syncTree.Lock() syncTree.Lock()
@ -266,7 +266,7 @@ func (s *syncTree) AddContent(ctx context.Context, content tree.SignableChangeCo
if s.notifiable != nil { if s.notifiable != nil {
s.notifiable.UpdateHeads(s.ID(), res.Heads) s.notifiable.UpdateHeads(s.ID(), res.Heads)
} }
s.statusService.HeadsChange(s.ID(), res.Heads) s.syncStatus.HeadsChange(s.ID(), res.Heads)
headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added)
err = s.syncClient.BroadcastAsync(headUpdate) err = s.syncClient.BroadcastAsync(headUpdate)
return return

View File

@ -2,9 +2,9 @@ package synctree
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener"
@ -72,7 +72,7 @@ func Test_DeriveSyncTree(t *testing.T) {
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
StatusService: statusservice.NewNoOpStatusService(), SyncStatus: syncstatus.NewNoOpSyncStatus(),
HeadNotifiable: headNotifiableMock, HeadNotifiable: headNotifiableMock,
} }
objTreeMock.EXPECT().ID().Return("id") objTreeMock.EXPECT().ID().Return("id")
@ -111,7 +111,7 @@ func Test_CreateSyncTree(t *testing.T) {
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
StatusService: statusservice.NewNoOpStatusService(), SyncStatus: syncstatus.NewNoOpSyncStatus(),
HeadNotifiable: headNotifiableMock, HeadNotifiable: headNotifiableMock,
} }
@ -128,12 +128,12 @@ func Test_BuildSyncTree(t *testing.T) {
syncClientMock := mock_synctree.NewMockSyncClient(ctrl) syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
tr := &syncTree{ tr := &syncTree{
ObjectTree: objTreeMock, ObjectTree: objTreeMock,
SyncHandler: nil, SyncHandler: nil,
syncClient: syncClientMock, syncClient: syncClientMock,
listener: updateListenerMock, listener: updateListenerMock,
isClosed: false, isClosed: false,
statusService: statusservice.NewNoOpStatusService(), syncStatus: syncstatus.NewNoOpSyncStatus(),
} }
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}

View File

@ -3,8 +3,8 @@ package synctree
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
@ -14,33 +14,32 @@ import (
) )
type syncTreeHandler struct { type syncTreeHandler struct {
objTree tree.ObjectTree objTree tree.ObjectTree
syncClient SyncClient syncClient SyncClient
statusService statusservice.StatusService syncStatus syncstatus.SyncStatusUpdater
handlerLock sync.Mutex handlerLock sync.Mutex
queue ReceiveQueue queue ReceiveQueue
} }
const maxQueueSize = 5 const maxQueueSize = 5
func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient, statusService statusservice.StatusService) synchandler.SyncHandler { func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient, syncStatus syncstatus.SyncStatusUpdater) synchandler.SyncHandler {
return &syncTreeHandler{ return &syncTreeHandler{
objTree: objTree, objTree: objTree,
syncClient: syncClient, syncClient: syncClient,
statusService: statusService, syncStatus: syncStatus,
queue: newReceiveQueue(maxQueueSize), queue: newReceiveQueue(maxQueueSize),
} }
} }
func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) (err error) { func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) (err error) {
// TODO: when implementing sync status check msg heads before sending into queue
unmarshalled := &treechangeproto.TreeSyncMessage{} unmarshalled := &treechangeproto.TreeSyncMessage{}
err = proto.Unmarshal(msg.Payload, unmarshalled) err = proto.Unmarshal(msg.Payload, unmarshalled)
if err != nil { if err != nil {
return return
} }
s.statusService.HeadsReceive(senderId, msg.ObjectId, treechangeproto.GetHeads(unmarshalled)) s.syncStatus.HeadsReceive(senderId, msg.ObjectId, treechangeproto.GetHeads(unmarshalled))
queueFull := s.queue.AddMessage(senderId, unmarshalled, msg.ReplyId) queueFull := s.queue.AddMessage(senderId, unmarshalled, msg.ReplyId)
if queueFull { if queueFull {

View File

@ -3,7 +3,7 @@ package synctree
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree"
@ -50,10 +50,10 @@ func newSyncHandlerFixture(t *testing.T) *syncHandlerFixture {
receiveQueueMock := mock_synctree.NewMockReceiveQueue(ctrl) receiveQueueMock := mock_synctree.NewMockReceiveQueue(ctrl)
syncHandler := &syncTreeHandler{ syncHandler := &syncTreeHandler{
objTree: objectTreeMock, objTree: objectTreeMock,
syncClient: syncClientMock, syncClient: syncClientMock,
queue: receiveQueueMock, queue: receiveQueueMock,
statusService: statusservice.NewNoOpStatusService(), syncStatus: syncstatus.NewNoOpSyncStatus(),
} }
return &syncHandlerFixture{ return &syncHandlerFixture{
ctrl: ctrl, ctrl: ctrl,