1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-11 18:20:28 +09:00

Update tree sync logic

This commit is contained in:
mcrakhman 2022-09-15 13:42:51 +02:00 committed by Mikhail Iudin
parent 404f128310
commit 6d38f381ce
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
6 changed files with 67 additions and 6 deletions

View file

@ -2,16 +2,24 @@ package cache
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
)
const CName = "commonspace.cache"
type TreeContainer interface {
Tree() tree.ObjectTree
}
type TreeResult struct {
Release func()
Tree tree.ObjectTree
Release func()
TreeContainer TreeContainer
}
type TreeCache interface {
app.ComponentRunnable
GetTree(ctx context.Context, id string) (TreeResult, error)
AddTree(ctx context.Context, payload storage.TreeStorageCreatePayload) error
}

View file

@ -4,6 +4,8 @@ import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache"
"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/nodeconf"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
@ -25,11 +27,15 @@ type Service interface {
type service struct {
config config.Space
configurationService nodeconf.Service
storage storage.Storage
cache cache.TreeCache
}
func (s *service) Init(a *app.App) (err error) {
s.config = a.MustComponent(config.CName).(*config.Config).Space
s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service)
s.storage = a.MustComponent(storage.CName).(storage.Storage)
s.cache = a.MustComponent(cache.CName).(cache.TreeCache)
return nil
}
@ -44,6 +50,8 @@ func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) {
nconf: s.configurationService.GetLast(),
conf: s.config,
syncService: syncService,
cache: s.cache,
storage: s.storage,
}
if err := sp.Init(ctx); err != nil {
return nil, err

View file

@ -3,12 +3,17 @@ package commonspace
import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"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/synctree"
"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/config"
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff"
"go.uber.org/zap"
"math/rand"
@ -22,6 +27,9 @@ type Space interface {
SpaceSyncRpc() RpcHandler
SyncService() syncservice.SyncService
CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error)
BuildTree(id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error)
Close() error
}
@ -35,6 +43,21 @@ type space struct {
rpc *rpcHandler
periodicSync *periodicSync
syncService syncservice.SyncService
storage storage.Storage
cache cache.TreeCache
}
func (s *space) CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) {
return synctree.CreateSyncTree(payload, s.syncService, listener, nil, s.storage.CreateTreeStorage)
}
func (s *space) BuildTree(id string, listener tree.ObjectTreeUpdateListener) (t tree.ObjectTree, err error) {
store, err := s.storage.Storage(id)
if err != nil {
return
}
return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, nil)
}
func (s *space) Id() string {
@ -100,10 +123,19 @@ func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) {
if err != nil {
return nil
}
s.pingTreesInCache(ctx, newIds)
s.pingTreesInCache(ctx, changedIds)
log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds)))
return
}
func (s *space) pingTreesInCache(ctx context.Context, trees []string) {
for _, tId := range trees {
_, _ = s.cache.GetTree(ctx, tId)
}
}
func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) {
if s.nconf.IsResponsible(s.id) {
return s.nconf.AllPeers(ctx, s.id)

View file

@ -0,0 +1,13 @@
package storage
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
)
type Storage interface {
storage.Provider
app.ComponentRunnable
}
const CName = "commonspace.storage"

View file

@ -59,7 +59,7 @@ func (s *syncHandler) HandleHeadUpdate(
}
err = func() error {
objTree := res.Tree
objTree := res.TreeContainer.Tree()
objTree.Lock()
defer res.Release()
defer objTree.Unlock()
@ -111,7 +111,7 @@ func (s *syncHandler) HandleFullSyncRequest(
// TODO: check if sync request contains changes and add them (also do head update in this case)
err = func() error {
objTree := res.Tree
objTree := res.TreeContainer.Tree()
objTree.Lock()
defer res.Release()
defer objTree.Unlock()
@ -143,7 +143,7 @@ func (s *syncHandler) HandleFullSyncResponse(
}
err = func() error {
objTree := res.Tree
objTree := res.TreeContainer.Tree()
objTree.Lock()
defer res.Release()
defer objTree.Unlock()

View file

@ -16,8 +16,8 @@ type SyncTree struct {
}
func CreateSyncTree(
syncService syncservice.SyncService,
payload tree.ObjectTreeCreatePayload,
syncService syncservice.SyncService,
listener tree.ObjectTreeUpdateListener,
aclList list.ACLList,
createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) {