Change tree creation logic

This commit is contained in:
mcrakhman 2022-12-06 10:19:53 +01:00 committed by Mikhail Iudin
parent 86ba8e33d0
commit 9d9867a632
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
5 changed files with 36 additions and 91 deletions

View File

@ -53,11 +53,7 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) {
if err != nil { if err != nil {
return return
} }
doc, err := textdocument.CreateTextDocument(context.Background(), space, s.account, nil) id, err = textdocument.CreateTextDocument(context.Background(), space, s.account)
if err != nil {
return
}
id = doc.ID()
return return
} }

View File

@ -27,22 +27,13 @@ type textDocument struct {
func CreateTextDocument( func CreateTextDocument(
ctx context.Context, ctx context.Context,
space commonspace.Space, space commonspace.Space,
account account.Service, account account.Service) (id string, err error) {
listener updatelistener.UpdateListener) (doc TextDocument, err error) {
payload := tree.ObjectTreeCreatePayload{ payload := tree.ObjectTreeCreatePayload{
SignKey: account.Account().SignKey, SignKey: account.Account().SignKey,
SpaceId: space.Id(), SpaceId: space.Id(),
Identity: account.Account().Identity, Identity: account.Account().Identity,
} }
t, err := space.CreateTree(ctx, payload, listener) return space.CreateTree(ctx, payload)
if err != nil {
return
}
return &textDocument{
ObjectTree: t,
account: account,
}, nil
} }
func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account account.Service) (doc TextDocument, err error) { func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account account.Service) (doc TextDocument, err error) {

View File

@ -75,8 +75,8 @@ type Space interface {
SpaceSyncRpc() RpcHandler SpaceSyncRpc() RpcHandler
DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload) (string, error)
CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload) (string, error)
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error)
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
@ -210,40 +210,34 @@ func (s *space) DebugAllHeads() []diffservice.TreeHeads {
return s.diffService.DebugAllHeads() return s.diffService.DebugAllHeads()
} }
func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree.ObjectTree, err error) { func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload) (id string, err error) {
if s.isClosed.Load() { if s.isClosed.Load() {
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
StreamPool: s.syncService.StreamPool(), StreamPool: s.syncService.StreamPool(),
Configuration: s.configuration, Configuration: s.configuration,
HeadNotifiable: s.diffService, AclList: s.aclList,
Listener: listener, SpaceStorage: s.storage,
AclList: s.aclList,
SpaceStorage: s.storage,
TreeUsage: &s.treesUsed,
} }
return synctree.DeriveSyncTree(ctx, deps) return synctree.DeriveSyncTree(ctx, deps)
} }
func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree.ObjectTree, err error) { func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload) (id string, err error) {
if s.isClosed.Load() { if s.isClosed.Load() {
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
StreamPool: s.syncService.StreamPool(), StreamPool: s.syncService.StreamPool(),
Configuration: s.configuration, Configuration: s.configuration,
HeadNotifiable: s.diffService, AclList: s.aclList,
Listener: listener, SpaceStorage: s.storage,
AclList: s.aclList,
SpaceStorage: s.storage,
TreeUsage: &s.treesUsed,
} }
return synctree.CreateSyncTree(ctx, deps) return synctree.CreateSyncTree(ctx, deps)
} }

View File

@ -55,15 +55,12 @@ var buildObjectTree = tree.BuildObjectTree
var createSyncClient = newSyncClient var createSyncClient = newSyncClient
type CreateDeps struct { type CreateDeps struct {
SpaceId string SpaceId string
Payload tree.ObjectTreeCreatePayload Payload tree.ObjectTreeCreatePayload
Configuration nodeconf.Configuration Configuration nodeconf.Configuration
HeadNotifiable HeadNotifiable StreamPool syncservice.StreamPool
StreamPool syncservice.StreamPool AclList list.ACLList
Listener updatelistener.UpdateListener SpaceStorage spacestorage.SpaceStorage
AclList list.ACLList
SpaceStorage spacestorage.SpaceStorage
TreeUsage *atomic.Int32
} }
type BuildDeps struct { type BuildDeps struct {
@ -78,36 +75,25 @@ type BuildDeps struct {
TreeUsage *atomic.Int32 TreeUsage *atomic.Int32
} }
func DeriveSyncTree(ctx context.Context, deps CreateDeps) (t SyncTree, err error) { func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) {
objTree, err := createDerivedObjectTree(deps.Payload, deps.AclList, deps.SpaceStorage.CreateTreeStorage) objTree, err := createDerivedObjectTree(deps.Payload, deps.AclList, deps.SpaceStorage.CreateTreeStorage)
if err != nil { if err != nil {
return return
} }
syncClient := createSyncClient( syncClient := createSyncClient(
deps.SpaceId, deps.SpaceId,
deps.StreamPool, deps.StreamPool,
sharedFactory, sharedFactory,
deps.Configuration) deps.Configuration)
syncTree := &syncTree{
ObjectTree: objTree,
syncClient: syncClient,
notifiable: deps.HeadNotifiable,
treeUsage: deps.TreeUsage,
listener: deps.Listener,
}
syncHandler := newSyncTreeHandler(syncTree, syncClient)
syncTree.SyncHandler = syncHandler
t = syncTree
syncTree.Lock()
defer syncTree.Unlock()
syncTree.afterBuild()
headUpdate := syncClient.CreateHeadUpdate(t, nil) headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
err = syncClient.BroadcastAsync(headUpdate) syncClient.BroadcastAsync(headUpdate)
id = objTree.ID()
return return
} }
func CreateSyncTree(ctx context.Context, deps CreateDeps) (t SyncTree, err error) { func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) {
objTree, err := createObjectTree(deps.Payload, deps.AclList, deps.SpaceStorage.CreateTreeStorage) objTree, err := createObjectTree(deps.Payload, deps.AclList, deps.SpaceStorage.CreateTreeStorage)
if err != nil { if err != nil {
return return
@ -117,23 +103,10 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (t SyncTree, err error
deps.StreamPool, deps.StreamPool,
GetRequestFactory(), GetRequestFactory(),
deps.Configuration) deps.Configuration)
syncTree := &syncTree{
ObjectTree: objTree,
syncClient: syncClient,
notifiable: deps.HeadNotifiable,
treeUsage: deps.TreeUsage,
listener: deps.Listener,
}
syncHandler := newSyncTreeHandler(syncTree, syncClient)
syncTree.SyncHandler = syncHandler
t = syncTree
syncTree.Lock()
defer syncTree.Unlock()
// TODO: refactor here because the code is duplicated, when we create a tree we should only create a storage and then build a tree
syncTree.afterBuild()
headUpdate := syncClient.CreateHeadUpdate(t, nil) headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
err = syncClient.BroadcastAsync(headUpdate) syncClient.BroadcastAsync(headUpdate)
id = objTree.ID()
return return
} }

View File

@ -16,7 +16,6 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
"github.com/golang/mock/gomock" "github.com/golang/mock/gomock"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"sync/atomic"
"testing" "testing"
) )
@ -43,7 +42,6 @@ func Test_DeriveSyncTree(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl)
syncClientMock := mock_synctree.NewMockSyncClient(ctrl) syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
aclListMock := mock_list.NewMockACLList(ctrl) aclListMock := mock_list.NewMockACLList(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
@ -59,16 +57,13 @@ func Test_DeriveSyncTree(t *testing.T) {
return syncClientMock return syncClientMock
} }
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
updateListenerMock.EXPECT().Rebuild(gomock.Any())
deps := CreateDeps{ deps := CreateDeps{
AclList: aclListMock, AclList: aclListMock,
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
Listener: updateListenerMock,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
TreeUsage: &atomic.Int32{},
} }
_, err := DeriveSyncTree(ctx, deps) _, err := DeriveSyncTree(ctx, deps)
@ -80,7 +75,6 @@ func Test_CreateSyncTree(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl)
syncClientMock := mock_synctree.NewMockSyncClient(ctrl) syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
aclListMock := mock_list.NewMockACLList(ctrl) aclListMock := mock_list.NewMockACLList(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
@ -96,16 +90,13 @@ func Test_CreateSyncTree(t *testing.T) {
return syncClientMock return syncClientMock
} }
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
updateListenerMock.EXPECT().Rebuild(gomock.Any())
deps := CreateDeps{ deps := CreateDeps{
AclList: aclListMock, AclList: aclListMock,
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
Listener: updateListenerMock,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
TreeUsage: &atomic.Int32{},
} }
_, err := CreateSyncTree(ctx, deps) _, err := CreateSyncTree(ctx, deps)