Make tree creation logic more transparent

This commit is contained in:
mcrakhman 2023-01-02 23:30:58 +01:00 committed by Mikhail Iudin
parent bb398cdb2a
commit ce1273a32c
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
12 changed files with 237 additions and 136 deletions

View File

@ -10,6 +10,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
"go.uber.org/zap" "go.uber.org/zap"
"time" "time"
@ -20,7 +21,10 @@ var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree")
type ctxKey int type ctxKey int
const spaceKey ctxKey = 0 const (
spaceKey ctxKey = iota
treeCreateKey
)
type treeCache struct { type treeCache struct {
gcttl int gcttl int
@ -31,6 +35,7 @@ type treeCache struct {
type TreeCache interface { type TreeCache interface {
treegetter.TreeGetter treegetter.TreeGetter
treegetter.TreePutter
GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error) GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error)
} }
@ -75,6 +80,10 @@ func (c *treeCache) Init(a *app.App) (err error) {
if err != nil { if err != nil {
return return
} }
createPayload, exists := ctx.Value(treeCreateKey).(treestorage.TreeStorageCreatePayload)
if exists {
return textdocument.CreateTextDocument(ctx, space, createPayload, &updateListener{}, c.account)
}
return textdocument.NewTextDocument(ctx, space, id, &updateListener{}, c.account) return textdocument.NewTextDocument(ctx, space, id, &updateListener{}, c.account)
}, },
ocache.WithLogger(log.Sugar()), ocache.WithLogger(log.Sugar()),
@ -108,6 +117,16 @@ func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objectt
return return
} }
func (c *treeCache) PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (ot objecttree.ObjectTree, err error) {
ctx = context.WithValue(ctx, spaceKey, spaceId)
ctx = context.WithValue(ctx, treeCreateKey, payload)
v, err := c.cache.Get(ctx, payload.RootRawChange.Id)
if err != nil {
return
}
return v.(objecttree.ObjectTree), nil
}
func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) { func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) {
tr, err := c.GetTree(ctx, spaceId, treeId) tr, err := c.GetTree(ctx, spaceId, treeId)
if err != nil { if err != nil {

View File

@ -4,11 +4,11 @@ import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
) )
@ -53,7 +53,17 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) {
if err != nil { if err != nil {
return return
} }
return textdocument.CreateTextDocument(context.Background(), space, s.account) payload := objecttree.ObjectTreeCreatePayload{
SignKey: s.account.Account().SignKey,
SpaceId: space.Id(),
Identity: s.account.Account().Identity,
}
tree, err := space.CreateTree(context.Background(), payload)
if err != nil {
return
}
id = tree.Id()
return
} }
func (s *service) DeleteDocument(spaceId, documentId string) (err error) { func (s *service) DeleteDocument(spaceId, documentId string) (err error) {

View File

@ -7,6 +7,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
"github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/proto"
) )
@ -27,18 +28,17 @@ type textDocument struct {
func CreateTextDocument( func CreateTextDocument(
ctx context.Context, ctx context.Context,
space commonspace.Space, space commonspace.Space,
account accountservice.Service) (id string, err error) { payload treestorage.TreeStorageCreatePayload,
payload := objecttree.ObjectTreeCreatePayload{ listener updatelistener.UpdateListener,
SignKey: account.Account().SignKey, account accountservice.Service) (doc TextDocument, err error) {
SpaceId: space.Id(), t, err := space.PutTree(ctx, payload, listener)
Identity: account.Account().Identity,
}
obj, err := space.CreateTree(ctx, payload)
if err != nil { if err != nil {
return return
} }
id = obj.Id() return &textDocument{
return ObjectTree: t,
account: account,
}, nil
} }
func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account accountservice.Service) (doc TextDocument, err error) { func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account accountservice.Service) (doc TextDocument, err error) {

View File

@ -1,3 +1,4 @@
//go:generate mockgen -destination mock_confconnector/mock_confconnector.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/confconnector ConfConnector
package confconnector package confconnector
import ( import (

View File

@ -0,0 +1,96 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/confconnector (interfaces: ConfConnector)
// Package mock_confconnector is a generated GoMock package.
package mock_confconnector
import (
context "context"
reflect "reflect"
peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
pool "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
gomock "github.com/golang/mock/gomock"
)
// MockConfConnector is a mock of ConfConnector interface.
type MockConfConnector struct {
ctrl *gomock.Controller
recorder *MockConfConnectorMockRecorder
}
// MockConfConnectorMockRecorder is the mock recorder for MockConfConnector.
type MockConfConnectorMockRecorder struct {
mock *MockConfConnector
}
// NewMockConfConnector creates a new mock instance.
func NewMockConfConnector(ctrl *gomock.Controller) *MockConfConnector {
mock := &MockConfConnector{ctrl: ctrl}
mock.recorder = &MockConfConnectorMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockConfConnector) EXPECT() *MockConfConnectorMockRecorder {
return m.recorder
}
// Configuration mocks base method.
func (m *MockConfConnector) Configuration() nodeconf.Configuration {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Configuration")
ret0, _ := ret[0].(nodeconf.Configuration)
return ret0
}
// Configuration indicates an expected call of Configuration.
func (mr *MockConfConnectorMockRecorder) Configuration() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Configuration", reflect.TypeOf((*MockConfConnector)(nil).Configuration))
}
// DialInactiveResponsiblePeers mocks base method.
func (m *MockConfConnector) DialInactiveResponsiblePeers(arg0 context.Context, arg1 string, arg2 []string) ([]peer.Peer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DialInactiveResponsiblePeers", arg0, arg1, arg2)
ret0, _ := ret[0].([]peer.Peer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// DialInactiveResponsiblePeers indicates an expected call of DialInactiveResponsiblePeers.
func (mr *MockConfConnectorMockRecorder) DialInactiveResponsiblePeers(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialInactiveResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).DialInactiveResponsiblePeers), arg0, arg1, arg2)
}
// GetResponsiblePeers mocks base method.
func (m *MockConfConnector) GetResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetResponsiblePeers", arg0, arg1)
ret0, _ := ret[0].([]peer.Peer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetResponsiblePeers indicates an expected call of GetResponsiblePeers.
func (mr *MockConfConnectorMockRecorder) GetResponsiblePeers(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).GetResponsiblePeers), arg0, arg1)
}
// Pool mocks base method.
func (m *MockConfConnector) Pool() pool.Pool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Pool")
ret0, _ := ret[0].(pool.Pool)
return ret0
}
// Pool indicates an expected call of Pool.
func (mr *MockConfConnectorMockRecorder) Pool() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pool", reflect.TypeOf((*MockConfConnector)(nil).Pool))
}

View File

@ -6,6 +6,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff/mock_ldiff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff/mock_ldiff"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/confconnector/mock_confconnector"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
mock_treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage/mock_treestorage" mock_treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage/mock_treestorage"
@ -16,7 +17,6 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf"
"github.com/golang/mock/gomock" "github.com/golang/mock/gomock"
"github.com/libp2p/go-libp2p/core/sec" "github.com/libp2p/go-libp2p/core/sec"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -98,7 +98,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
diffMock := mock_ldiff.NewMockDiff(ctrl) diffMock := mock_ldiff.NewMockDiff(ctrl)
connectorMock := mock_nodeconf.NewMockConfConnector(ctrl) connectorMock := mock_confconnector.NewMockConfConnector(ctrl)
cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) cacheMock := mock_treegetter.NewMockTreeGetter(ctrl)
stMock := mock_spacestorage.NewMockSpaceStorage(ctrl) stMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl) clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl)

View File

@ -10,6 +10,7 @@ import (
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree" objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )
@ -107,6 +108,21 @@ func (mr *MockTreeGetterMockRecorder) Name() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeGetter)(nil).Name)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeGetter)(nil).Name))
} }
// PutTree mocks base method.
func (m *MockTreeGetter) PutTree(arg0 context.Context, arg1 string, arg2 treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "PutTree", arg0, arg1, arg2)
ret0, _ := ret[0].(objecttree.ObjectTree)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// PutTree indicates an expected call of PutTree.
func (mr *MockTreeGetterMockRecorder) PutTree(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutTree", reflect.TypeOf((*MockTreeGetter)(nil).PutTree), arg0, arg1, arg2)
}
// Run mocks base method. // Run mocks base method.
func (m *MockTreeGetter) Run(arg0 context.Context) error { func (m *MockTreeGetter) Run(arg0 context.Context) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()

View File

@ -5,6 +5,7 @@ import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
) )
const CName = "common.object.treegetter" const CName = "common.object.treegetter"
@ -14,3 +15,7 @@ type TreeGetter interface {
GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error)
DeleteTree(ctx context.Context, spaceId, treeId string) error DeleteTree(ctx context.Context, spaceId, treeId string) error
} }
type TreePutter interface {
PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error)
}

View File

@ -31,7 +31,10 @@ import (
"time" "time"
) )
var ErrSpaceClosed = errors.New("space is closed") var (
ErrSpaceClosed = errors.New("space is closed")
ErrPutNotImplemented = errors.New("put tree is not implemented")
)
type SpaceCreatePayload struct { type SpaceCreatePayload struct {
// SigningKey is the signing key of the owner // SigningKey is the signing key of the owner
@ -46,10 +49,6 @@ type SpaceCreatePayload struct {
ReplicationKey uint64 ReplicationKey uint64
} }
type spaceCtxKey int
const treePayloadKey spaceCtxKey = 0
const SpaceTypeDerived = "derived.space" const SpaceTypeDerived = "derived.space"
type SpaceDerivePayload struct { type SpaceDerivePayload struct {
@ -84,10 +83,12 @@ type Space interface {
DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error)
CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error)
PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error)
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error)
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
SyncStatus() syncstatus.StatusUpdater SyncStatus() syncstatus.StatusUpdater
Storage() spacestorage.SpaceStorage
Close() error Close() error
} }
@ -217,6 +218,10 @@ func (s *space) SyncStatus() syncstatus.StatusUpdater {
return s.syncStatus return s.syncStatus
} }
func (s *space) Storage() spacestorage.SpaceStorage {
return s.storage
}
func (s *space) StoredIds() []string { func (s *space) StoredIds() []string {
return s.headSync.AllIds() return s.headSync.AllIds()
} }
@ -230,6 +235,11 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
treePutter, conforms := s.cache.(treegetter.TreePutter)
if !conforms {
err = ErrPutNotImplemented
return
}
root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList) root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList)
if err != nil { if err != nil {
return return
@ -239,10 +249,9 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre
Changes: []*treechangeproto.RawTreeChangeWithId{root}, Changes: []*treechangeproto.RawTreeChangeWithId{root},
Heads: []string{root.Id}, Heads: []string{root.Id},
} }
ctx = context.WithValue(ctx, treePayloadKey, res)
// here we must be sure that the object is created synchronously, // here we must be sure that the object is created synchronously,
// so there won't be any conflicts, therefore we do it through cache // so there won't be any conflicts, therefore we do it through cache
return s.cache.GetTree(ctx, s.id, root.Id) return treePutter.PutTree(ctx, s.id, res)
} }
func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) { func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) {
@ -250,6 +259,11 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
treePutter, conforms := s.cache.(treegetter.TreePutter)
if !conforms {
err = ErrPutNotImplemented
return
}
root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList) root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList)
if err != nil { if err != nil {
return return
@ -260,8 +274,31 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre
Changes: []*treechangeproto.RawTreeChangeWithId{root}, Changes: []*treechangeproto.RawTreeChangeWithId{root},
Heads: []string{root.Id}, Heads: []string{root.Id},
} }
ctx = context.WithValue(ctx, treePayloadKey, res) return treePutter.PutTree(ctx, s.id, res)
return s.cache.GetTree(ctx, s.id, root.Id) }
func (s *space) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
if s.isClosed.Load() {
err = ErrSpaceClosed
return
}
deps := synctree.BuildDeps{
SpaceId: s.id,
ObjectSync: s.objectSync,
Configuration: s.configuration,
HeadNotifiable: s.headSync,
Listener: listener,
AclList: s.aclList,
SpaceStorage: s.storage,
TreeUsage: &s.treesUsed,
SyncStatus: s.syncStatus,
}
t, err = synctree.PutSyncTree(ctx, payload, deps)
// this can happen only for derived trees, when we've synced same tree already
if err == treestorage.ErrTreeExists {
return synctree.BuildSyncTreeOrGetRemote(ctx, payload.RootRawChange.Id, deps)
}
return
} }
func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) { func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
@ -269,9 +306,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
if payload, exists := ctx.Value(treePayloadKey).(treestorage.TreeStorageCreatePayload); exists {
return s.putTree(ctx, payload, listener)
}
deps := synctree.BuildDeps{ deps := synctree.BuildDeps{
SpaceId: s.id, SpaceId: s.id,
@ -319,27 +353,3 @@ func (s *space) Close() error {
return mError.Err() return mError.Err()
} }
func (s *space) putTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
if s.isClosed.Load() {
err = ErrSpaceClosed
return
}
deps := synctree.BuildDeps{
SpaceId: s.id,
ObjectSync: s.objectSync,
Configuration: s.configuration,
HeadNotifiable: s.headSync,
Listener: listener,
AclList: s.aclList,
SpaceStorage: s.storage,
TreeUsage: &s.treesUsed,
SyncStatus: s.syncStatus,
}
t, err = synctree.PutSyncTree(ctx, payload, deps)
// this can happen only for derived trees, when we've synced same tree already
if err == treestorage.ErrTreeExists {
return synctree.BuildSyncTreeOrGetRemote(ctx, payload.RootRawChange.Id, deps)
}
return
}

View File

@ -81,6 +81,20 @@ func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Name)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Name))
} }
// SpaceExists mocks base method.
func (m *MockSpaceStorageProvider) SpaceExists(arg0 string) bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SpaceExists", arg0)
ret0, _ := ret[0].(bool)
return ret0
}
// SpaceExists indicates an expected call of SpaceExists.
func (mr *MockSpaceStorageProviderMockRecorder) SpaceExists(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceExists", reflect.TypeOf((*MockSpaceStorageProvider)(nil).SpaceExists), arg0)
}
// SpaceStorage mocks base method. // SpaceStorage mocks base method.
func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (spacestorage.SpaceStorage, error) { func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (spacestorage.SpaceStorage, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()

View File

@ -1,4 +1,4 @@
//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Service,Configuration,ConfConnector //go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Service,Configuration
package nodeconf package nodeconf
import ( import (

View File

@ -1,16 +1,13 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Service,Configuration,ConfConnector) // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Service,Configuration)
// Package mock_nodeconf is a generated GoMock package. // Package mock_nodeconf is a generated GoMock package.
package mock_nodeconf package mock_nodeconf
import ( import (
context "context"
reflect "reflect" reflect "reflect"
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
pool "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )
@ -117,6 +114,20 @@ func (m *MockConfiguration) EXPECT() *MockConfigurationMockRecorder {
return m.recorder return m.recorder
} }
// Addresses mocks base method.
func (m *MockConfiguration) Addresses() map[string][]string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Addresses")
ret0, _ := ret[0].(map[string][]string)
return ret0
}
// Addresses indicates an expected call of Addresses.
func (mr *MockConfigurationMockRecorder) Addresses() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Addresses", reflect.TypeOf((*MockConfiguration)(nil).Addresses))
}
// ConsensusPeers mocks base method. // ConsensusPeers mocks base method.
func (m *MockConfiguration) ConsensusPeers() []string { func (m *MockConfiguration) ConsensusPeers() []string {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -186,84 +197,3 @@ func (mr *MockConfigurationMockRecorder) NodeIds(arg0 interface{}) *gomock.Call
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeIds", reflect.TypeOf((*MockConfiguration)(nil).NodeIds), arg0) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeIds", reflect.TypeOf((*MockConfiguration)(nil).NodeIds), arg0)
} }
// MockConfConnector is a mock of ConfConnector interface.
type MockConfConnector struct {
ctrl *gomock.Controller
recorder *MockConfConnectorMockRecorder
}
// MockConfConnectorMockRecorder is the mock recorder for MockConfConnector.
type MockConfConnectorMockRecorder struct {
mock *MockConfConnector
}
// NewMockConfConnector creates a new mock instance.
func NewMockConfConnector(ctrl *gomock.Controller) *MockConfConnector {
mock := &MockConfConnector{ctrl: ctrl}
mock.recorder = &MockConfConnectorMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockConfConnector) EXPECT() *MockConfConnectorMockRecorder {
return m.recorder
}
// Configuration mocks base method.
func (m *MockConfConnector) Configuration() nodeconf.Configuration {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Configuration")
ret0, _ := ret[0].(nodeconf.Configuration)
return ret0
}
// Configuration indicates an expected call of Configuration.
func (mr *MockConfConnectorMockRecorder) Configuration() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Configuration", reflect.TypeOf((*MockConfConnector)(nil).Configuration))
}
// DialInactiveResponsiblePeers mocks base method.
func (m *MockConfConnector) DialInactiveResponsiblePeers(arg0 context.Context, arg1 string, arg2 []string) ([]peer.Peer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DialInactiveResponsiblePeers", arg0, arg1, arg2)
ret0, _ := ret[0].([]peer.Peer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// DialInactiveResponsiblePeers indicates an expected call of DialInactiveResponsiblePeers.
func (mr *MockConfConnectorMockRecorder) DialInactiveResponsiblePeers(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialInactiveResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).DialInactiveResponsiblePeers), arg0, arg1, arg2)
}
// GetResponsiblePeers mocks base method.
func (m *MockConfConnector) GetResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetResponsiblePeers", arg0, arg1)
ret0, _ := ret[0].([]peer.Peer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetResponsiblePeers indicates an expected call of GetResponsiblePeers.
func (mr *MockConfConnectorMockRecorder) GetResponsiblePeers(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).GetResponsiblePeers), arg0, arg1)
}
// Pool mocks base method.
func (m *MockConfConnector) Pool() pool.Pool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Pool")
ret0, _ := ret[0].(pool.Pool)
return ret0
}
// Pool indicates an expected call of Pool.
func (mr *MockConfConnectorMockRecorder) Pool() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pool", reflect.TypeOf((*MockConfConnector)(nil).Pool))
}