1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-10 10:00:49 +09:00

Change cache logic

This commit is contained in:
mcrakhman 2022-09-28 20:56:11 +02:00 committed by Mikhail Iudin
parent 2347591c69
commit b59edc4b6b
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
8 changed files with 63 additions and 41 deletions

View file

@ -3,6 +3,7 @@ package cache
import (
"context"
"errors"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
)
@ -23,8 +24,6 @@ type TreeResult struct {
type BuildFunc = func(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error)
type TreeCache interface {
GetTree(ctx context.Context, id string) (TreeResult, error)
SetBuildFunc(f BuildFunc)
Close() error
app.ComponentRunnable
GetTree(ctx context.Context, spaceId, treeId string) (TreeResult, error)
}

View file

@ -119,7 +119,7 @@ func (d *diffService) syncWithPeer(ctx context.Context, p peer.Peer) (err error)
func (d *diffService) pingTreesInCache(ctx context.Context, trees []string) {
for _, tId := range trees {
_, _ = d.cache.GetTree(ctx, tId)
_, _ = d.cache.GetTree(ctx, d.spaceId, tId)
}
}

View file

@ -30,7 +30,7 @@ func New() Service {
type Service interface {
CreateSpace(ctx context.Context, cache cache.TreeCache, payload SpaceCreatePayload) (Space, error)
DeriveSpace(ctx context.Context, cache cache.TreeCache, payload SpaceDerivePayload) (Space, error)
GetSpace(ctx context.Context, id string, cache cache.TreeCache) (sp Space, err error)
GetSpace(ctx context.Context, id string) (sp Space, err error)
app.Component
}
@ -38,12 +38,14 @@ type service struct {
config config.Space
configurationService nodeconf.Service
storageProvider storage.SpaceStorageProvider
cache cache.TreeCache
}
func (s *service) Init(a *app.App) (err error) {
s.config = a.MustComponent(config.CName).(*config.Config).Space
s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider)
s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service)
s.cache = a.MustComponent(cache.CName).(cache.TreeCache)
return nil
}
@ -127,7 +129,7 @@ func (s *service) CreateSpace(
return
}
return s.GetSpace(ctx, spaceId, cache)
return s.GetSpace(ctx, spaceId)
}
func (s *service) DeriveSpace(
@ -219,22 +221,22 @@ func (s *service) DeriveSpace(
return
}
return s.GetSpace(ctx, spaceId, cache)
return s.GetSpace(ctx, spaceId)
}
func (s *service) GetSpace(ctx context.Context, id string, cache cache.TreeCache) (Space, error) {
func (s *service) GetSpace(ctx context.Context, id string) (Space, error) {
st, err := s.storageProvider.SpaceStorage(id)
if err != nil {
return nil, err
}
lastConfiguration := s.configurationService.GetLast()
diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, lastConfiguration, cache, log)
syncService := syncservice.NewSyncService(id, diffService, cache, lastConfiguration)
diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, lastConfiguration, s.cache, log)
syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration)
sp := &space{
id: id,
syncService: syncService,
diffService: diffService,
cache: cache,
cache: s.cache,
storage: st,
}
if err := sp.Init(ctx); err != nil {

View file

@ -73,8 +73,6 @@ func (s *space) Init(ctx context.Context) (err error) {
}
s.diffService.Init(initialIds)
s.syncService.Init()
// basically this provides access for the external cache to use space's tree building functions
s.cache.SetBuildFunc(s.BuildTree)
return nil
}
@ -148,6 +146,5 @@ func (s *space) BuildTree(ctx context.Context, id string, listener synctree.Upda
func (s *space) Close() error {
s.diffService.Close()
s.cache.Close()
return s.syncService.Close()
}

View file

@ -10,6 +10,7 @@ import (
)
type syncHandler struct {
spaceId string
treeCache cache.TreeCache
syncClient SyncClient
}
@ -18,8 +19,9 @@ type SyncHandler interface {
HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error)
}
func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandler {
func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient) *syncHandler {
return &syncHandler{
spaceId: spaceId,
treeCache: treeCache,
syncClient: syncClient,
}
@ -48,7 +50,7 @@ func (s *syncHandler) HandleHeadUpdate(
fullRequest *spacesyncproto.ObjectFullSyncRequest
result tree.AddResult
)
res, err := s.treeCache.GetTree(ctx, msg.TreeId)
res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId)
if err != nil {
return
}
@ -100,7 +102,7 @@ func (s *syncHandler) HandleFullSyncRequest(
}
}()
res, err := s.treeCache.GetTree(ctx, msg.TreeId)
res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId)
if err != nil {
return
}
@ -136,7 +138,7 @@ func (s *syncHandler) HandleFullSyncResponse(
senderId string,
response *spacesyncproto.ObjectFullSyncResponse,
msg *spacesyncproto.ObjectSyncMessage) (err error) {
res, err := s.treeCache.GetTree(ctx, msg.TreeId)
res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId)
if err != nil {
return
}

View file

@ -49,7 +49,7 @@ func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.T
streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
return syncHandler.HandleMessage(ctx, senderId, message)
})
syncHandler = newSyncHandler(cache, streamPool)
syncHandler = newSyncHandler(spaceId, cache, streamPool)
return newSyncService(spaceId, headNotifiable, syncHandler, streamPool, configuration)
}

View file

@ -3,8 +3,10 @@ package nodecache
import (
"context"
"errors"
"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/node/nodespace"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
"time"
)
@ -12,9 +14,45 @@ import (
var log = logger.NewNamed("treecache")
var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree")
type ctxKey int
const spaceKey ctxKey = 0
type treeCache struct {
gcttl int
cache ocache.OCache
gcttl int
cache ocache.OCache
nodeService nodespace.Service
}
func (c *treeCache) Run(ctx context.Context) (err error) {
return nil
}
func (c *treeCache) Close(ctx context.Context) (err error) {
return c.cache.Close()
}
func (c *treeCache) Init(a *app.App) (err error) {
c.nodeService = a.MustComponent(nodespace.CName).(nodespace.Service)
c.cache = ocache.New(
func(ctx context.Context, id string) (value ocache.Object, err error) {
spaceId := ctx.Value(spaceKey).(string)
space, err := c.nodeService.GetSpace(ctx, spaceId)
if err != nil {
return
}
return space.BuildTree(ctx, id, nil)
},
ocache.WithLogger(log.Sugar()),
ocache.WithGCPeriod(time.Minute),
ocache.WithTTL(time.Duration(c.gcttl)*time.Second),
ocache.WithRefCounter(false),
)
return nil
}
func (c *treeCache) Name() (name string) {
return cache.CName
}
func NewNodeCache(ttl int) cache.TreeCache {
@ -23,24 +61,9 @@ func NewNodeCache(ttl int) cache.TreeCache {
}
}
func (c *treeCache) SetBuildFunc(buildFunc cache.BuildFunc) {
c.cache = ocache.New(
func(ctx context.Context, id string) (value ocache.Object, err error) {
return buildFunc(ctx, id, nil)
},
ocache.WithLogger(log.Sugar()),
ocache.WithGCPeriod(time.Minute),
ocache.WithTTL(time.Duration(c.gcttl)*time.Second),
ocache.WithRefCounter(false),
)
}
func (c *treeCache) Close() (err error) {
return c.cache.Close()
}
func (c *treeCache) GetTree(ctx context.Context, id string) (res cache.TreeResult, err error) {
func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) {
var cacheRes ocache.Object
ctx = context.WithValue(ctx, spaceKey, spaceId)
cacheRes, err = c.cache.Get(ctx, id)
if err != nil {
return cache.TreeResult{}, err

View file

@ -9,7 +9,6 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
"time"
)
@ -40,7 +39,7 @@ func (s *service) Init(a *app.App) (err error) {
s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider)
s.spaceCache = ocache.New(
func(ctx context.Context, id string) (value ocache.Object, err error) {
return s.commonSpace.GetSpace(ctx, id, nodecache.NewNodeCache(s.conf.GCTTL))
return s.commonSpace.GetSpace(ctx, id)
},
ocache.WithLogger(log.Sugar()),
ocache.WithGCPeriod(time.Minute),