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:
parent
404f128310
commit
6d38f381ce
6 changed files with 67 additions and 6 deletions
12
common/commonspace/cache/treecache.go
vendored
12
common/commonspace/cache/treecache.go
vendored
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
13
common/commonspace/storage/storage.go
Normal file
13
common/commonspace/storage/storage.go
Normal 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"
|
|
@ -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()
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue