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 ( 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
} }

View File

@ -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

View File

@ -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)

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 { 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()

View File

@ -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) {