From 45a0e43fe46ef251393ed4c6503cc01ba9aee21e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 11 Aug 2022 15:54:27 +0200 Subject: [PATCH] Add storage and change API to include both tree types --- cmd/node/node.go | 9 +++-- pkg/acl/tree/acltree.go | 4 +++ pkg/acl/tree/commontree.go | 1 + pkg/acl/tree/doctree.go | 4 +++ service/api/service.go | 32 ++++++++++++----- service/{sync => }/document/service.go | 23 +++++++----- service/storage/service.go | 48 ++++++++++++++++++++++++++ service/treecache/service.go | 14 ++++---- 8 files changed, 105 insertions(+), 30 deletions(-) rename service/{sync => }/document/service.go (92%) create mode 100644 service/storage/service.go diff --git a/cmd/node/node.go b/cmd/node/node.go index 5020fe12..e4f39327 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -9,14 +9,13 @@ import ( "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/api" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/file" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document" "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/rpc/server" "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/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/requesthandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -97,10 +96,10 @@ func Bootstrap(a *app.App) { Register(node.New()). Register(secure.New()). Register(server.New()). - Register(file.New()). Register(dialer.New()). Register(pool.NewPool()). - Register(configuration.New()). + Register(storage.New()). + //Register(&example.Example{}) Register(document.New()). Register(message.New()). Register(requesthandler.New()). diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index fdfc48eb..8ea8b098 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -378,6 +378,10 @@ func (a *aclTree) Root() *Change { return a.tree.Root() } +func (a *aclTree) Close() error { + return nil +} + func (a *aclTree) SnapshotPath() []string { // TODO: think about caching this diff --git a/pkg/acl/tree/commontree.go b/pkg/acl/tree/commontree.go index 063f21c5..53c8e62f 100644 --- a/pkg/acl/tree/commontree.go +++ b/pkg/acl/tree/commontree.go @@ -18,4 +18,5 @@ type CommonTree interface { ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) Storage() treestorage.TreeStorage DebugDump() (string, error) + Close() error } diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index ff4c6d4e..d60de112 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -360,6 +360,10 @@ func (d *docTree) Root() *Change { return d.tree.Root() } +func (d *docTree) Close() error { + return nil +} + func (d *docTree) SnapshotPath() []string { // TODO: think about caching this diff --git a/service/api/service.go b/service/api/service.go index ac2cea36..a9b7f1f3 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -6,8 +6,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "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/service/sync/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "go.uber.org/zap" "io" @@ -53,7 +53,8 @@ func (s *service) Run(ctx context.Context) (err error) { } mux := http.NewServeMux() 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) s.srv.Handler = mux @@ -79,8 +80,9 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { dump string err error ) - err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error { - dump, err = tree.DebugDump() + err = s.treeCache.Do(context.Background(), treeId, func(obj interface{}) error { + t := obj.(tree.CommonTree) + dump, err = t.DebugDump() if err != nil { return err } @@ -93,13 +95,25 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { 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 ( - query = req.URL.Query() - text = query.Get("text") + query = req.URL.Query() + text = query.Get("text") + aclTreeId = query.Get("aclTreeId") ) 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() if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) diff --git a/service/sync/document/service.go b/service/document/service.go similarity index 92% rename from service/sync/document/service.go rename to service/document/service.go index cea7a3d8..5d6b96b6 100644 --- a/service/sync/document/service.go +++ b/service/document/service.go @@ -2,15 +2,16 @@ package document import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "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/testutils/testchanges/testchangepb" "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/service/account" "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/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" @@ -23,10 +24,10 @@ var CName = "DocumentService" var log = logger.NewNamed("documentservice") type service struct { - messageService message.Service - treeCache treecache.Service - account account.Service - treeStorageProvider treestorage.Provider + messageService message.Service + treeCache treecache.Service + account account.Service + storage storage.Service // to create new documents we need to know all nodes 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.messageService = a.MustComponent(message.CName).(message.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) s.nodes = nodesService.Nodes() @@ -76,7 +77,11 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err Debug("updating document") 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() defer docTree.Unlock() 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 - }, s.treeStorageProvider.CreateTreeStorage) + }, s.storage.CreateTreeStorage) id, err = t.TreeID() if err != nil { @@ -188,7 +193,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text defer t.RUnlock() 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 { return err } diff --git a/service/storage/service.go b/service/storage/service.go new file mode 100644 index 00000000..1f495034 --- /dev/null +++ b/service/storage/service.go @@ -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 +} diff --git a/service/treecache/service.go b/service/treecache/service.go index 632623ad..1816e688 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -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/acltree" "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/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" "go.uber.org/zap" ) @@ -29,9 +29,9 @@ type Service interface { } type service struct { - treeProvider treestorage.Provider - account account.Service - cache ocache.OCache + storage storage.Service + account account.Service + cache ocache.OCache } 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))). Debug("adding tree with changes") - _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) + _, err := s.storage.CreateTreeStorage(treeId, header, changes) if err != nil { 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) { s.cache = ocache.New(s.loadTree) 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 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) { - t, err := s.treeProvider.TreeStorage(id) + t, err := s.storage.TreeStorage(id) if err != nil { return nil, err }