diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index 5d512f23..7304ed54 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 @@ -32,6 +36,7 @@ type treeCache struct { type TreeCache interface { treegetter.TreeGetter 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 { @@ -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,24 @@ func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objectt return } +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 + } + 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) { tr, err := c.GetTree(ctx, spaceId, treeId) if err != nil { diff --git a/client/document/service.go b/client/document/service.go index adb82e99..600ad111 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, + } + doc, err := s.cache.CreateDocument(context.Background(), space.Id(), payload) + if err != nil { + return + } + id = doc.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..85fd9629 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) { @@ -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/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/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() 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 { 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/tree/objecttree/mock_objecttree/mock_objecttree.go b/common/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go index 571cdf91..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() @@ -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..81e311f3 100644 --- a/common/commonspace/object/tree/objecttree/objecttree.go +++ b/common/commonspace/object/tree/objecttree/objecttree.go @@ -48,12 +48,13 @@ type ObjectTree interface { Id() string Header() *treechangeproto.RawTreeChangeWithId + UnmarshalledHeader() *Change Heads() []string Root() *Change 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 @@ -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 } @@ -452,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/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/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/synctree/mock_synctree/mock_synctree.go b/common/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go index 99a8e11c..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() @@ -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 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) { 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/space.go b/common/commonspace/space.go index 68940637..ee863d16 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 { @@ -82,12 +81,14 @@ 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) 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() } @@ -225,7 +230,7 @@ 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 @@ -234,18 +239,15 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre if err != nil { return } - res := treestorage.TreeStorageCreatePayload{ + res = treestorage.TreeStorageCreatePayload{ RootRawChange: root, 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 } -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 @@ -255,13 +257,36 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre return } - res := treestorage.TreeStorageCreatePayload{ + res = treestorage.TreeStorageCreatePayload{ RootRawChange: root, Changes: []*treechangeproto.RawTreeChangeWithId{root}, Heads: []string{root.Id}, } - ctx = context.WithValue(ctx, treePayloadKey, res) - return s.cache.GetTree(ctx, s.id, root.Id) + return +} + +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 +294,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 +341,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/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 } diff --git a/common/commonspace/spacestorage/mock_storage/mock_storage.go b/common/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go similarity index 67% rename from common/commonspace/spacestorage/mock_storage/mock_storage.go rename to common/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go index 0d44e018..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,95 +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)) -} - -// 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 @@ -250,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/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= 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)) -} 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) }