Make tree creation logic more transparent
This commit is contained in:
parent
987bd0154f
commit
40f8fb503a
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"time"
|
"time"
|
||||||
@ -20,7 +21,10 @@ var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree")
|
|||||||
|
|
||||||
type ctxKey int
|
type ctxKey int
|
||||||
|
|
||||||
const spaceKey ctxKey = 0
|
const (
|
||||||
|
spaceKey ctxKey = iota
|
||||||
|
treeCreateKey
|
||||||
|
)
|
||||||
|
|
||||||
type treeCache struct {
|
type treeCache struct {
|
||||||
gcttl int
|
gcttl int
|
||||||
@ -31,6 +35,7 @@ type treeCache struct {
|
|||||||
|
|
||||||
type TreeCache interface {
|
type TreeCache interface {
|
||||||
treegetter.TreeGetter
|
treegetter.TreeGetter
|
||||||
|
treegetter.TreePutter
|
||||||
GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error)
|
GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,6 +80,10 @@ func (c *treeCache) Init(a *app.App) (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
createPayload, exists := ctx.Value(treeCreateKey).(treestorage.TreeStorageCreatePayload)
|
||||||
|
if exists {
|
||||||
|
return textdocument.CreateTextDocument(ctx, space, createPayload, &updateListener{}, c.account)
|
||||||
|
}
|
||||||
return textdocument.NewTextDocument(ctx, space, id, &updateListener{}, c.account)
|
return textdocument.NewTextDocument(ctx, space, id, &updateListener{}, c.account)
|
||||||
},
|
},
|
||||||
ocache.WithLogger(log.Sugar()),
|
ocache.WithLogger(log.Sugar()),
|
||||||
@ -108,6 +117,16 @@ func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objectt
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *treeCache) PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (ot objecttree.ObjectTree, err error) {
|
||||||
|
ctx = context.WithValue(ctx, spaceKey, spaceId)
|
||||||
|
ctx = context.WithValue(ctx, treeCreateKey, payload)
|
||||||
|
v, err := c.cache.Get(ctx, payload.RootRawChange.Id)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return v.(objecttree.ObjectTree), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) {
|
func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) {
|
||||||
tr, err := c.GetTree(ctx, spaceId, treeId)
|
tr, err := c.GetTree(ctx, spaceId, treeId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -4,11 +4,11 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -53,7 +53,17 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return textdocument.CreateTextDocument(context.Background(), space, s.account)
|
payload := objecttree.ObjectTreeCreatePayload{
|
||||||
|
SignKey: s.account.Account().SignKey,
|
||||||
|
SpaceId: space.Id(),
|
||||||
|
Identity: s.account.Account().Identity,
|
||||||
|
}
|
||||||
|
tree, err := space.CreateTree(context.Background(), payload)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id = tree.Id()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) DeleteDocument(spaceId, documentId string) (err error) {
|
func (s *service) DeleteDocument(spaceId, documentId string) (err error) {
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -27,18 +28,17 @@ type textDocument struct {
|
|||||||
func CreateTextDocument(
|
func CreateTextDocument(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
space commonspace.Space,
|
space commonspace.Space,
|
||||||
account accountservice.Service) (id string, err error) {
|
payload treestorage.TreeStorageCreatePayload,
|
||||||
payload := objecttree.ObjectTreeCreatePayload{
|
listener updatelistener.UpdateListener,
|
||||||
SignKey: account.Account().SignKey,
|
account accountservice.Service) (doc TextDocument, err error) {
|
||||||
SpaceId: space.Id(),
|
t, err := space.PutTree(ctx, payload, listener)
|
||||||
Identity: account.Account().Identity,
|
|
||||||
}
|
|
||||||
obj, err := space.CreateTree(ctx, payload)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
id = obj.Id()
|
return &textDocument{
|
||||||
return
|
ObjectTree: t,
|
||||||
|
account: account,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account accountservice.Service) (doc TextDocument, err error) {
|
func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account accountservice.Service) (doc TextDocument, err error) {
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
//go:generate mockgen -destination mock_confconnector/mock_confconnector.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/confconnector ConfConnector
|
||||||
package confconnector
|
package confconnector
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -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))
|
||||||
|
}
|
||||||
@ -6,6 +6,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff/mock_ldiff"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff/mock_ldiff"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/confconnector/mock_confconnector"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
mock_treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage/mock_treestorage"
|
mock_treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage/mock_treestorage"
|
||||||
@ -16,7 +17,6 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf"
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/libp2p/go-libp2p/core/sec"
|
"github.com/libp2p/go-libp2p/core/sec"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@ -98,7 +98,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
|
|||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
|
|
||||||
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
||||||
connectorMock := mock_nodeconf.NewMockConfConnector(ctrl)
|
connectorMock := mock_confconnector.NewMockConfConnector(ctrl)
|
||||||
cacheMock := mock_treegetter.NewMockTreeGetter(ctrl)
|
cacheMock := mock_treegetter.NewMockTreeGetter(ctrl)
|
||||||
stMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
|
stMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
|
||||||
clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl)
|
clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl)
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -107,6 +108,21 @@ func (mr *MockTreeGetterMockRecorder) Name() *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeGetter)(nil).Name))
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeGetter)(nil).Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PutTree mocks base method.
|
||||||
|
func (m *MockTreeGetter) PutTree(arg0 context.Context, arg1 string, arg2 treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "PutTree", arg0, arg1, arg2)
|
||||||
|
ret0, _ := ret[0].(objecttree.ObjectTree)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutTree indicates an expected call of PutTree.
|
||||||
|
func (mr *MockTreeGetterMockRecorder) PutTree(arg0, arg1, arg2 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutTree", reflect.TypeOf((*MockTreeGetter)(nil).PutTree), arg0, arg1, arg2)
|
||||||
|
}
|
||||||
|
|
||||||
// Run mocks base method.
|
// Run mocks base method.
|
||||||
func (m *MockTreeGetter) Run(arg0 context.Context) error {
|
func (m *MockTreeGetter) Run(arg0 context.Context) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
)
|
)
|
||||||
|
|
||||||
const CName = "common.object.treegetter"
|
const CName = "common.object.treegetter"
|
||||||
@ -14,3 +15,7 @@ type TreeGetter interface {
|
|||||||
GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error)
|
GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error)
|
||||||
DeleteTree(ctx context.Context, spaceId, treeId string) error
|
DeleteTree(ctx context.Context, spaceId, treeId string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TreePutter interface {
|
||||||
|
PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error)
|
||||||
|
}
|
||||||
|
|||||||
@ -31,7 +31,10 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrSpaceClosed = errors.New("space is closed")
|
var (
|
||||||
|
ErrSpaceClosed = errors.New("space is closed")
|
||||||
|
ErrPutNotImplemented = errors.New("put tree is not implemented")
|
||||||
|
)
|
||||||
|
|
||||||
type SpaceCreatePayload struct {
|
type SpaceCreatePayload struct {
|
||||||
// SigningKey is the signing key of the owner
|
// SigningKey is the signing key of the owner
|
||||||
@ -46,10 +49,6 @@ type SpaceCreatePayload struct {
|
|||||||
ReplicationKey uint64
|
ReplicationKey uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
type spaceCtxKey int
|
|
||||||
|
|
||||||
const treePayloadKey spaceCtxKey = 0
|
|
||||||
|
|
||||||
const SpaceTypeDerived = "derived.space"
|
const SpaceTypeDerived = "derived.space"
|
||||||
|
|
||||||
type SpaceDerivePayload struct {
|
type SpaceDerivePayload struct {
|
||||||
@ -84,10 +83,12 @@ type Space interface {
|
|||||||
|
|
||||||
DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error)
|
DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error)
|
||||||
CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error)
|
CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error)
|
||||||
|
PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error)
|
||||||
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error)
|
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error)
|
||||||
DeleteTree(ctx context.Context, id string) (err error)
|
DeleteTree(ctx context.Context, id string) (err error)
|
||||||
|
|
||||||
SyncStatus() syncstatus.StatusUpdater
|
SyncStatus() syncstatus.StatusUpdater
|
||||||
|
Storage() spacestorage.SpaceStorage
|
||||||
|
|
||||||
Close() error
|
Close() error
|
||||||
}
|
}
|
||||||
@ -217,6 +218,10 @@ func (s *space) SyncStatus() syncstatus.StatusUpdater {
|
|||||||
return s.syncStatus
|
return s.syncStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *space) Storage() spacestorage.SpaceStorage {
|
||||||
|
return s.storage
|
||||||
|
}
|
||||||
|
|
||||||
func (s *space) StoredIds() []string {
|
func (s *space) StoredIds() []string {
|
||||||
return s.headSync.AllIds()
|
return s.headSync.AllIds()
|
||||||
}
|
}
|
||||||
@ -230,6 +235,11 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre
|
|||||||
err = ErrSpaceClosed
|
err = ErrSpaceClosed
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
treePutter, conforms := s.cache.(treegetter.TreePutter)
|
||||||
|
if !conforms {
|
||||||
|
err = ErrPutNotImplemented
|
||||||
|
return
|
||||||
|
}
|
||||||
root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList)
|
root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@ -239,10 +249,9 @@ func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCre
|
|||||||
Changes: []*treechangeproto.RawTreeChangeWithId{root},
|
Changes: []*treechangeproto.RawTreeChangeWithId{root},
|
||||||
Heads: []string{root.Id},
|
Heads: []string{root.Id},
|
||||||
}
|
}
|
||||||
ctx = context.WithValue(ctx, treePayloadKey, res)
|
|
||||||
// here we must be sure that the object is created synchronously,
|
// here we must be sure that the object is created synchronously,
|
||||||
// so there won't be any conflicts, therefore we do it through cache
|
// so there won't be any conflicts, therefore we do it through cache
|
||||||
return s.cache.GetTree(ctx, s.id, root.Id)
|
return treePutter.PutTree(ctx, s.id, res)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) {
|
func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) {
|
||||||
@ -250,6 +259,11 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre
|
|||||||
err = ErrSpaceClosed
|
err = ErrSpaceClosed
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
treePutter, conforms := s.cache.(treegetter.TreePutter)
|
||||||
|
if !conforms {
|
||||||
|
err = ErrPutNotImplemented
|
||||||
|
return
|
||||||
|
}
|
||||||
root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList)
|
root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@ -260,8 +274,31 @@ func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCre
|
|||||||
Changes: []*treechangeproto.RawTreeChangeWithId{root},
|
Changes: []*treechangeproto.RawTreeChangeWithId{root},
|
||||||
Heads: []string{root.Id},
|
Heads: []string{root.Id},
|
||||||
}
|
}
|
||||||
ctx = context.WithValue(ctx, treePayloadKey, res)
|
return treePutter.PutTree(ctx, s.id, res)
|
||||||
return s.cache.GetTree(ctx, s.id, root.Id)
|
}
|
||||||
|
|
||||||
|
func (s *space) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
|
||||||
|
if s.isClosed.Load() {
|
||||||
|
err = ErrSpaceClosed
|
||||||
|
return
|
||||||
|
}
|
||||||
|
deps := synctree.BuildDeps{
|
||||||
|
SpaceId: s.id,
|
||||||
|
ObjectSync: s.objectSync,
|
||||||
|
Configuration: s.configuration,
|
||||||
|
HeadNotifiable: s.headSync,
|
||||||
|
Listener: listener,
|
||||||
|
AclList: s.aclList,
|
||||||
|
SpaceStorage: s.storage,
|
||||||
|
TreeUsage: &s.treesUsed,
|
||||||
|
SyncStatus: s.syncStatus,
|
||||||
|
}
|
||||||
|
t, err = synctree.PutSyncTree(ctx, payload, deps)
|
||||||
|
// this can happen only for derived trees, when we've synced same tree already
|
||||||
|
if err == treestorage.ErrTreeExists {
|
||||||
|
return synctree.BuildSyncTreeOrGetRemote(ctx, payload.RootRawChange.Id, deps)
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
|
func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
|
||||||
@ -269,9 +306,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene
|
|||||||
err = ErrSpaceClosed
|
err = ErrSpaceClosed
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if payload, exists := ctx.Value(treePayloadKey).(treestorage.TreeStorageCreatePayload); exists {
|
|
||||||
return s.putTree(ctx, payload, listener)
|
|
||||||
}
|
|
||||||
|
|
||||||
deps := synctree.BuildDeps{
|
deps := synctree.BuildDeps{
|
||||||
SpaceId: s.id,
|
SpaceId: s.id,
|
||||||
@ -319,27 +353,3 @@ func (s *space) Close() error {
|
|||||||
|
|
||||||
return mError.Err()
|
return mError.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *space) putTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {
|
|
||||||
if s.isClosed.Load() {
|
|
||||||
err = ErrSpaceClosed
|
|
||||||
return
|
|
||||||
}
|
|
||||||
deps := synctree.BuildDeps{
|
|
||||||
SpaceId: s.id,
|
|
||||||
ObjectSync: s.objectSync,
|
|
||||||
Configuration: s.configuration,
|
|
||||||
HeadNotifiable: s.headSync,
|
|
||||||
Listener: listener,
|
|
||||||
AclList: s.aclList,
|
|
||||||
SpaceStorage: s.storage,
|
|
||||||
TreeUsage: &s.treesUsed,
|
|
||||||
SyncStatus: s.syncStatus,
|
|
||||||
}
|
|
||||||
t, err = synctree.PutSyncTree(ctx, payload, deps)
|
|
||||||
// this can happen only for derived trees, when we've synced same tree already
|
|
||||||
if err == treestorage.ErrTreeExists {
|
|
||||||
return synctree.BuildSyncTreeOrGetRemote(ctx, payload.RootRawChange.Id, deps)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|||||||
@ -81,6 +81,20 @@ func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call {
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Name))
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SpaceExists mocks base method.
|
||||||
|
func (m *MockSpaceStorageProvider) SpaceExists(arg0 string) bool {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "SpaceExists", arg0)
|
||||||
|
ret0, _ := ret[0].(bool)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpaceExists indicates an expected call of SpaceExists.
|
||||||
|
func (mr *MockSpaceStorageProviderMockRecorder) SpaceExists(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceExists", reflect.TypeOf((*MockSpaceStorageProvider)(nil).SpaceExists), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// SpaceStorage mocks base method.
|
// SpaceStorage mocks base method.
|
||||||
func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (spacestorage.SpaceStorage, error) {
|
func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (spacestorage.SpaceStorage, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Service,Configuration,ConfConnector
|
//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Service,Configuration
|
||||||
package nodeconf
|
package nodeconf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Service,Configuration,ConfConnector)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Service,Configuration)
|
||||||
|
|
||||||
// Package mock_nodeconf is a generated GoMock package.
|
// Package mock_nodeconf is a generated GoMock package.
|
||||||
package mock_nodeconf
|
package mock_nodeconf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
|
||||||
pool "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
|
|
||||||
nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
@ -117,6 +114,20 @@ func (m *MockConfiguration) EXPECT() *MockConfigurationMockRecorder {
|
|||||||
return m.recorder
|
return m.recorder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Addresses mocks base method.
|
||||||
|
func (m *MockConfiguration) Addresses() map[string][]string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Addresses")
|
||||||
|
ret0, _ := ret[0].(map[string][]string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Addresses indicates an expected call of Addresses.
|
||||||
|
func (mr *MockConfigurationMockRecorder) Addresses() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Addresses", reflect.TypeOf((*MockConfiguration)(nil).Addresses))
|
||||||
|
}
|
||||||
|
|
||||||
// ConsensusPeers mocks base method.
|
// ConsensusPeers mocks base method.
|
||||||
func (m *MockConfiguration) ConsensusPeers() []string {
|
func (m *MockConfiguration) ConsensusPeers() []string {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@ -186,84 +197,3 @@ func (mr *MockConfigurationMockRecorder) NodeIds(arg0 interface{}) *gomock.Call
|
|||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeIds", reflect.TypeOf((*MockConfiguration)(nil).NodeIds), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeIds", reflect.TypeOf((*MockConfiguration)(nil).NodeIds), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockConfConnector is a mock of ConfConnector interface.
|
|
||||||
type MockConfConnector struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockConfConnectorMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockConfConnectorMockRecorder is the mock recorder for MockConfConnector.
|
|
||||||
type MockConfConnectorMockRecorder struct {
|
|
||||||
mock *MockConfConnector
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockConfConnector creates a new mock instance.
|
|
||||||
func NewMockConfConnector(ctrl *gomock.Controller) *MockConfConnector {
|
|
||||||
mock := &MockConfConnector{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockConfConnectorMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockConfConnector) EXPECT() *MockConfConnectorMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configuration mocks base method.
|
|
||||||
func (m *MockConfConnector) Configuration() nodeconf.Configuration {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Configuration")
|
|
||||||
ret0, _ := ret[0].(nodeconf.Configuration)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configuration indicates an expected call of Configuration.
|
|
||||||
func (mr *MockConfConnectorMockRecorder) Configuration() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Configuration", reflect.TypeOf((*MockConfConnector)(nil).Configuration))
|
|
||||||
}
|
|
||||||
|
|
||||||
// DialInactiveResponsiblePeers mocks base method.
|
|
||||||
func (m *MockConfConnector) DialInactiveResponsiblePeers(arg0 context.Context, arg1 string, arg2 []string) ([]peer.Peer, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "DialInactiveResponsiblePeers", arg0, arg1, arg2)
|
|
||||||
ret0, _ := ret[0].([]peer.Peer)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// DialInactiveResponsiblePeers indicates an expected call of DialInactiveResponsiblePeers.
|
|
||||||
func (mr *MockConfConnectorMockRecorder) DialInactiveResponsiblePeers(arg0, arg1, arg2 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialInactiveResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).DialInactiveResponsiblePeers), arg0, arg1, arg2)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetResponsiblePeers mocks base method.
|
|
||||||
func (m *MockConfConnector) GetResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "GetResponsiblePeers", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].([]peer.Peer)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetResponsiblePeers indicates an expected call of GetResponsiblePeers.
|
|
||||||
func (mr *MockConfConnectorMockRecorder) GetResponsiblePeers(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).GetResponsiblePeers), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pool mocks base method.
|
|
||||||
func (m *MockConfConnector) Pool() pool.Pool {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Pool")
|
|
||||||
ret0, _ := ret[0].(pool.Pool)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pool indicates an expected call of Pool.
|
|
||||||
func (mr *MockConfConnectorMockRecorder) Pool() *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pool", reflect.TypeOf((*MockConfConnector)(nil).Pool))
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user