From 8680c2432933f6e7543a51f49d331b6407475c65 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 2 Jan 2023 13:16:49 +0100 Subject: [PATCH 1/9] Add generic mustcomponent as in middleware --- common/app/app.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/common/app/app.go b/common/app/app.go index 9e2e3fa0..d945db87 100644 --- a/common/app/app.go +++ b/common/app/app.go @@ -128,6 +128,19 @@ func (app *App) MustComponent(name string) Component { return s } +// MustComponent - generic version of app.MustComponent +func MustComponent[i any](app *App) i { + app.mu.RLock() + defer app.mu.RUnlock() + for _, s := range app.components { + if v, ok := s.(i); ok { + return v + } + } + empty := new(i) + panic(fmt.Errorf("component with interface %T is not found", empty)) +} + // ComponentNames returns all registered names func (app *App) ComponentNames() (names []string) { app.mu.RLock() From 987bd0154f4a052df681abfea0e2fb7d9104332b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 2 Jan 2023 14:27:24 +0100 Subject: [PATCH 2/9] Update ocache ObjectLocker --- common/app/ocache/ocache.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/app/ocache/ocache.go b/common/app/ocache/ocache.go index 04575750..fa7a63f3 100644 --- a/common/app/ocache/ocache.go +++ b/common/app/ocache/ocache.go @@ -74,6 +74,7 @@ type Object interface { } type ObjectLocker interface { + Object Locked() bool } @@ -87,9 +88,9 @@ type entry struct { refCount uint32 isClosing bool load chan struct{} - loadErr error - value Object - close chan struct{} + loadErr error + value Object + close chan struct{} } func (e *entry) locked() bool { From 40f8fb503a7d99ecffe19655e5f31c3f69ecef34 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 2 Jan 2023 23:30:58 +0100 Subject: [PATCH 3/9] Make tree creation logic more transparent --- client/clientspace/clientcache/treecache.go | 21 +++- client/document/service.go | 14 ++- client/document/textdocument/textdocument.go | 18 ++-- .../confconnector/confconnector.go | 1 + .../mock_confconnector/mock_confconnector.go | 96 +++++++++++++++++ .../commonspace/headsync/diffsyncer_test.go | 4 +- .../mock_treegetter/mock_treegetter.go | 16 +++ .../object/treegetter/treegetter.go | 5 + common/commonspace/space.go | 82 +++++++------- .../spacestorage/mock_storage/mock_storage.go | 14 +++ common/nodeconf/configuration.go | 2 +- .../nodeconf/mock_nodeconf/mock_nodeconf.go | 100 +++--------------- 12 files changed, 237 insertions(+), 136 deletions(-) create mode 100644 common/commonspace/confconnector/mock_confconnector/mock_confconnector.go diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index 5d512f23..cd3b9450 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -10,6 +10,7 @@ import ( "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/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" "go.uber.org/zap" "time" @@ -20,7 +21,10 @@ var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree") type ctxKey int -const spaceKey ctxKey = 0 +const ( + spaceKey ctxKey = iota + treeCreateKey +) type treeCache struct { gcttl int @@ -31,6 +35,7 @@ type treeCache struct { type TreeCache interface { treegetter.TreeGetter + treegetter.TreePutter 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 { 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) }, ocache.WithLogger(log.Sugar()), @@ -108,6 +117,16 @@ func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objectt 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) { tr, err := c.GetTree(ctx, spaceId, treeId) if err != nil { diff --git a/client/document/service.go b/client/document/service.go index adb82e99..7b6004aa 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -4,11 +4,11 @@ import ( "context" "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/document/textdocument" "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/logger" "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" ) @@ -53,7 +53,17 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) { if err != nil { 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) { diff --git a/client/document/textdocument/textdocument.go b/client/document/textdocument/textdocument.go index da2b281a..a96159f3 100644 --- a/client/document/textdocument/textdocument.go +++ b/client/document/textdocument/textdocument.go @@ -7,6 +7,7 @@ import ( "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/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage" "github.com/gogo/protobuf/proto" ) @@ -27,18 +28,17 @@ type textDocument struct { func CreateTextDocument( ctx context.Context, space commonspace.Space, - account accountservice.Service) (id string, err error) { - payload := objecttree.ObjectTreeCreatePayload{ - SignKey: account.Account().SignKey, - SpaceId: space.Id(), - Identity: account.Account().Identity, - } - obj, err := space.CreateTree(ctx, payload) + payload treestorage.TreeStorageCreatePayload, + listener updatelistener.UpdateListener, + account accountservice.Service) (doc TextDocument, err error) { + t, err := space.PutTree(ctx, payload, listener) if err != nil { return } - id = obj.Id() - return + return &textDocument{ + 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) { diff --git a/common/commonspace/confconnector/confconnector.go b/common/commonspace/confconnector/confconnector.go index 5e15d5e9..7c736916 100644 --- a/common/commonspace/confconnector/confconnector.go +++ b/common/commonspace/confconnector/confconnector.go @@ -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 import ( diff --git a/common/commonspace/confconnector/mock_confconnector/mock_confconnector.go b/common/commonspace/confconnector/mock_confconnector/mock_confconnector.go new file mode 100644 index 00000000..218e0d53 --- /dev/null +++ b/common/commonspace/confconnector/mock_confconnector/mock_confconnector.go @@ -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)) +} diff --git a/common/commonspace/headsync/diffsyncer_test.go b/common/commonspace/headsync/diffsyncer_test.go index 75957c05..0c611b5a 100644 --- a/common/commonspace/headsync/diffsyncer_test.go +++ b/common/commonspace/headsync/diffsyncer_test.go @@ -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/mock_ldiff" "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/tree/treechangeproto" 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/syncstatus" "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/libp2p/go-libp2p/core/sec" "github.com/stretchr/testify/require" @@ -98,7 +98,7 @@ func TestDiffSyncer_Sync(t *testing.T) { defer ctrl.Finish() diffMock := mock_ldiff.NewMockDiff(ctrl) - connectorMock := mock_nodeconf.NewMockConfConnector(ctrl) + connectorMock := mock_confconnector.NewMockConfConnector(ctrl) cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) stMock := mock_spacestorage.NewMockSpaceStorage(ctrl) clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl) diff --git a/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go b/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go index e64ace34..61b37b61 100644 --- a/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go +++ b/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go @@ -10,6 +10,7 @@ import ( app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" 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" ) @@ -107,6 +108,21 @@ func (mr *MockTreeGetterMockRecorder) Name() *gomock.Call { 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. func (m *MockTreeGetter) Run(arg0 context.Context) error { m.ctrl.T.Helper() diff --git a/common/commonspace/object/treegetter/treegetter.go b/common/commonspace/object/treegetter/treegetter.go index 8b3ba472..8f2d7cd6 100644 --- a/common/commonspace/object/treegetter/treegetter.go +++ b/common/commonspace/object/treegetter/treegetter.go @@ -5,6 +5,7 @@ import ( "context" "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/treestorage" ) const CName = "common.object.treegetter" @@ -14,3 +15,7 @@ type TreeGetter interface { GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) DeleteTree(ctx context.Context, spaceId, treeId string) error } + +type TreePutter interface { + PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error) +} diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 68940637..08170653 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -31,7 +31,10 @@ import ( "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 { // SigningKey is the signing key of the owner @@ -46,10 +49,6 @@ type SpaceCreatePayload struct { ReplicationKey uint64 } -type spaceCtxKey int - -const treePayloadKey spaceCtxKey = 0 - const SpaceTypeDerived = "derived.space" type SpaceDerivePayload struct { @@ -84,10 +83,12 @@ type Space interface { DeriveTree(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) DeleteTree(ctx context.Context, id string) (err error) SyncStatus() syncstatus.StatusUpdater + Storage() spacestorage.SpaceStorage Close() error } @@ -217,6 +218,10 @@ func (s *space) SyncStatus() syncstatus.StatusUpdater { return s.syncStatus } +func (s *space) Storage() spacestorage.SpaceStorage { + return s.storage +} + func (s *space) StoredIds() []string { return s.headSync.AllIds() } @@ -230,6 +235,11 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre err = ErrSpaceClosed return } + treePutter, conforms := s.cache.(treegetter.TreePutter) + if !conforms { + err = ErrPutNotImplemented + return + } root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList) if err != nil { return @@ -239,10 +249,9 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre Changes: []*treechangeproto.RawTreeChangeWithId{root}, Heads: []string{root.Id}, } - ctx = context.WithValue(ctx, treePayloadKey, res) // here we must be sure that the object is created synchronously, // 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) { @@ -250,6 +259,11 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre err = ErrSpaceClosed return } + treePutter, conforms := s.cache.(treegetter.TreePutter) + if !conforms { + err = ErrPutNotImplemented + return + } root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList) if err != nil { return @@ -260,8 +274,31 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre Changes: []*treechangeproto.RawTreeChangeWithId{root}, Heads: []string{root.Id}, } - ctx = context.WithValue(ctx, treePayloadKey, res) - return s.cache.GetTree(ctx, s.id, root.Id) + return treePutter.PutTree(ctx, s.id, res) +} + +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) { @@ -269,9 +306,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene err = ErrSpaceClosed return } - if payload, exists := ctx.Value(treePayloadKey).(treestorage.TreeStorageCreatePayload); exists { - return s.putTree(ctx, payload, listener) - } deps := synctree.BuildDeps{ SpaceId: s.id, @@ -319,27 +353,3 @@ func (s *space) Close() error { 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 -} diff --git a/common/commonspace/spacestorage/mock_storage/mock_storage.go b/common/commonspace/spacestorage/mock_storage/mock_storage.go index 0d44e018..31d386c2 100644 --- a/common/commonspace/spacestorage/mock_storage/mock_storage.go +++ b/common/commonspace/spacestorage/mock_storage/mock_storage.go @@ -81,6 +81,20 @@ func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call { 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. func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (spacestorage.SpaceStorage, error) { m.ctrl.T.Helper() diff --git a/common/nodeconf/configuration.go b/common/nodeconf/configuration.go index 6f5a62a9..9453b32e 100644 --- a/common/nodeconf/configuration.go +++ b/common/nodeconf/configuration.go @@ -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 import ( diff --git a/common/nodeconf/mock_nodeconf/mock_nodeconf.go b/common/nodeconf/mock_nodeconf/mock_nodeconf.go index fb88a7f8..e0876d62 100644 --- a/common/nodeconf/mock_nodeconf/mock_nodeconf.go +++ b/common/nodeconf/mock_nodeconf/mock_nodeconf.go @@ -1,16 +1,13 @@ // 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 import ( - context "context" reflect "reflect" 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" gomock "github.com/golang/mock/gomock" ) @@ -117,6 +114,20 @@ func (m *MockConfiguration) EXPECT() *MockConfigurationMockRecorder { 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. func (m *MockConfiguration) ConsensusPeers() []string { m.ctrl.T.Helper() @@ -186,84 +197,3 @@ func (mr *MockConfigurationMockRecorder) NodeIds(arg0 interface{}) *gomock.Call mr.mock.ctrl.T.Helper() 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)) -} From c64f7328780ac68065e6384c9855a25c2a09f969 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 3 Jan 2023 00:02:33 +0100 Subject: [PATCH 4/9] Refactor space storage and add tree root --- client/storage/spacestorage.go | 16 ++ .../tree/objecttree/rawtreevalidator.go | 3 +- .../object/tree/treestorage/inmemory.go | 32 --- .../object/tree/treestorage/provider.go | 23 -- .../object/tree/treestorage/treestorage.go | 17 +- .../mock_treegetter/mock_treegetter.go | 16 -- .../mock_spacestorage.go} | 115 ++------ .../mock_spacestorage/mock_storage.go | 266 ------------------ .../{storage.go => spacestorage.go} | 6 +- node/storage/spacestorage.go | 4 + 10 files changed, 57 insertions(+), 441 deletions(-) delete mode 100644 common/commonspace/object/tree/treestorage/provider.go rename common/commonspace/spacestorage/{mock_storage/mock_storage.go => mock_spacestorage/mock_spacestorage.go} (64%) delete mode 100644 common/commonspace/spacestorage/mock_spacestorage/mock_storage.go rename common/commonspace/spacestorage/{storage.go => spacestorage.go} (82%) diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index 83022299..c2cd581a 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -173,6 +173,22 @@ func (s *spaceStorage) TreeDeletedStatus(id string) (status string, err error) { return } +func (s *spaceStorage) TreeRoot(id string) (root *treechangeproto.RawTreeChangeWithId, err error) { + keys := newTreeKeys(s.spaceId, id) + err = s.objDb.View(func(txn *badger.Txn) error { + bytes, err := getTxn(txn, keys.RawChangeKey(id)) + if err != nil { + return err + } + root = &treechangeproto.RawTreeChangeWithId{ + RawChange: bytes, + Id: id, + } + return nil + }) + return +} + func (s *spaceStorage) Close() (err error) { return nil } diff --git a/common/commonspace/object/tree/objecttree/rawtreevalidator.go b/common/commonspace/object/tree/objecttree/rawtreevalidator.go index d2dcebbb..693fa642 100644 --- a/common/commonspace/object/tree/objecttree/rawtreevalidator.go +++ b/common/commonspace/object/tree/objecttree/rawtreevalidator.go @@ -6,8 +6,7 @@ import ( ) func ValidateRawTree(payload treestorage.TreeStorageCreatePayload, aclList list.AclList) (err error) { - provider := treestorage.NewInMemoryTreeStorageProvider() - treeStorage, err := provider.CreateTreeStorage(payload) + treeStorage, err := treestorage.NewInMemoryTreeStorage(payload.RootRawChange, payload.Heads, payload.Changes) if err != nil { return } diff --git a/common/commonspace/object/tree/treestorage/inmemory.go b/common/commonspace/object/tree/treestorage/inmemory.go index f0281b27..dd864683 100644 --- a/common/commonspace/object/tree/treestorage/inmemory.go +++ b/common/commonspace/object/tree/treestorage/inmemory.go @@ -89,35 +89,3 @@ func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) func (t *inMemoryTreeStorage) Delete() error { return nil } - -type inMemoryStorageProvider struct { - objects map[string]TreeStorage - sync.RWMutex -} - -func (i *inMemoryStorageProvider) TreeStorage(id string) (TreeStorage, error) { - i.RLock() - defer i.RUnlock() - if tree, exists := i.objects[id]; exists { - return tree, nil - } - return nil, ErrUnknownTreeId -} - -func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) { - i.Lock() - defer i.Unlock() - res, err := NewInMemoryTreeStorage(payload.RootRawChange, payload.Heads, payload.Changes) - if err != nil { - return nil, err - } - - i.objects[payload.RootRawChange.Id] = res - return res, nil -} - -func NewInMemoryTreeStorageProvider() Provider { - return &inMemoryStorageProvider{ - objects: make(map[string]TreeStorage), - } -} diff --git a/common/commonspace/object/tree/treestorage/provider.go b/common/commonspace/object/tree/treestorage/provider.go deleted file mode 100644 index d1b25d17..00000000 --- a/common/commonspace/object/tree/treestorage/provider.go +++ /dev/null @@ -1,23 +0,0 @@ -package treestorage - -import ( - "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto" -) - -var ( - ErrUnknownTreeId = errors.New("tree does not exist") - ErrTreeExists = errors.New("tree already exists") - ErrUnknownChange = errors.New("change doesn't exist") -) - -type TreeStorageCreatePayload struct { - RootRawChange *treechangeproto.RawTreeChangeWithId - Changes []*treechangeproto.RawTreeChangeWithId - Heads []string -} - -type Provider interface { - TreeStorage(id string) (TreeStorage, error) - CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) -} diff --git a/common/commonspace/object/tree/treestorage/treestorage.go b/common/commonspace/object/tree/treestorage/treestorage.go index 74e48656..c8167f73 100644 --- a/common/commonspace/object/tree/treestorage/treestorage.go +++ b/common/commonspace/object/tree/treestorage/treestorage.go @@ -2,9 +2,24 @@ package treestorage import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto" ) +var ( + ErrUnknownTreeId = errors.New("tree does not exist") + ErrTreeExists = errors.New("tree already exists") + ErrUnknownChange = errors.New("change doesn't exist") +) + +type TreeStorageCreatePayload struct { + RootRawChange *treechangeproto.RawTreeChangeWithId + Changes []*treechangeproto.RawTreeChangeWithId + Heads []string +} + +type TreeStorageCreatorFunc = func(payload TreeStorageCreatePayload) (TreeStorage, error) + type TreeStorage interface { Id() string Root() (*treechangeproto.RawTreeChangeWithId, error) @@ -16,5 +31,3 @@ type TreeStorage interface { HasChange(ctx context.Context, id string) (bool, error) Delete() error } - -type TreeStorageCreatorFunc = func(payload TreeStorageCreatePayload) (TreeStorage, error) diff --git a/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go b/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go index 61b37b61..e64ace34 100644 --- a/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go +++ b/common/commonspace/object/treegetter/mock_treegetter/mock_treegetter.go @@ -10,7 +10,6 @@ import ( app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" 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" ) @@ -108,21 +107,6 @@ func (mr *MockTreeGetterMockRecorder) Name() *gomock.Call { 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. func (m *MockTreeGetter) Run(arg0 context.Context) error { m.ctrl.T.Helper() diff --git a/common/commonspace/spacestorage/mock_storage/mock_storage.go b/common/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go similarity index 64% rename from common/commonspace/spacestorage/mock_storage/mock_storage.go rename to common/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go index 31d386c2..451f6c6a 100644 --- a/common/commonspace/spacestorage/mock_storage/mock_storage.go +++ b/common/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage (interfaces: SpaceStorageProvider,SpaceStorage) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage (interfaces: SpaceStorage) // Package mock_spacestorage is a generated GoMock package. package mock_spacestorage @@ -7,109 +7,13 @@ package mock_spacestorage import ( reflect "reflect" - app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" liststorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto" treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage" - spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" gomock "github.com/golang/mock/gomock" ) -// MockSpaceStorageProvider is a mock of SpaceStorageProvider interface. -type MockSpaceStorageProvider struct { - ctrl *gomock.Controller - recorder *MockSpaceStorageProviderMockRecorder -} - -// MockSpaceStorageProviderMockRecorder is the mock recorder for MockSpaceStorageProvider. -type MockSpaceStorageProviderMockRecorder struct { - mock *MockSpaceStorageProvider -} - -// NewMockSpaceStorageProvider creates a new mock instance. -func NewMockSpaceStorageProvider(ctrl *gomock.Controller) *MockSpaceStorageProvider { - mock := &MockSpaceStorageProvider{ctrl: ctrl} - mock.recorder = &MockSpaceStorageProviderMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSpaceStorageProvider) EXPECT() *MockSpaceStorageProviderMockRecorder { - return m.recorder -} - -// CreateSpaceStorage mocks base method. -func (m *MockSpaceStorageProvider) CreateSpaceStorage(arg0 spacestorage.SpaceStorageCreatePayload) (spacestorage.SpaceStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateSpaceStorage", arg0) - ret0, _ := ret[0].(spacestorage.SpaceStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateSpaceStorage indicates an expected call of CreateSpaceStorage. -func (mr *MockSpaceStorageProviderMockRecorder) CreateSpaceStorage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSpaceStorage", reflect.TypeOf((*MockSpaceStorageProvider)(nil).CreateSpaceStorage), arg0) -} - -// Init mocks base method. -func (m *MockSpaceStorageProvider) Init(arg0 *app.App) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Init", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// Init indicates an expected call of Init. -func (mr *MockSpaceStorageProviderMockRecorder) Init(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Init), arg0) -} - -// Name mocks base method. -func (m *MockSpaceStorageProvider) Name() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Name") - ret0, _ := ret[0].(string) - return ret0 -} - -// Name indicates an expected call of Name. -func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call { - mr.mock.ctrl.T.Helper() - 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. -func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (spacestorage.SpaceStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SpaceStorage", arg0) - ret0, _ := ret[0].(spacestorage.SpaceStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SpaceStorage indicates an expected call of SpaceStorage. -func (mr *MockSpaceStorageProviderMockRecorder) SpaceStorage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceStorage", reflect.TypeOf((*MockSpaceStorageProvider)(nil).SpaceStorage), arg0) -} - // MockSpaceStorage is a mock of SpaceStorage interface. type MockSpaceStorage struct { ctrl *gomock.Controller @@ -264,6 +168,21 @@ func (mr *MockSpaceStorageMockRecorder) TreeDeletedStatus(arg0 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TreeDeletedStatus", reflect.TypeOf((*MockSpaceStorage)(nil).TreeDeletedStatus), arg0) } +// TreeRoot mocks base method. +func (m *MockSpaceStorage) TreeRoot(arg0 string) (*treechangeproto.RawTreeChangeWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TreeRoot", arg0) + ret0, _ := ret[0].(*treechangeproto.RawTreeChangeWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TreeRoot indicates an expected call of TreeRoot. +func (mr *MockSpaceStorageMockRecorder) TreeRoot(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TreeRoot", reflect.TypeOf((*MockSpaceStorage)(nil).TreeRoot), arg0) +} + // TreeStorage mocks base method. func (m *MockSpaceStorage) TreeStorage(arg0 string) (treestorage.TreeStorage, error) { m.ctrl.T.Helper() diff --git a/common/commonspace/spacestorage/mock_spacestorage/mock_storage.go b/common/commonspace/spacestorage/mock_spacestorage/mock_storage.go deleted file mode 100644 index e9ed76cc..00000000 --- a/common/commonspace/spacestorage/mock_spacestorage/mock_storage.go +++ /dev/null @@ -1,266 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage (interfaces: SpaceStorageProvider,SpaceStorage) - -// Package mock_storage is a generated GoMock package. -package mock_spacestorage - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage" - storage3 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage" - reflect "reflect" - - app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" - storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage" - spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - gomock "github.com/golang/mock/gomock" -) - -// MockSpaceStorageProvider is a mock of SpaceStorageProvider interface. -type MockSpaceStorageProvider struct { - ctrl *gomock.Controller - recorder *MockSpaceStorageProviderMockRecorder -} - -// MockSpaceStorageProviderMockRecorder is the mock recorder for MockSpaceStorageProvider. -type MockSpaceStorageProviderMockRecorder struct { - mock *MockSpaceStorageProvider -} - -// NewMockSpaceStorageProvider creates a new mock instance. -func NewMockSpaceStorageProvider(ctrl *gomock.Controller) *MockSpaceStorageProvider { - mock := &MockSpaceStorageProvider{ctrl: ctrl} - mock.recorder = &MockSpaceStorageProviderMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSpaceStorageProvider) EXPECT() *MockSpaceStorageProviderMockRecorder { - return m.recorder -} - -// CreateSpaceStorage mocks base method. -func (m *MockSpaceStorageProvider) CreateSpaceStorage(arg0 storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateSpaceStorage", arg0) - ret0, _ := ret[0].(storage.SpaceStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateSpaceStorage indicates an expected call of CreateSpaceStorage. -func (mr *MockSpaceStorageProviderMockRecorder) CreateSpaceStorage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSpaceStorage", reflect.TypeOf((*MockSpaceStorageProvider)(nil).CreateSpaceStorage), arg0) -} - -// Init mocks base method. -func (m *MockSpaceStorageProvider) Init(arg0 *app.App) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Init", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// Init indicates an expected call of Init. -func (mr *MockSpaceStorageProviderMockRecorder) Init(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Init), arg0) -} - -// Name mocks base method. -func (m *MockSpaceStorageProvider) Name() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Name") - ret0, _ := ret[0].(string) - return ret0 -} - -// Name indicates an expected call of Name. -func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Name)) -} - -// SpaceStorage mocks base method. -func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (storage.SpaceStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SpaceStorage", arg0) - ret0, _ := ret[0].(storage.SpaceStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SpaceStorage indicates an expected call of SpaceStorage. -func (mr *MockSpaceStorageProviderMockRecorder) SpaceStorage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceStorage", reflect.TypeOf((*MockSpaceStorageProvider)(nil).SpaceStorage), arg0) -} - -// MockSpaceStorage is a mock of SpaceStorage interface. -type MockSpaceStorage struct { - ctrl *gomock.Controller - recorder *MockSpaceStorageMockRecorder -} - -// MockSpaceStorageMockRecorder is the mock recorder for MockSpaceStorage. -type MockSpaceStorageMockRecorder struct { - mock *MockSpaceStorage -} - -// NewMockSpaceStorage creates a new mock instance. -func NewMockSpaceStorage(ctrl *gomock.Controller) *MockSpaceStorage { - mock := &MockSpaceStorage{ctrl: ctrl} - mock.recorder = &MockSpaceStorageMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockSpaceStorage) EXPECT() *MockSpaceStorageMockRecorder { - return m.recorder -} - -// AclStorage mocks base method. -func (m *MockSpaceStorage) AclStorage() (liststorage.ListStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AclStorage") - ret0, _ := ret[0].(liststorage.ListStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// AclStorage indicates an expected call of AclStorage. -func (mr *MockSpaceStorageMockRecorder) AclStorage() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AclStorage", reflect.TypeOf((*MockSpaceStorage)(nil).AclStorage)) -} - -// Close mocks base method. -func (m *MockSpaceStorage) Close() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Close") - ret0, _ := ret[0].(error) - return ret0 -} - -// Close indicates an expected call of Close. -func (mr *MockSpaceStorageMockRecorder) Close() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSpaceStorage)(nil).Close)) -} - -// CreateTreeStorage mocks base method. -func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage3.TreeStorageCreatePayload) (storage3.TreeStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateTreeStorage", arg0) - ret0, _ := ret[0].(storage3.TreeStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateTreeStorage indicates an expected call of CreateTreeStorage. -func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).CreateTreeStorage), arg0) -} - -// Id mocks base method. -func (m *MockSpaceStorage) Id() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Id") - ret0, _ := ret[0].(string) - return ret0 -} - -// Id indicates an expected call of Id. -func (mr *MockSpaceStorageMockRecorder) Id() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockSpaceStorage)(nil).Id)) -} - -// SetTreeDeletedStatus mocks base method. -func (m *MockSpaceStorage) SetTreeDeletedStatus(arg0, arg1 string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetTreeDeletedStatus", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetTreeDeletedStatus indicates an expected call of SetTreeDeletedStatus. -func (mr *MockSpaceStorageMockRecorder) SetTreeDeletedStatus(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTreeDeletedStatus", reflect.TypeOf((*MockSpaceStorage)(nil).SetTreeDeletedStatus), arg0, arg1) -} - -// SpaceHeader mocks base method. -func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SpaceHeader") - ret0, _ := ret[0].(*spacesyncproto.RawSpaceHeaderWithId) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SpaceHeader indicates an expected call of SpaceHeader. -func (mr *MockSpaceStorageMockRecorder) SpaceHeader() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceHeader", reflect.TypeOf((*MockSpaceStorage)(nil).SpaceHeader)) -} - -// SpaceSettingsId mocks base method. -func (m *MockSpaceStorage) SpaceSettingsId() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SpaceSettingsId") - ret0, _ := ret[0].(string) - return ret0 -} - -// SpaceSettingsId indicates an expected call of SpaceSettingsId. -func (mr *MockSpaceStorageMockRecorder) SpaceSettingsId() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceSettingsId", reflect.TypeOf((*MockSpaceStorage)(nil).SpaceSettingsId)) -} - -// StoredIds mocks base method. -func (m *MockSpaceStorage) StoredIds() ([]string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StoredIds") - ret0, _ := ret[0].([]string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// StoredIds indicates an expected call of StoredIds. -func (mr *MockSpaceStorageMockRecorder) StoredIds() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoredIds", reflect.TypeOf((*MockSpaceStorage)(nil).StoredIds)) -} - -// TreeDeletedStatus mocks base method. -func (m *MockSpaceStorage) TreeDeletedStatus(arg0 string) (string, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TreeDeletedStatus", arg0) - ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// TreeDeletedStatus indicates an expected call of TreeDeletedStatus. -func (mr *MockSpaceStorageMockRecorder) TreeDeletedStatus(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TreeDeletedStatus", reflect.TypeOf((*MockSpaceStorage)(nil).TreeDeletedStatus), arg0) -} - -// TreeStorage mocks base method. -func (m *MockSpaceStorage) TreeStorage(arg0 string) (storage3.TreeStorage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TreeStorage", arg0) - ret0, _ := ret[0].(storage3.TreeStorage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// TreeStorage indicates an expected call of TreeStorage. -func (mr *MockSpaceStorageMockRecorder) TreeStorage(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).TreeStorage), arg0) -} diff --git a/common/commonspace/spacestorage/storage.go b/common/commonspace/spacestorage/spacestorage.go similarity index 82% rename from common/commonspace/spacestorage/storage.go rename to common/commonspace/spacestorage/spacestorage.go index 41d3df47..ddb35bb0 100644 --- a/common/commonspace/spacestorage/storage.go +++ b/common/commonspace/spacestorage/spacestorage.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage SpaceStorageProvider,SpaceStorage +//go:generate mockgen -destination mock_spacestorage/mock_spacestorage.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage SpaceStorage package spacestorage import ( @@ -27,7 +27,6 @@ const ( // TODO: consider moving to some file with all common interfaces etc type SpaceStorage interface { - treestorage.Provider Id() string SetTreeDeletedStatus(id, state string) error TreeDeletedStatus(id string) (string, error) @@ -36,6 +35,9 @@ type SpaceStorage interface { SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) Close() error + TreeRoot(id string) (*treechangeproto.RawTreeChangeWithId, error) + TreeStorage(id string) (treestorage.TreeStorage, error) + CreateTreeStorage(payload treestorage.TreeStorageCreatePayload) (treestorage.TreeStorage, error) } type SpaceStorageCreatePayload struct { diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index c5ba6bcc..9d182186 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -178,6 +178,10 @@ func (s *spaceStorage) TreeStorage(id string) (treestorage.TreeStorage, error) { return newTreeStorage(s.objDb, id) } +func (s *spaceStorage) TreeRoot(id string) (*treechangeproto.RawTreeChangeWithId, error) { + panic("should not be implemented") +} + func (s *spaceStorage) CreateTreeStorage(payload treestorage.TreeStorageCreatePayload) (ts treestorage.TreeStorage, err error) { return createTreeStorage(s.objDb, payload) } From ac84febce98d02bc6d9c63f42dcd13c7acd9c0cd Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 3 Jan 2023 18:55:43 +0100 Subject: [PATCH 5/9] Add easy access to unmarshalled header --- .../objecttree/mock_objecttree/mock_objecttree.go | 14 ++++++++++++++ .../object/tree/objecttree/objecttree.go | 12 +++++++++--- .../object/tree/objecttree/objecttreefactory.go | 7 +++---- .../tree/synctree/mock_synctree/mock_synctree.go | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go b/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go index 571cdf91..3c2b490a 100644 --- a/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go +++ b/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go @@ -302,3 +302,17 @@ func (mr *MockObjectTreeMockRecorder) Unlock() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockObjectTree)(nil).Unlock)) } + +// UnmarshalledHeader mocks base method. +func (m *MockObjectTree) UnmarshalledHeader() *objecttree.Change { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnmarshalledHeader") + ret0, _ := ret[0].(*objecttree.Change) + return ret0 +} + +// UnmarshalledHeader indicates an expected call of UnmarshalledHeader. +func (mr *MockObjectTreeMockRecorder) UnmarshalledHeader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnmarshalledHeader", reflect.TypeOf((*MockObjectTree)(nil).UnmarshalledHeader)) +} diff --git a/common/commonspace/object/tree/objecttree/objecttree.go b/common/commonspace/object/tree/objecttree/objecttree.go index 09a3012c..522564a8 100644 --- a/common/commonspace/object/tree/objecttree/objecttree.go +++ b/common/commonspace/object/tree/objecttree/objecttree.go @@ -48,6 +48,7 @@ type ObjectTree interface { Id() string Header() *treechangeproto.RawTreeChangeWithId + UnmarshalledHeader() *Change Heads() []string Root() *Change HasChanges(...string) bool @@ -76,9 +77,10 @@ type objectTree struct { treeBuilder *treeBuilder aclList list2.AclList - id string - root *treechangeproto.RawTreeChangeWithId - tree *Tree + id string + rawRoot *treechangeproto.RawTreeChangeWithId + root *Change + tree *Tree keys map[uint64]*symmetric.Key @@ -142,6 +144,10 @@ func (ot *objectTree) Id() string { } func (ot *objectTree) Header() *treechangeproto.RawTreeChangeWithId { + return ot.rawRoot +} + +func (ot *objectTree) UnmarshalledHeader() *Change { return ot.root } diff --git a/common/commonspace/object/tree/objecttree/objecttreefactory.go b/common/commonspace/object/tree/objecttree/objecttreefactory.go index 789f36fd..12890cf7 100644 --- a/common/commonspace/object/tree/objecttree/objecttreefactory.go +++ b/common/commonspace/object/tree/objecttree/objecttreefactory.go @@ -150,18 +150,17 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { } objTree.id = objTree.treeStorage.Id() - - objTree.id = objTree.treeStorage.Id() - objTree.root, err = objTree.treeStorage.Root() + objTree.rawRoot, err = objTree.treeStorage.Root() if err != nil { return nil, err } // verifying root - _, err = objTree.changeBuilder.ConvertFromRaw(objTree.root, true) + header, err := objTree.changeBuilder.ConvertFromRaw(objTree.rawRoot, true) if err != nil { return nil, err } + objTree.root = header return objTree, nil } diff --git a/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go b/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go index 99a8e11c..154a84ce 100644 --- a/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go +++ b/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go @@ -455,6 +455,20 @@ func (mr *MockSyncTreeMockRecorder) Unlock() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockSyncTree)(nil).Unlock)) } +// UnmarshalledHeader mocks base method. +func (m *MockSyncTree) UnmarshalledHeader() *objecttree.Change { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnmarshalledHeader") + ret0, _ := ret[0].(*objecttree.Change) + return ret0 +} + +// UnmarshalledHeader indicates an expected call of UnmarshalledHeader. +func (mr *MockSyncTreeMockRecorder) UnmarshalledHeader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnmarshalledHeader", reflect.TypeOf((*MockSyncTree)(nil).UnmarshalledHeader)) +} + // MockReceiveQueue is a mock of ReceiveQueue interface. type MockReceiveQueue struct { ctrl *gomock.Controller From 9b59e6029ddc226b74b0048e6f07e44b86ceb5df Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 4 Jan 2023 14:39:26 +0100 Subject: [PATCH 6/9] Rename ObjectTree.Iterate to IterateRoot --- client/document/textdocument/textdocument.go | 2 +- .../mock_objecttree/mock_objecttree.go | 28 +++++++++---------- .../object/tree/objecttree/objecttree.go | 4 +-- .../object/tree/objecttree/objecttree_test.go | 8 +++--- .../synctree/mock_synctree/mock_synctree.go | 28 +++++++++---------- .../object/tree/synctree/synctree.go | 4 +-- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/client/document/textdocument/textdocument.go b/client/document/textdocument/textdocument.go index a96159f3..85fd9629 100644 --- a/client/document/textdocument/textdocument.go +++ b/client/document/textdocument/textdocument.go @@ -90,7 +90,7 @@ func (t *textDocument) Text() (text string, err error) { t.RLock() defer t.RUnlock() - err = t.Iterate( + err = t.IterateRoot( func(decrypted []byte) (any, error) { textChange := &textchange.TextData{} err = proto.Unmarshal(decrypted, textChange) diff --git a/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go b/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go index 3c2b490a..d54ad8b6 100644 --- a/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go +++ b/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go @@ -185,20 +185,6 @@ func (mr *MockObjectTreeMockRecorder) Id() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockObjectTree)(nil).Id)) } -// Iterate mocks base method. -func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*objecttree.Change) bool) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Iterate", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// Iterate indicates an expected call of Iterate. -func (mr *MockObjectTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterate", reflect.TypeOf((*MockObjectTree)(nil).Iterate), arg0, arg1) -} - // IterateFrom mocks base method. func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*objecttree.Change) bool) error { m.ctrl.T.Helper() @@ -213,6 +199,20 @@ func (mr *MockObjectTreeMockRecorder) IterateFrom(arg0, arg1, arg2 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateFrom", reflect.TypeOf((*MockObjectTree)(nil).IterateFrom), arg0, arg1, arg2) } +// IterateRoot mocks base method. +func (m *MockObjectTree) IterateRoot(arg0 func([]byte) (interface{}, error), arg1 func(*objecttree.Change) bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IterateRoot", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// IterateRoot indicates an expected call of IterateRoot. +func (mr *MockObjectTreeMockRecorder) IterateRoot(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateRoot", reflect.TypeOf((*MockObjectTree)(nil).IterateRoot), arg0, arg1) +} + // Lock mocks base method. func (m *MockObjectTree) Lock() { m.ctrl.T.Helper() diff --git a/common/commonspace/object/tree/objecttree/objecttree.go b/common/commonspace/object/tree/objecttree/objecttree.go index 522564a8..81e311f3 100644 --- a/common/commonspace/object/tree/objecttree/objecttree.go +++ b/common/commonspace/object/tree/objecttree/objecttree.go @@ -54,7 +54,7 @@ type ObjectTree interface { HasChanges(...string) bool DebugDump() (string, error) - Iterate(convert ChangeConvertFunc, iterate ChangeIterateFunc) error + IterateRoot(convert ChangeConvertFunc, iterate ChangeIterateFunc) error IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error SnapshotPath() []string @@ -458,7 +458,7 @@ func (ot *objectTree) createAddResult(oldHeads []string, mode Mode, treeChangesA return } -func (ot *objectTree) Iterate(convert ChangeConvertFunc, iterate ChangeIterateFunc) (err error) { +func (ot *objectTree) IterateRoot(convert ChangeConvertFunc, iterate ChangeIterateFunc) (err error) { return ot.IterateFrom(ot.tree.RootId(), convert, iterate) } diff --git a/common/commonspace/object/tree/objecttree/objecttree_test.go b/common/commonspace/object/tree/objecttree/objecttree_test.go index 41d4d98f..4e15ca10 100644 --- a/common/commonspace/object/tree/objecttree/objecttree_test.go +++ b/common/commonspace/object/tree/objecttree/objecttree_test.go @@ -133,7 +133,7 @@ func prepareTreeContext(t *testing.T, aclList list.AclList) testTreeContext { // check tree iterate var iterChangesId []string - err = objTree.Iterate(nil, func(change *Change) bool { + err = objTree.IterateRoot(nil, func(change *Change) bool { iterChangesId = append(iterChangesId, change.Id) return true }) @@ -179,7 +179,7 @@ func TestObjectTree(t *testing.T) { // check tree iterate var iterChangesId []string - err = objTree.Iterate(nil, func(change *Change) bool { + err = objTree.IterateRoot(nil, func(change *Change) bool { iterChangesId = append(iterChangesId, change.Id) return true }) @@ -277,7 +277,7 @@ func TestObjectTree(t *testing.T) { // check tree iterate var iterChangesId []string - err = objTree.Iterate(nil, func(change *Change) bool { + err = objTree.IterateRoot(nil, func(change *Change) bool { iterChangesId = append(iterChangesId, change.Id) return true }) @@ -523,7 +523,7 @@ func TestObjectTree(t *testing.T) { // check tree iterate var iterChangesId []string - err = objTree.Iterate(nil, func(change *Change) bool { + err = objTree.IterateRoot(nil, func(change *Change) bool { iterChangesId = append(iterChangesId, change.Id) return true }) diff --git a/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go b/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go index 154a84ce..52b584e4 100644 --- a/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go +++ b/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go @@ -323,20 +323,6 @@ func (mr *MockSyncTreeMockRecorder) Id() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockSyncTree)(nil).Id)) } -// Iterate mocks base method. -func (m *MockSyncTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*objecttree.Change) bool) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Iterate", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// Iterate indicates an expected call of Iterate. -func (mr *MockSyncTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterate", reflect.TypeOf((*MockSyncTree)(nil).Iterate), arg0, arg1) -} - // IterateFrom mocks base method. func (m *MockSyncTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*objecttree.Change) bool) error { m.ctrl.T.Helper() @@ -351,6 +337,20 @@ func (mr *MockSyncTreeMockRecorder) IterateFrom(arg0, arg1, arg2 interface{}) *g return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateFrom", reflect.TypeOf((*MockSyncTree)(nil).IterateFrom), arg0, arg1, arg2) } +// IterateRoot mocks base method. +func (m *MockSyncTree) IterateRoot(arg0 func([]byte) (interface{}, error), arg1 func(*objecttree.Change) bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IterateRoot", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// IterateRoot indicates an expected call of IterateRoot. +func (mr *MockSyncTreeMockRecorder) IterateRoot(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateRoot", reflect.TypeOf((*MockSyncTree)(nil).IterateRoot), arg0, arg1) +} + // Lock mocks base method. func (m *MockSyncTree) Lock() { m.ctrl.T.Helper() diff --git a/common/commonspace/object/tree/synctree/synctree.go b/common/commonspace/object/tree/synctree/synctree.go index 7e6f77c5..fc835427 100644 --- a/common/commonspace/object/tree/synctree/synctree.go +++ b/common/commonspace/object/tree/synctree/synctree.go @@ -200,11 +200,11 @@ func (s *syncTree) IterateFrom(id string, convert objecttree.ChangeConvertFunc, return s.ObjectTree.IterateFrom(id, convert, iterate) } -func (s *syncTree) Iterate(convert objecttree.ChangeConvertFunc, iterate objecttree.ChangeIterateFunc) (err error) { +func (s *syncTree) IterateRoot(convert objecttree.ChangeConvertFunc, iterate objecttree.ChangeIterateFunc) (err error) { if err = s.checkAlive(); err != nil { return } - return s.ObjectTree.Iterate(convert, iterate) + return s.ObjectTree.IterateRoot(convert, iterate) } func (s *syncTree) AddContent(ctx context.Context, content objecttree.SignableChangeContent) (res objecttree.AddResult, err error) { From 02e92a0db0e43c1438d9163c4ab551d28781c82c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 4 Jan 2023 15:07:56 +0100 Subject: [PATCH 7/9] Update space service to return id in case the space storage is already created --- common/commonspace/spaceservice.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/commonspace/spaceservice.go b/common/commonspace/spaceservice.go index c2fc660e..cc1d269c 100644 --- a/common/commonspace/spaceservice.go +++ b/common/commonspace/spaceservice.go @@ -68,6 +68,9 @@ func (s *spaceService) CreateSpace(ctx context.Context, payload SpaceCreatePaylo } store, err := s.storageProvider.CreateSpaceStorage(storageCreate) if err != nil { + if err == spacestorage.ErrSpaceStorageExists { + return storageCreate.SpaceHeaderWithId.Id, nil + } return } @@ -81,6 +84,9 @@ func (s *spaceService) DeriveSpace(ctx context.Context, payload SpaceDerivePaylo } store, err := s.storageProvider.CreateSpaceStorage(storageCreate) if err != nil { + if err == spacestorage.ErrSpaceStorageExists { + return storageCreate.SpaceHeaderWithId.Id, nil + } return } From 411a67c31f5c577974fdfba384d9b4e27046f236 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 5 Jan 2023 12:45:50 +0100 Subject: [PATCH 8/9] Change object creation logic --- client/clientspace/clientcache/treecache.go | 20 +++++++++---- client/document/service.go | 4 +-- .../object/treegetter/treegetter.go | 5 ---- common/commonspace/space.go | 28 ++++++------------- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index cd3b9450..7304ed54 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -35,8 +35,8 @@ type treeCache struct { type TreeCache interface { treegetter.TreeGetter - treegetter.TreePutter GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error) + CreateDocument(ctx context.Context, spaceId string, payload objecttree.ObjectTreeCreatePayload) (ot textdocument.TextDocument, err error) } type updateListener struct { @@ -117,14 +117,22 @@ func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objectt 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) +func (c *treeCache) CreateDocument(ctx context.Context, spaceId string, payload objecttree.ObjectTreeCreatePayload) (ot textdocument.TextDocument, err error) { + space, err := c.clientService.GetSpace(ctx, spaceId) if err != nil { return } - return v.(objecttree.ObjectTree), nil + create, err := space.CreateTree(context.Background(), payload) + if err != nil { + return + } + ctx = context.WithValue(ctx, spaceKey, spaceId) + ctx = context.WithValue(ctx, treeCreateKey, create) + v, err := c.cache.Get(ctx, create.RootRawChange.Id) + if err != nil { + return + } + return v.(textdocument.TextDocument), nil } func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) { diff --git a/client/document/service.go b/client/document/service.go index 7b6004aa..600ad111 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -58,11 +58,11 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) { SpaceId: space.Id(), Identity: s.account.Account().Identity, } - tree, err := space.CreateTree(context.Background(), payload) + doc, err := s.cache.CreateDocument(context.Background(), space.Id(), payload) if err != nil { return } - id = tree.Id() + id = doc.Id() return } diff --git a/common/commonspace/object/treegetter/treegetter.go b/common/commonspace/object/treegetter/treegetter.go index 8f2d7cd6..8b3ba472 100644 --- a/common/commonspace/object/treegetter/treegetter.go +++ b/common/commonspace/object/treegetter/treegetter.go @@ -5,7 +5,6 @@ import ( "context" "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/treestorage" ) const CName = "common.object.treegetter" @@ -15,7 +14,3 @@ type TreeGetter interface { GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) DeleteTree(ctx context.Context, spaceId, treeId string) error } - -type TreePutter interface { - PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error) -} diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 08170653..ee863d16 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -81,8 +81,8 @@ type Space interface { SpaceSyncRpc() RpcHandler - DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error) - CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error) + DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error) + CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err 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) DeleteTree(ctx context.Context, id string) (err error) @@ -230,51 +230,39 @@ func (s *space) DebugAllHeads() []headsync.TreeHeads { return s.headSync.DebugAllHeads() } -func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) { +func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error) { if s.isClosed.Load() { err = ErrSpaceClosed return } - treePutter, conforms := s.cache.(treegetter.TreePutter) - if !conforms { - err = ErrPutNotImplemented - return - } root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList) if err != nil { return } - res := treestorage.TreeStorageCreatePayload{ + res = treestorage.TreeStorageCreatePayload{ RootRawChange: root, Changes: []*treechangeproto.RawTreeChangeWithId{root}, Heads: []string{root.Id}, } - // here we must be sure that the object is created synchronously, - // so there won't be any conflicts, therefore we do it through cache - return treePutter.PutTree(ctx, s.id, res) + return } -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) (res treestorage.TreeStorageCreatePayload, err error) { if s.isClosed.Load() { err = ErrSpaceClosed return } - treePutter, conforms := s.cache.(treegetter.TreePutter) - if !conforms { - err = ErrPutNotImplemented - return - } root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList) if err != nil { return } - res := treestorage.TreeStorageCreatePayload{ + res = treestorage.TreeStorageCreatePayload{ RootRawChange: root, Changes: []*treechangeproto.RawTreeChangeWithId{root}, Heads: []string{root.Id}, } - return treePutter.PutTree(ctx, s.id, res) + return } func (s *space) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) { From f9c65bf8e114b44e836f872991c02fb8a811d830 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 5 Jan 2023 15:02:08 +0300 Subject: [PATCH 9/9] go.mod: update mb/v3 --- common/go.mod | 2 +- common/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/go.mod b/common/go.mod index 65e4469b..e06d12a3 100644 --- a/common/go.mod +++ b/common/go.mod @@ -7,7 +7,7 @@ require ( github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/cespare/xxhash v1.1.0 - github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c + github.com/cheggaaa/mb/v3 v3.0.0 github.com/goccy/go-graphviz v0.0.9 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 diff --git a/common/go.sum b/common/go.sum index 202e9e53..c758548f 100644 --- a/common/go.sum +++ b/common/go.sum @@ -60,8 +60,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c h1:+bD75daSbsxyTzkKpNplC4xls+7/tGwty+zruzOnOmk= -github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI= +github.com/cheggaaa/mb/v3 v3.0.0 h1:+FkV4fAefQfJSsfMtWC9cnSrVYKd3TXcerPTwRuWWfE= +github.com/cheggaaa/mb/v3 v3.0.0/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=