From 854079d1be5ce602ec394929c3a59e955ca88792 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 18 Jul 2023 14:35:36 +0200 Subject: [PATCH] Add auxiliary methods to acl for getting records, export peer manager --- commonspace/object/acl/list/list.go | 19 +++++++++++++++++++ .../object/acl/list/mock_list/mock_list.go | 15 +++++++++++++++ .../acl/syncacl/mock_syncacl/mock_syncacl.go | 15 +++++++++++++++ .../object/tree/synctree/utils_test.go | 4 ++++ .../mock_peermanager/mock_peermanager.go | 15 +++++++++++++++ commonspace/peermanager/peermanager.go | 4 +++- commonspace/space.go | 10 ++++++++++ commonspace/spaceutils_test.go | 4 ++++ 8 files changed, 85 insertions(+), 1 deletion(-) diff --git a/commonspace/object/acl/list/list.go b/commonspace/object/acl/list/list.go index a2177ea4..ed1aec37 100644 --- a/commonspace/object/acl/list/list.go +++ b/commonspace/object/acl/list/list.go @@ -49,6 +49,7 @@ type AclList interface { Head() *AclRecord RecordsAfter(ctx context.Context, id string) (records []*consensusproto.RawRecordWithId, err error) + RecordsBefore(ctx context.Context, headId string) (records []*consensusproto.RawRecordWithId, err error) Get(id string) (*AclRecord, error) GetIndex(idx int) (*AclRecord, error) Iterate(iterFunc IterFunc) @@ -305,6 +306,24 @@ func (a *aclList) RecordsAfter(ctx context.Context, id string) (records []*conse return } +func (a *aclList) RecordsBefore(ctx context.Context, headId string) (records []*consensusproto.RawRecordWithId, err error) { + if headId == "" { + headId = a.Head().Id + } + recIdx, ok := a.indexes[headId] + if !ok { + return nil, ErrNoSuchRecord + } + for i := 0; i <= recIdx; i++ { + rawRec, err := a.storage.GetRawRecord(ctx, a.records[i].Id) + if err != nil { + return nil, err + } + records = append(records, rawRec) + } + return +} + func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) { recIdx, ok := a.indexes[startId] if !ok { diff --git a/commonspace/object/acl/list/mock_list/mock_list.go b/commonspace/object/acl/list/mock_list/mock_list.go index 6cdccac9..c7953ca1 100644 --- a/commonspace/object/acl/list/mock_list/mock_list.go +++ b/commonspace/object/acl/list/mock_list/mock_list.go @@ -297,6 +297,21 @@ func (mr *MockAclListMockRecorder) RecordsAfter(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordsAfter", reflect.TypeOf((*MockAclList)(nil).RecordsAfter), arg0, arg1) } +// RecordsBefore mocks base method. +func (m *MockAclList) RecordsBefore(arg0 context.Context, arg1 string) ([]*consensusproto.RawRecordWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RecordsBefore", arg0, arg1) + ret0, _ := ret[0].([]*consensusproto.RawRecordWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RecordsBefore indicates an expected call of RecordsBefore. +func (mr *MockAclListMockRecorder) RecordsBefore(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordsBefore", reflect.TypeOf((*MockAclList)(nil).RecordsBefore), arg0, arg1) +} + // Root mocks base method. func (m *MockAclList) Root() *consensusproto.RawRecordWithId { m.ctrl.T.Helper() diff --git a/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go b/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go index 66d16b9d..caa2dab2 100644 --- a/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go +++ b/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go @@ -357,6 +357,21 @@ func (mr *MockSyncAclMockRecorder) RecordsAfter(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordsAfter", reflect.TypeOf((*MockSyncAcl)(nil).RecordsAfter), arg0, arg1) } +// RecordsBefore mocks base method. +func (m *MockSyncAcl) RecordsBefore(arg0 context.Context, arg1 string) ([]*consensusproto.RawRecordWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RecordsBefore", arg0, arg1) + ret0, _ := ret[0].([]*consensusproto.RawRecordWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RecordsBefore indicates an expected call of RecordsBefore. +func (mr *MockSyncAclMockRecorder) RecordsBefore(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecordsBefore", reflect.TypeOf((*MockSyncAcl)(nil).RecordsBefore), arg0, arg1) +} + // Root mocks base method. func (m *MockSyncAcl) Root() *consensusproto.RawRecordWithId { m.ctrl.T.Helper() diff --git a/commonspace/object/tree/synctree/utils_test.go b/commonspace/object/tree/synctree/utils_test.go index 6aab234b..530eec30 100644 --- a/commonspace/object/tree/synctree/utils_test.go +++ b/commonspace/object/tree/synctree/utils_test.go @@ -157,6 +157,10 @@ func (r *requestPeerManager) GetResponsiblePeers(ctx context.Context) (peers []p return nil, nil } +func (r *requestPeerManager) GetNodePeers(ctx context.Context) (peers []peer.Peer, err error) { + return nil, nil +} + // testSyncHandler is the wrapper around individual tree to test sync protocol type testSyncHandler struct { synchandler.SyncHandler diff --git a/commonspace/peermanager/mock_peermanager/mock_peermanager.go b/commonspace/peermanager/mock_peermanager/mock_peermanager.go index d7d99e32..115794ac 100644 --- a/commonspace/peermanager/mock_peermanager/mock_peermanager.go +++ b/commonspace/peermanager/mock_peermanager/mock_peermanager.go @@ -51,6 +51,21 @@ func (mr *MockPeerManagerMockRecorder) Broadcast(arg0, arg1 interface{}) *gomock return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Broadcast", reflect.TypeOf((*MockPeerManager)(nil).Broadcast), arg0, arg1) } +// GetNodePeers mocks base method. +func (m *MockPeerManager) GetNodePeers(arg0 context.Context) ([]peer.Peer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNodePeers", arg0) + ret0, _ := ret[0].([]peer.Peer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNodePeers indicates an expected call of GetNodePeers. +func (mr *MockPeerManagerMockRecorder) GetNodePeers(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNodePeers", reflect.TypeOf((*MockPeerManager)(nil).GetNodePeers), arg0) +} + // GetResponsiblePeers mocks base method. func (m *MockPeerManager) GetResponsiblePeers(arg0 context.Context) ([]peer.Peer, error) { m.ctrl.T.Helper() diff --git a/commonspace/peermanager/peermanager.go b/commonspace/peermanager/peermanager.go index 0a5750bf..ee2097b1 100644 --- a/commonspace/peermanager/peermanager.go +++ b/commonspace/peermanager/peermanager.go @@ -18,8 +18,10 @@ type PeerManager interface { SendPeer(ctx context.Context, peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error) // Broadcast sends a message to all subscribed peers Broadcast(ctx context.Context, msg *spacesyncproto.ObjectSyncMessage) (err error) - // GetResponsiblePeers dials or gets from cache responsible peers to unary operations + // GetResponsiblePeers dials or gets from cache responsible peers GetResponsiblePeers(ctx context.Context) (peers []peer.Peer, err error) + // GetNodePeers dials or gets from cache node peers + GetNodePeers(ctx context.Context) (peers []peer.Peer, err error) } type PeerManagerProvider interface { diff --git a/commonspace/space.go b/commonspace/space.go index d2d6d486..0eafeea8 100644 --- a/commonspace/space.go +++ b/commonspace/space.go @@ -9,11 +9,13 @@ import ( "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto" "github.com/anyproto/any-sync/commonspace/objectsync" "github.com/anyproto/any-sync/commonspace/objecttreebuilder" + "github.com/anyproto/any-sync/commonspace/peermanager" "github.com/anyproto/any-sync/commonspace/settings" "github.com/anyproto/any-sync/commonspace/spacestate" "github.com/anyproto/any-sync/commonspace/spacestorage" "github.com/anyproto/any-sync/commonspace/spacesyncproto" "github.com/anyproto/any-sync/commonspace/syncstatus" + "github.com/anyproto/any-sync/net/peer" "github.com/anyproto/any-sync/util/crypto" "go.uber.org/zap" "strconv" @@ -73,6 +75,8 @@ type Space interface { SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error) DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) + GetNodePeers(ctx context.Context) (peer []peer.Peer, err error) + HandleMessage(ctx context.Context, msg objectsync.HandleMessage) (err error) HandleSyncRequest(ctx context.Context, req *spacesyncproto.ObjectSyncMessage) (resp *spacesyncproto.ObjectSyncMessage, err error) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) @@ -89,6 +93,7 @@ type space struct { app *app.App treeBuilder objecttreebuilder.TreeBuilderComponent + peerManager peermanager.PeerManager headSync headsync.HeadSync objectSync objectsync.ObjectSync syncStatus syncstatus.StatusService @@ -154,6 +159,10 @@ func (s *space) TreeBuilder() objecttreebuilder.TreeBuilder { return s.treeBuilder } +func (s *space) GetNodePeers(ctx context.Context) (peer []peer.Peer, err error) { + return s.peerManager.GetNodePeers(ctx) +} + func (s *space) Acl() list.AclList { return s.aclList } @@ -173,6 +182,7 @@ func (s *space) Init(ctx context.Context) (err error) { s.settings = s.app.MustComponent(settings.CName).(settings.Settings) s.objectSync = s.app.MustComponent(objectsync.CName).(objectsync.ObjectSync) s.storage = s.app.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage) + s.peerManager = s.app.MustComponent(peermanager.CName).(peermanager.PeerManager) s.aclList = s.app.MustComponent(syncacl.CName).(list.AclList) s.header, err = s.storage.SpaceHeader() return diff --git a/commonspace/spaceutils_test.go b/commonspace/spaceutils_test.go index cc82cecd..b7454b09 100644 --- a/commonspace/spaceutils_test.go +++ b/commonspace/spaceutils_test.go @@ -151,6 +151,10 @@ func (p *mockPeerManager) GetResponsiblePeers(ctx context.Context) (peers []peer return nil, nil } +func (p *mockPeerManager) GetNodePeers(ctx context.Context) (peers []peer.Peer, err error) { + return nil, nil +} + // // Mock PeerManagerProvider //