From 293ada96c893c6407773b74f0cbd95403f91ee4c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 14 Jul 2022 21:23:40 +0200 Subject: [PATCH] Add tree cache service --- cmd/node/node.go | 2 ++ pkg/acl/acltree/acltree.go | 7 +++++ service/treecache/service.go | 56 ++++++++++++++++++++++++------------ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index 157d29a5..bbbfdda0 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -8,6 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "go.uber.org/zap" "os" "os/signal" @@ -55,6 +56,7 @@ func main() { // bootstrap components a.Register(conf) a.Register(acc) + a.Register(treecache.NewTreeCache()) Bootstrap(a) // start app diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index ed14f446..5d5b770d 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -27,6 +27,12 @@ type TreeUpdateListener interface { Rebuild(tree ACLTree) } +type NoOpListener struct{} + +func (n NoOpListener) Update(tree ACLTree) {} + +func (n NoOpListener) Rebuild(tree ACLTree) {} + type ACLTree interface { ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) @@ -195,6 +201,7 @@ func (a *aclTree) rebuildFromStorage(fromStart bool) error { } func (a *aclTree) ACLState() *ACLState { + // TODO: probably locks should be happening outside because we are using object cache a.RLock() defer a.RUnlock() return a.aclState diff --git a/service/treecache/service.go b/service/treecache/service.go index 620da179..0aef289c 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -6,39 +6,59 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" ) -type TreeCache interface { - Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree)) error +const CName = "treecache" + +type Service interface { + Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error } type service struct { treeProvider treestorage.Provider + account account.Service cache ocache.OCache } +func NewTreeCache() app.ComponentRunnable { + return &service{} +} + +func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error { + tree, err := s.cache.Get(ctx, treeId) + defer s.cache.Release(treeId) + if err != nil { + return err + } + return f(tree.(acltree.ACLTree)) +} + func (s *service) Init(ctx context.Context, a *app.App) (err error) { - s.cache = ocache.New() -} - -func (s *service) Name() (name string) { - //TODO implement me - panic("implement me") -} - -func (s *service) Run(ctx context.Context) (err error) { - //TODO implement me - panic("implement me") -} - -func (s *service) Close(ctx context.Context) (err error) { + s.cache = ocache.New(s.loadTree) + s.account = a.MustComponent(account.CName).(account.Service) + // TODO: for test we should load some predefined keys return nil } -func (s *service) loadTree(ctx context.Context, id string) (value ocache.Object, err error) { +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + return nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.cache.Close() +} + +func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { tree, err := s.treeProvider.TreeStorage(id) if err != nil { return nil, err } - + // TODO: should probably accept nil listeners + aclTree, err := acltree.BuildACLTree(tree, s.account.Account(), acltree.NoOpListener{}) + return aclTree, err }