Update tree sync logic
This commit is contained in:
parent
404f128310
commit
6d38f381ce
12
common/commonspace/cache/treecache.go
vendored
12
common/commonspace/cache/treecache.go
vendored
@ -2,16 +2,24 @@ package cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"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/storage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const CName = "commonspace.cache"
|
||||||
|
|
||||||
|
type TreeContainer interface {
|
||||||
|
Tree() tree.ObjectTree
|
||||||
|
}
|
||||||
|
|
||||||
type TreeResult struct {
|
type TreeResult struct {
|
||||||
Release func()
|
Release func()
|
||||||
Tree tree.ObjectTree
|
TreeContainer TreeContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
type TreeCache interface {
|
type TreeCache interface {
|
||||||
|
app.ComponentRunnable
|
||||||
GetTree(ctx context.Context, id string) (TreeResult, error)
|
GetTree(ctx context.Context, id string) (TreeResult, error)
|
||||||
AddTree(ctx context.Context, payload storage.TreeStorageCreatePayload) error
|
AddTree(ctx context.Context, payload storage.TreeStorageCreatePayload) error
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
|
"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/commonspace/syncservice"
|
||||||
"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/config"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
||||||
@ -25,11 +27,15 @@ type Service interface {
|
|||||||
type service struct {
|
type service struct {
|
||||||
config config.Space
|
config config.Space
|
||||||
configurationService nodeconf.Service
|
configurationService nodeconf.Service
|
||||||
|
storage storage.Storage
|
||||||
|
cache cache.TreeCache
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Init(a *app.App) (err error) {
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
s.config = a.MustComponent(config.CName).(*config.Config).Space
|
s.config = a.MustComponent(config.CName).(*config.Config).Space
|
||||||
s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +50,8 @@ func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) {
|
|||||||
nconf: s.configurationService.GetLast(),
|
nconf: s.configurationService.GetLast(),
|
||||||
conf: s.config,
|
conf: s.config,
|
||||||
syncService: syncService,
|
syncService: syncService,
|
||||||
|
cache: s.cache,
|
||||||
|
storage: s.storage,
|
||||||
}
|
}
|
||||||
if err := sp.Init(ctx); err != nil {
|
if err := sp.Init(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@ -3,12 +3,17 @@ package commonspace
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"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/remotediff"
|
||||||
"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/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/synctree"
|
||||||
"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"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
"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"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@ -22,6 +27,9 @@ type Space interface {
|
|||||||
SpaceSyncRpc() RpcHandler
|
SpaceSyncRpc() RpcHandler
|
||||||
SyncService() syncservice.SyncService
|
SyncService() syncservice.SyncService
|
||||||
|
|
||||||
|
CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error)
|
||||||
|
BuildTree(id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error)
|
||||||
|
|
||||||
Close() error
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,6 +43,21 @@ type space struct {
|
|||||||
rpc *rpcHandler
|
rpc *rpcHandler
|
||||||
periodicSync *periodicSync
|
periodicSync *periodicSync
|
||||||
syncService syncservice.SyncService
|
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 {
|
func (s *space) Id() string {
|
||||||
@ -100,10 +123,19 @@ func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return 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)))
|
log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds)))
|
||||||
return
|
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) {
|
func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) {
|
||||||
if s.nconf.IsResponsible(s.id) {
|
if s.nconf.IsResponsible(s.id) {
|
||||||
return s.nconf.AllPeers(ctx, 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 {
|
err = func() error {
|
||||||
objTree := res.Tree
|
objTree := res.TreeContainer.Tree()
|
||||||
objTree.Lock()
|
objTree.Lock()
|
||||||
defer res.Release()
|
defer res.Release()
|
||||||
defer objTree.Unlock()
|
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)
|
// TODO: check if sync request contains changes and add them (also do head update in this case)
|
||||||
err = func() error {
|
err = func() error {
|
||||||
objTree := res.Tree
|
objTree := res.TreeContainer.Tree()
|
||||||
objTree.Lock()
|
objTree.Lock()
|
||||||
defer res.Release()
|
defer res.Release()
|
||||||
defer objTree.Unlock()
|
defer objTree.Unlock()
|
||||||
@ -143,7 +143,7 @@ func (s *syncHandler) HandleFullSyncResponse(
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = func() error {
|
err = func() error {
|
||||||
objTree := res.Tree
|
objTree := res.TreeContainer.Tree()
|
||||||
objTree.Lock()
|
objTree.Lock()
|
||||||
defer res.Release()
|
defer res.Release()
|
||||||
defer objTree.Unlock()
|
defer objTree.Unlock()
|
||||||
|
|||||||
@ -16,8 +16,8 @@ type SyncTree struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CreateSyncTree(
|
func CreateSyncTree(
|
||||||
syncService syncservice.SyncService,
|
|
||||||
payload tree.ObjectTreeCreatePayload,
|
payload tree.ObjectTreeCreatePayload,
|
||||||
|
syncService syncservice.SyncService,
|
||||||
listener tree.ObjectTreeUpdateListener,
|
listener tree.ObjectTreeUpdateListener,
|
||||||
aclList list.ACLList,
|
aclList list.ACLList,
|
||||||
createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) {
|
createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user