Add storage and change API to include both tree types

This commit is contained in:
mcrakhman 2022-08-11 15:54:27 +02:00 committed by Mikhail Iudin
parent 02ae77645d
commit 45a0e43fe4
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
8 changed files with 105 additions and 30 deletions

View File

@ -9,14 +9,13 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/config" "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/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/api" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/api"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/file"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
@ -97,10 +96,10 @@ func Bootstrap(a *app.App) {
Register(node.New()). Register(node.New()).
Register(secure.New()). Register(secure.New()).
Register(server.New()). Register(server.New()).
Register(file.New()).
Register(dialer.New()). Register(dialer.New()).
Register(pool.NewPool()). Register(pool.NewPool()).
Register(configuration.New()). Register(storage.New()).
//Register(&example.Example{})
Register(document.New()). Register(document.New()).
Register(message.New()). Register(message.New()).
Register(requesthandler.New()). Register(requesthandler.New()).

View File

@ -378,6 +378,10 @@ func (a *aclTree) Root() *Change {
return a.tree.Root() return a.tree.Root()
} }
func (a *aclTree) Close() error {
return nil
}
func (a *aclTree) SnapshotPath() []string { func (a *aclTree) SnapshotPath() []string {
// TODO: think about caching this // TODO: think about caching this

View File

@ -18,4 +18,5 @@ type CommonTree interface {
ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error)
Storage() treestorage.TreeStorage Storage() treestorage.TreeStorage
DebugDump() (string, error) DebugDump() (string, error)
Close() error
} }

View File

@ -360,6 +360,10 @@ func (d *docTree) Root() *Change {
return d.tree.Root() return d.tree.Root()
} }
func (d *docTree) Close() error {
return nil
}
func (d *docTree) SnapshotPath() []string { func (d *docTree) SnapshotPath() []string {
// TODO: think about caching this // TODO: think about caching this

View File

@ -6,8 +6,8 @@ import (
"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/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
"go.uber.org/zap" "go.uber.org/zap"
"io" "io"
@ -53,7 +53,8 @@ func (s *service) Run(ctx context.Context) (err error) {
} }
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("/treeDump", s.treeDump) mux.HandleFunc("/treeDump", s.treeDump)
mux.HandleFunc("/createDocument", s.createDocument) mux.HandleFunc("/createDocumentTree", s.createDocumentTree)
mux.HandleFunc("/createACLTree", s.createACLTree)
mux.HandleFunc("/appendDocument", s.appendDocument) mux.HandleFunc("/appendDocument", s.appendDocument)
s.srv.Handler = mux s.srv.Handler = mux
@ -79,8 +80,9 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) {
dump string dump string
err error err error
) )
err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error { err = s.treeCache.Do(context.Background(), treeId, func(obj interface{}) error {
dump, err = tree.DebugDump() t := obj.(tree.CommonTree)
dump, err = t.DebugDump()
if err != nil { if err != nil {
return err return err
} }
@ -93,13 +95,25 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) {
sendText(w, http.StatusOK, dump) sendText(w, http.StatusOK, dump)
} }
func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { func (s *service) createDocumentTree(w http.ResponseWriter, req *http.Request) {
var ( var (
query = req.URL.Query() query = req.URL.Query()
text = query.Get("text") text = query.Get("text")
aclTreeId = query.Get("aclTreeId")
) )
timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30)
treeId, err := s.documentService.CreateDocument(timeoutCtx, fmt.Sprintf("created document with id: %s", text)) treeId, err := s.documentService.CreateDocumentTree(timeoutCtx, aclTreeId, text)
cancel()
if err != nil {
sendText(w, http.StatusInternalServerError, err.Error())
return
}
sendText(w, http.StatusOK, treeId)
}
func (s *service) createACLTree(w http.ResponseWriter, req *http.Request) {
timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30)
treeId, err := s.documentService.CreateACLTree(timeoutCtx)
cancel() cancel()
if err != nil { if err != nil {
sendText(w, http.StatusInternalServerError, err.Error()) sendText(w, http.StatusInternalServerError, err.Error())

View File

@ -2,15 +2,16 @@ package document
import ( import (
"context" "context"
"fmt"
"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/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto"
@ -23,10 +24,10 @@ var CName = "DocumentService"
var log = logger.NewNamed("documentservice") var log = logger.NewNamed("documentservice")
type service struct { type service struct {
messageService message.Service messageService message.Service
treeCache treecache.Service treeCache treecache.Service
account account.Service account account.Service
treeStorageProvider treestorage.Provider storage storage.Service
// to create new documents we need to know all nodes // to create new documents we need to know all nodes
nodes []*node.Node nodes []*node.Node
} }
@ -45,7 +46,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) {
s.account = a.MustComponent(account.CName).(account.Service) s.account = a.MustComponent(account.CName).(account.Service)
s.messageService = a.MustComponent(message.CName).(message.Service) s.messageService = a.MustComponent(message.CName).(message.Service)
s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) s.treeCache = a.MustComponent(treecache.CName).(treecache.Service)
// TODO: add TreeStorageProvider service s.storage = a.MustComponent(storage.CName).(storage.Service)
nodesService := a.MustComponent(node.CName).(node.Service) nodesService := a.MustComponent(node.CName).(node.Service)
s.nodes = nodesService.Nodes() s.nodes = nodesService.Nodes()
@ -76,7 +77,11 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err
Debug("updating document") Debug("updating document")
err = s.treeCache.Do(ctx, id, func(obj interface{}) error { err = s.treeCache.Do(ctx, id, func(obj interface{}) error {
docTree := obj.(tree.DocTree) docTree, ok := obj.(tree.DocTree)
if !ok {
return fmt.Errorf("can't update acl trees with text")
}
docTree.Lock() docTree.Lock()
defer docTree.Unlock() defer docTree.Unlock()
err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error {
@ -141,7 +146,7 @@ func (s *service) CreateACLTree(ctx context.Context) (id string, err error) {
} }
} }
return nil return nil
}, s.treeStorageProvider.CreateTreeStorage) }, s.storage.CreateTreeStorage)
id, err = t.TreeID() id, err = t.TreeID()
if err != nil { if err != nil {
@ -188,7 +193,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text
defer t.RUnlock() defer t.RUnlock()
content := createInitialTextChange(text) content := createInitialTextChange(text)
doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage) doc, err := tree.CreateNewTreeStorage(acc, t, content, s.storage.CreateTreeStorage)
if err != nil { if err != nil {
return err return err
} }

View File

@ -0,0 +1,48 @@
package storage
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb"
)
var CName = "storage"
type Service interface {
treestorage.Provider
}
func New() app.Component {
return &service{}
}
type service struct {
storageProvider treestorage.Provider
}
func (s *service) Init(ctx context.Context, a *app.App) (err error) {
s.storageProvider = treestorage.NewInMemoryTreeStorageProvider()
return nil
}
func (s *service) TreeStorage(treeId string) (treestorage.TreeStorage, error) {
return s.storageProvider.TreeStorage(treeId)
}
func (s *service) CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (treestorage.TreeStorage, error) {
return s.storageProvider.CreateTreeStorage(treeId, header, changes)
}
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 nil
}

View File

@ -8,10 +8,10 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage"
"go.uber.org/zap" "go.uber.org/zap"
) )
@ -29,9 +29,9 @@ type Service interface {
} }
type service struct { type service struct {
treeProvider treestorage.Provider storage storage.Service
account account.Service account account.Service
cache ocache.OCache cache ocache.OCache
} }
func New() app.ComponentRunnable { func New() app.ComponentRunnable {
@ -56,7 +56,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea
With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))).
Debug("adding tree with changes") Debug("adding tree with changes")
_, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) _, err := s.storage.CreateTreeStorage(treeId, header, changes)
if err != nil { if err != nil {
return err return err
} }
@ -66,7 +66,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea
func (s *service) Init(ctx context.Context, a *app.App) (err error) { func (s *service) Init(ctx context.Context, a *app.App) (err error) {
s.cache = ocache.New(s.loadTree) s.cache = ocache.New(s.loadTree)
s.account = a.MustComponent(account.CName).(account.Service) s.account = a.MustComponent(account.CName).(account.Service)
s.treeProvider = treestorage.NewInMemoryTreeStorageProvider() s.storage = a.MustComponent(storage.CName).(storage.Service)
// TODO: for test we should load some predefined keys // TODO: for test we should load some predefined keys
return nil return nil
} }
@ -84,7 +84,7 @@ func (s *service) Close(ctx context.Context) (err error) {
} }
func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) {
t, err := s.treeProvider.TreeStorage(id) t, err := s.storage.TreeStorage(id)
if err != nil { if err != nil {
return nil, err return nil, err
} }