mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-07 21:47:02 +09:00
Fix snapshot path, update mocks, ignore heads mismatch error
This commit is contained in:
parent
b88e9e34fa
commit
0cac23037c
48 changed files with 87 additions and 106 deletions
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_accountservice/mock_accountservice.go github.com/anyproto/any-sync/accountservice Service
|
||||
//
|
||||
|
||||
// Package mock_accountservice is a generated GoMock package.
|
||||
package mock_accountservice
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_acl/mock_acl.go github.com/anyproto/any-sync/acl AclService
|
||||
//
|
||||
|
||||
// Package mock_acl is a generated GoMock package.
|
||||
package mock_acl
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_debugstat/mock_debugstat.go github.com/anyproto/any-sync/app/debugstat StatService
|
||||
//
|
||||
|
||||
// Package mock_debugstat is a generated GoMock package.
|
||||
package mock_debugstat
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_ldiff/mock_ldiff.go github.com/anyproto/any-sync/app/ldiff Diff,Remote
|
||||
//
|
||||
|
||||
// Package mock_ldiff is a generated GoMock package.
|
||||
package mock_ldiff
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_aclclient/mock_aclclient.go github.com/anyproto/any-sync/commonspace/acl/aclclient AclJoiningClient,AclSpaceClient
|
||||
//
|
||||
|
||||
// Package mock_aclclient is a generated GoMock package.
|
||||
package mock_aclclient
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_credentialprovider/mock_credentialprovider.go github.com/anyproto/any-sync/commonspace/credentialprovider CredentialProvider
|
||||
//
|
||||
|
||||
// Package mock_credentialprovider is a generated GoMock package.
|
||||
package mock_credentialprovider
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_deletionmanager/mock_deletionmanager.go github.com/anyproto/any-sync/commonspace/deletionmanager DeletionManager,Deleter
|
||||
//
|
||||
|
||||
// Package mock_deletionmanager is a generated GoMock package.
|
||||
package mock_deletionmanager
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_deletionstate/mock_deletionstate.go github.com/anyproto/any-sync/commonspace/deletionstate ObjectDeletionState
|
||||
//
|
||||
|
||||
// Package mock_deletionstate is a generated GoMock package.
|
||||
package mock_deletionstate
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_headstorage/mock_headstorage.go github.com/anyproto/any-sync/commonspace/headsync/headstorage HeadStorage
|
||||
//
|
||||
|
||||
// Package mock_headstorage is a generated GoMock package.
|
||||
package mock_headstorage
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_headsync/mock_headsync.go github.com/anyproto/any-sync/commonspace/headsync DiffSyncer
|
||||
//
|
||||
|
||||
// Package mock_headsync is a generated GoMock package.
|
||||
package mock_headsync
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_statestorage/mock_statestorage.go github.com/anyproto/any-sync/commonspace/headsync/statestorage StateStorage
|
||||
//
|
||||
|
||||
// Package mock_statestorage is a generated GoMock package.
|
||||
package mock_statestorage
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_commonspace/mock_commonspace.go github.com/anyproto/any-sync/commonspace Space
|
||||
//
|
||||
|
||||
// Package mock_commonspace is a generated GoMock package.
|
||||
package mock_commonspace
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_list/mock_list.go github.com/anyproto/any-sync/commonspace/object/acl/list AclList,Storage
|
||||
//
|
||||
|
||||
// Package mock_list is a generated GoMock package.
|
||||
package mock_list
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_syncacl/mock_syncacl.go github.com/anyproto/any-sync/commonspace/object/acl/syncacl SyncClient,SyncAcl
|
||||
//
|
||||
|
||||
// Package mock_syncacl is a generated GoMock package.
|
||||
package mock_syncacl
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_objecttree/mock_objecttree.go github.com/anyproto/any-sync/commonspace/object/tree/objecttree ObjectTree,Storage
|
||||
//
|
||||
|
||||
// Package mock_objecttree is a generated GoMock package.
|
||||
package mock_objecttree
|
||||
|
||||
|
@ -374,11 +373,12 @@ func (mr *MockObjectTreeMockRecorder) SetFlusher(arg0 any) *gomock.Call {
|
|||
}
|
||||
|
||||
// SnapshotPath mocks base method.
|
||||
func (m *MockObjectTree) SnapshotPath() []string {
|
||||
func (m *MockObjectTree) SnapshotPath() ([]string, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "SnapshotPath")
|
||||
ret0, _ := ret[0].([]string)
|
||||
return ret0
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// SnapshotPath indicates an expected call of SnapshotPath.
|
||||
|
|
|
@ -90,7 +90,7 @@ type ReadableObjectTree interface {
|
|||
type ObjectTree interface {
|
||||
ReadableObjectTree
|
||||
|
||||
SnapshotPath() []string
|
||||
SnapshotPath() ([]string, error)
|
||||
ChangesAfterCommonSnapshotLoader(snapshotPath, heads []string) (LoadIterator, error)
|
||||
|
||||
Storage() Storage
|
||||
|
@ -144,7 +144,10 @@ func (ot *objectTree) rebuildFromStorage(theirHeads, theirSnapshotPath []string,
|
|||
)
|
||||
if theirHeads != nil {
|
||||
// TODO: add error handling
|
||||
ourPath = ot.SnapshotPath()
|
||||
ourPath, err = ot.SnapshotPath()
|
||||
if err != nil {
|
||||
return fmt.Errorf("rebuild from storage: %w", err)
|
||||
}
|
||||
}
|
||||
ot.tree, err = ot.treeBuilder.Build(treeBuilderOpts{
|
||||
theirHeads: theirHeads,
|
||||
|
@ -748,13 +751,12 @@ func (ot *objectTree) Delete() error {
|
|||
return ot.storage.Delete(context.Background())
|
||||
}
|
||||
|
||||
func (ot *objectTree) SnapshotPath() []string {
|
||||
func (ot *objectTree) SnapshotPath() ([]string, error) {
|
||||
if ot.isDeleted {
|
||||
return nil
|
||||
return nil, ErrDeleted
|
||||
}
|
||||
// TODO: Add error as return parameter
|
||||
if ot.snapshotPathIsActual() {
|
||||
return ot.snapshotPath
|
||||
return ot.snapshotPath, nil
|
||||
}
|
||||
|
||||
var path []string
|
||||
|
@ -763,14 +765,13 @@ func (ot *objectTree) SnapshotPath() []string {
|
|||
for currentSnapshotId != "" {
|
||||
sn, err := ot.storage.Get(context.Background(), currentSnapshotId)
|
||||
if err != nil {
|
||||
// TODO: add error handling
|
||||
panic(fmt.Sprintf("failed to get snapshot %s: %v", currentSnapshotId, err))
|
||||
return nil, fmt.Errorf("failed to get snapshot %s: %w", currentSnapshotId, err)
|
||||
}
|
||||
path = append(path, currentSnapshotId)
|
||||
currentSnapshotId = sn.SnapshotId
|
||||
}
|
||||
ot.snapshotPath = path
|
||||
return path
|
||||
return path, nil
|
||||
}
|
||||
|
||||
func (ot *objectTree) ChangesAfterCommonSnapshotLoader(theirPath, theirHeads []string) (LoadIterator, error) {
|
||||
|
@ -779,12 +780,16 @@ func (ot *objectTree) ChangesAfterCommonSnapshotLoader(theirPath, theirHeads []s
|
|||
}
|
||||
var (
|
||||
needFullDocument = len(theirPath) == 0
|
||||
ourPath = ot.SnapshotPath()
|
||||
ourPath []string
|
||||
// by default returning everything we have from start
|
||||
commonSnapshot = ourPath[len(ourPath)-1]
|
||||
commonSnapshot string
|
||||
err error
|
||||
)
|
||||
|
||||
ourPath, err = ot.SnapshotPath()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get snapshot path: %w", err)
|
||||
}
|
||||
commonSnapshot = ourPath[len(ourPath)-1]
|
||||
// if this is non-empty request
|
||||
if !needFullDocument {
|
||||
commonSnapshot, err = commonSnapshotForTwoPaths(ourPath, theirPath)
|
||||
|
|
|
@ -1075,7 +1075,8 @@ func TestObjectTree(t *testing.T) {
|
|||
_, err := objTree.AddRawChanges(context.Background(), payload)
|
||||
require.NoError(t, err, "adding changes should be without error")
|
||||
|
||||
snapshotPath := objTree.SnapshotPath()
|
||||
snapshotPath, err := objTree.SnapshotPath()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, []string{"3", "0"}, snapshotPath)
|
||||
|
||||
assert.Equal(t, true, objTree.(*objectTree).snapshotPathIsActual())
|
||||
|
@ -1857,7 +1858,9 @@ func TestObjectTree(t *testing.T) {
|
|||
RawChanges: result.changes,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
iter, err := objTree.ChangesAfterCommonSnapshotLoader(otherTree.SnapshotPath(), otherTree.Heads())
|
||||
snPath, err := otherTree.SnapshotPath()
|
||||
require.NoError(t, err)
|
||||
iter, err := objTree.ChangesAfterCommonSnapshotLoader(snPath, otherTree.Heads())
|
||||
require.NoError(t, err)
|
||||
for {
|
||||
batch, err := iter.NextBatch(400)
|
||||
|
|
|
@ -20,6 +20,6 @@ func (o objectTreeDebug) debugInfo(ot *objectTree, parser DescriptionParser) (di
|
|||
di.TreeString = ot.tree.String()
|
||||
di.TreeLen = ot.tree.Len()
|
||||
di.Heads = ot.Heads()
|
||||
di.SnapshotPath = ot.SnapshotPath()
|
||||
di.SnapshotPath, _ = ot.SnapshotPath()
|
||||
return
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@ import (
|
|||
"fmt"
|
||||
|
||||
anystore "github.com/anyproto/any-store"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"github.com/anyproto/any-sync/commonspace/headsync/headstorage"
|
||||
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
||||
|
@ -55,10 +54,6 @@ func NewTreeMigrator(keyStorage crypto.KeyStorage, aclList list.AclList) *TreeMi
|
|||
}
|
||||
|
||||
func (tm *TreeMigrator) MigrateTreeStorage(ctx context.Context, storage treeStorage, headStorage headstorage.HeadStorage, store anystore.DB) error {
|
||||
var (
|
||||
usedDfs bool
|
||||
loadFailed bool
|
||||
)
|
||||
rootChange, err := storage.Root()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -78,8 +73,7 @@ func (tm *TreeMigrator) MigrateTreeStorage(ctx context.Context, storage treeStor
|
|||
return fmt.Errorf("migration: failed to get all changes: %w", err)
|
||||
}
|
||||
} else {
|
||||
usedDfs = true
|
||||
loadFailed = tm.dfs(ctx, heads, rootChange.Id)
|
||||
tm.dfs(ctx, heads, rootChange.Id)
|
||||
}
|
||||
newStorage, err := CreateStorage(ctx, rootChange, headStorage, store)
|
||||
if err != nil && !errors.Is(err, treestorage.ErrTreeExists) {
|
||||
|
@ -107,20 +101,7 @@ func (tm *TreeMigrator) MigrateTreeStorage(ctx context.Context, storage treeStor
|
|||
return fmt.Errorf("migration: failed to add raw changes: %w", err)
|
||||
}
|
||||
if !slice.UnsortedEquals(res.Heads, heads) {
|
||||
returnErr := fmt.Errorf("migration: heads mismatch: %v, %v != %v", rootChange.Id, res.Heads, heads)
|
||||
if loadFailed {
|
||||
log.Error("tree is corrupted", zap.String("id", storage.Id()), zap.Error(returnErr))
|
||||
return nil
|
||||
}
|
||||
if usedDfs {
|
||||
return returnErr
|
||||
}
|
||||
tm.allChanges = nil
|
||||
if tm.dfs(ctx, heads, rootChange.Id) {
|
||||
log.Error("tree is corrupted", zap.String("id", storage.Id()), zap.Error(returnErr))
|
||||
return nil
|
||||
}
|
||||
return returnErr
|
||||
log.Errorf("migration: heads mismatch: %v, %v != %v", rootChange.Id, res.Heads, heads)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_synctree/mock_synctree.go github.com/anyproto/any-sync/commonspace/object/tree/synctree SyncTree,HeadNotifiable,SyncClient,RequestFactory
|
||||
//
|
||||
|
||||
// Package mock_synctree is a generated GoMock package.
|
||||
package mock_synctree
|
||||
|
||||
|
@ -467,11 +466,12 @@ func (mr *MockSyncTreeMockRecorder) SetListener(arg0 any) *gomock.Call {
|
|||
}
|
||||
|
||||
// SnapshotPath mocks base method.
|
||||
func (m *MockSyncTree) SnapshotPath() []string {
|
||||
func (m *MockSyncTree) SnapshotPath() ([]string, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "SnapshotPath")
|
||||
ret0, _ := ret[0].([]string)
|
||||
return ret0
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// SnapshotPath indicates an expected call of SnapshotPath.
|
||||
|
@ -651,11 +651,12 @@ func (mr *MockSyncClientMockRecorder) Broadcast(arg0, arg1 any) *gomock.Call {
|
|||
}
|
||||
|
||||
// CreateFullSyncRequest mocks base method.
|
||||
func (m *MockSyncClient) CreateFullSyncRequest(arg0 string, arg1 objecttree.ObjectTree) *objectmessages.Request {
|
||||
func (m *MockSyncClient) CreateFullSyncRequest(arg0 string, arg1 objecttree.ObjectTree) (*objectmessages.Request, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1)
|
||||
ret0, _ := ret[0].(*objectmessages.Request)
|
||||
return ret0
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// CreateFullSyncRequest indicates an expected call of CreateFullSyncRequest.
|
||||
|
@ -760,11 +761,12 @@ func (m *MockRequestFactory) EXPECT() *MockRequestFactoryMockRecorder {
|
|||
}
|
||||
|
||||
// CreateFullSyncRequest mocks base method.
|
||||
func (m *MockRequestFactory) CreateFullSyncRequest(arg0 string, arg1 objecttree.ObjectTree) *objectmessages.Request {
|
||||
func (m *MockRequestFactory) CreateFullSyncRequest(arg0 string, arg1 objecttree.ObjectTree) (*objectmessages.Request, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1)
|
||||
ret0, _ := ret[0].(*objectmessages.Request)
|
||||
return ret0
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// CreateFullSyncRequest indicates an expected call of CreateFullSyncRequest.
|
||||
|
|
|
@ -12,7 +12,7 @@ const batchSize = 1024 * 1024
|
|||
type RequestFactory interface {
|
||||
CreateHeadUpdate(t objecttree.ObjectTree, ignoredPeer string, added []*treechangeproto.RawTreeChangeWithId) (headUpdate *objectmessages.HeadUpdate, err error)
|
||||
CreateNewTreeRequest(peerId, objectId string) *objectmessages.Request
|
||||
CreateFullSyncRequest(peerId string, t objecttree.ObjectTree) *objectmessages.Request
|
||||
CreateFullSyncRequest(peerId string, t objecttree.ObjectTree) (*objectmessages.Request, error)
|
||||
CreateResponseProducer(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (response.ResponseProducer, error)
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,10 @@ func (r *requestFactory) CreateHeadUpdate(t objecttree.ObjectTree, ignoredPeer s
|
|||
if ignoredPeer != "" {
|
||||
broadcastOpts.EmptyPeers = []string{ignoredPeer}
|
||||
}
|
||||
snapshotPath, err := t.SnapshotPath()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
headUpdate = &objectmessages.HeadUpdate{
|
||||
Meta: objectmessages.ObjectMeta{
|
||||
ObjectId: t.Id(),
|
||||
|
@ -38,7 +42,7 @@ func (r *requestFactory) CreateHeadUpdate(t objecttree.ObjectTree, ignoredPeer s
|
|||
opts: broadcastOpts,
|
||||
heads: t.Heads(),
|
||||
changes: added,
|
||||
snapshotPath: t.SnapshotPath(),
|
||||
snapshotPath: snapshotPath,
|
||||
root: t.Header(),
|
||||
},
|
||||
}
|
||||
|
@ -50,8 +54,12 @@ func (r *requestFactory) CreateNewTreeRequest(peerId, objectId string) *objectme
|
|||
return NewRequest(peerId, r.spaceId, objectId, nil, nil, nil)
|
||||
}
|
||||
|
||||
func (r *requestFactory) CreateFullSyncRequest(peerId string, t objecttree.ObjectTree) *objectmessages.Request {
|
||||
return NewRequest(peerId, r.spaceId, t.Id(), t.Heads(), t.SnapshotPath(), t.Header())
|
||||
func (r *requestFactory) CreateFullSyncRequest(peerId string, t objecttree.ObjectTree) (*objectmessages.Request, error) {
|
||||
path, err := t.SnapshotPath()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return NewRequest(peerId, r.spaceId, t.Id(), t.Heads(), path, t.Header()), nil
|
||||
}
|
||||
|
||||
func (r *requestFactory) CreateResponseProducer(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (response.ResponseProducer, error) {
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_response/mock_response.go github.com/anyproto/any-sync/commonspace/object/tree/synctree/response ResponseProducer
|
||||
//
|
||||
|
||||
// Package mock_response is a generated GoMock package.
|
||||
package mock_response
|
||||
|
||||
|
@ -40,11 +39,12 @@ func (m *MockResponseProducer) EXPECT() *MockResponseProducerMockRecorder {
|
|||
}
|
||||
|
||||
// EmptyResponse mocks base method.
|
||||
func (m *MockResponseProducer) EmptyResponse() *response.Response {
|
||||
func (m *MockResponseProducer) EmptyResponse() (*response.Response, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "EmptyResponse")
|
||||
ret0, _ := ret[0].(*response.Response)
|
||||
return ret0
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// EmptyResponse indicates an expected call of EmptyResponse.
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
|
||||
type ResponseProducer interface {
|
||||
NewResponse(batchSize int) (*Response, error)
|
||||
EmptyResponse() *Response
|
||||
EmptyResponse() (*Response, error)
|
||||
}
|
||||
|
||||
type responseProducer struct {
|
||||
|
@ -45,14 +45,18 @@ func (r *responseProducer) NewResponse(batchSize int) (*Response, error) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
func (r *responseProducer) EmptyResponse() *Response {
|
||||
func (r *responseProducer) EmptyResponse() (*Response, error) {
|
||||
headsCopy := make([]string, len(r.tree.Heads()))
|
||||
copy(headsCopy, r.tree.Heads())
|
||||
snapshotPath, err := r.tree.SnapshotPath()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Response{
|
||||
Heads: headsCopy,
|
||||
SpaceId: r.spaceId,
|
||||
ObjectId: r.objectId,
|
||||
Root: r.tree.Header(),
|
||||
SnapshotPath: r.tree.SnapshotPath(),
|
||||
}
|
||||
SnapshotPath: snapshotPath,
|
||||
}, nil
|
||||
}
|
||||
|
|
|
@ -73,7 +73,7 @@ func (s *syncHandler) HandleHeadUpdate(ctx context.Context, statusUpdater syncst
|
|||
return nil, nil
|
||||
}
|
||||
statusUpdater.HeadsApply(peerId, update.ObjectId(), contentUpdate.Heads, false)
|
||||
return s.syncClient.CreateFullSyncRequest(peerId, s.tree), nil
|
||||
return s.syncClient.CreateFullSyncRequest(peerId, s.tree)
|
||||
}
|
||||
rawChangesPayload := objecttree.RawChangesPayload{
|
||||
NewHeads: contentUpdate.Heads,
|
||||
|
@ -85,7 +85,7 @@ func (s *syncHandler) HandleHeadUpdate(ctx context.Context, statusUpdater syncst
|
|||
return nil, err
|
||||
}
|
||||
if !slice.UnsortedEquals(res.Heads, contentUpdate.Heads) {
|
||||
return s.syncClient.CreateFullSyncRequest(peerId, s.tree), nil
|
||||
return s.syncClient.CreateFullSyncRequest(peerId, s.tree)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
@ -119,10 +119,17 @@ func (s *syncHandler) HandleStreamRequest(ctx context.Context, rq syncdeps.Reque
|
|||
var returnReq syncdeps.Request
|
||||
if slice.UnsortedEquals(curHeads, request.Heads) || slice.ContainsSorted(request.Heads, curHeads) {
|
||||
if len(curHeads) != len(request.Heads) {
|
||||
returnReq = s.syncClient.CreateFullSyncRequest(rq.PeerId(), s.tree)
|
||||
}
|
||||
resp := producer.EmptyResponse()
|
||||
returnReq, err = s.syncClient.CreateFullSyncRequest(rq.PeerId(), s.tree)
|
||||
if err != nil {
|
||||
s.tree.Unlock()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
resp, err := producer.EmptyResponse()
|
||||
s.tree.Unlock()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
protoResp, err := resp.ProtoMessage()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -130,7 +137,11 @@ func (s *syncHandler) HandleStreamRequest(ctx context.Context, rq syncdeps.Reque
|
|||
return returnReq, send(protoResp)
|
||||
} else {
|
||||
if len(request.Heads) != 0 {
|
||||
returnReq = s.syncClient.CreateFullSyncRequest(rq.PeerId(), s.tree)
|
||||
returnReq, err = s.syncClient.CreateFullSyncRequest(rq.PeerId(), s.tree)
|
||||
if err != nil {
|
||||
s.tree.Unlock()
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
s.tree.Unlock()
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ func TestSyncHandler_HeadUpdate(t *testing.T) {
|
|||
returnReq := &objectmessages.Request{
|
||||
Bytes: []byte("abcd"),
|
||||
}
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq)
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq, nil)
|
||||
req, err := fx.syncHandler.HandleHeadUpdate(ctx, fx.syncStatus, headUpdate)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, returnReq, req)
|
||||
|
@ -174,7 +174,7 @@ func TestSyncHandler_HeadUpdate(t *testing.T) {
|
|||
returnReq := &objectmessages.Request{
|
||||
Bytes: []byte("abcd"),
|
||||
}
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq)
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq, nil)
|
||||
req, err := fx.syncHandler.HandleHeadUpdate(ctx, fx.syncStatus, headUpdate)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, returnReq, req)
|
||||
|
@ -205,7 +205,7 @@ func TestSyncHandler_HandleStreamRequest(t *testing.T) {
|
|||
returnReq := &objectmessages.Request{
|
||||
Bytes: []byte("abcde"),
|
||||
}
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq)
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq, nil)
|
||||
fx.tree.EXPECT().Heads().Return([]string{"curHead"})
|
||||
resp := &response.Response{
|
||||
Heads: heads,
|
||||
|
@ -287,8 +287,8 @@ func TestSyncHandler_HandleStreamRequest(t *testing.T) {
|
|||
returnReq := &objectmessages.Request{
|
||||
Bytes: []byte("abcde"),
|
||||
}
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq)
|
||||
producer.EXPECT().EmptyResponse().Return(resp)
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq, nil)
|
||||
producer.EXPECT().EmptyResponse().Return(resp, nil)
|
||||
ctx = peer.CtxWithPeerId(ctx, "peerId")
|
||||
callCount := 0
|
||||
req, err := fx.syncHandler.HandleStreamRequest(ctx, request, testUpdater{}, func(resp proto.Message) error {
|
||||
|
@ -322,8 +322,8 @@ func TestSyncHandler_HandleStreamRequest(t *testing.T) {
|
|||
returnReq := &objectmessages.Request{
|
||||
Bytes: []byte("abcde"),
|
||||
}
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq)
|
||||
producer.EXPECT().EmptyResponse().Return(resp)
|
||||
fx.client.EXPECT().CreateFullSyncRequest("peerId", fx.tree).Return(returnReq, nil)
|
||||
producer.EXPECT().EmptyResponse().Return(resp, nil)
|
||||
ctx = peer.CtxWithPeerId(ctx, "peerId")
|
||||
callCount := 0
|
||||
req, err := fx.syncHandler.HandleStreamRequest(ctx, request, testUpdater{}, func(resp proto.Message) error {
|
||||
|
|
|
@ -311,7 +311,10 @@ func (s *syncTree) checkAlive() (err error) {
|
|||
func (s *syncTree) SyncWithPeer(ctx context.Context, p peer.Peer) (err error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
req := s.syncClient.CreateFullSyncRequest(p.Id(), s)
|
||||
req, err := s.syncClient.CreateFullSyncRequest(p.Id(), s)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return s.syncClient.QueueRequest(ctx, req)
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_updatelistener/mock_updatelistener.go github.com/anyproto/any-sync/commonspace/object/tree/synctree/updatelistener UpdateListener
|
||||
//
|
||||
|
||||
// Package mock_updatelistener is a generated GoMock package.
|
||||
package mock_updatelistener
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_treemanager/mock_treemanager.go github.com/anyproto/any-sync/commonspace/object/treemanager TreeManager
|
||||
//
|
||||
|
||||
// Package mock_treemanager is a generated GoMock package.
|
||||
package mock_treemanager
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_treesyncer/mock_treesyncer.go github.com/anyproto/any-sync/commonspace/object/treesyncer TreeSyncer
|
||||
//
|
||||
|
||||
// Package mock_treesyncer is a generated GoMock package.
|
||||
package mock_treesyncer
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_objectmanager/mock_objectmanager.go github.com/anyproto/any-sync/commonspace/objectmanager ObjectManager
|
||||
//
|
||||
|
||||
// Package mock_objectmanager is a generated GoMock package.
|
||||
package mock_objectmanager
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_objecttreebuilder/mock_objecttreebuilder.go github.com/anyproto/any-sync/commonspace/objecttreebuilder TreeBuilder
|
||||
//
|
||||
|
||||
// Package mock_objecttreebuilder is a generated GoMock package.
|
||||
package mock_objecttreebuilder
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_peermanager/mock_peermanager.go github.com/anyproto/any-sync/commonspace/peermanager PeerManager
|
||||
//
|
||||
|
||||
// Package mock_peermanager is a generated GoMock package.
|
||||
package mock_peermanager
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_settingsstate/mock_settingsstate.go github.com/anyproto/any-sync/commonspace/settings/settingsstate StateBuilder,ChangeFactory
|
||||
//
|
||||
|
||||
// Package mock_settingsstate is a generated GoMock package.
|
||||
package mock_settingsstate
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_spacestorage/mock_spacestorage.go github.com/anyproto/any-sync/commonspace/spacestorage SpaceStorage
|
||||
//
|
||||
|
||||
// Package mock_spacestorage is a generated GoMock package.
|
||||
package mock_spacestorage
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_spacesyncproto/mock_spacesyncproto.go github.com/anyproto/any-sync/commonspace/spacesyncproto DRPCSpaceSyncClient
|
||||
//
|
||||
|
||||
// Package mock_spacesyncproto is a generated GoMock package.
|
||||
package mock_spacesyncproto
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_syncdeps/mock_syncdeps.go github.com/anyproto/any-sync/commonspace/sync/syncdeps ObjectSyncHandler,RequestSender,ResponseCollector
|
||||
//
|
||||
|
||||
// Package mock_syncdeps is a generated GoMock package.
|
||||
package mock_syncdeps
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_syncstatus/mock_syncstatus.go github.com/anyproto/any-sync/commonspace/syncstatus StatusUpdater
|
||||
//
|
||||
|
||||
// Package mock_syncstatus is a generated GoMock package.
|
||||
package mock_syncstatus
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_consensusclient/mock_consensusclient.go github.com/anyproto/any-sync/consensus/consensusclient Service
|
||||
//
|
||||
|
||||
// Package mock_consensusclient is a generated GoMock package.
|
||||
package mock_consensusclient
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_coordinatorclient/mock_coordinatorclient.go github.com/anyproto/any-sync/coordinator/coordinatorclient CoordinatorClient
|
||||
//
|
||||
|
||||
// Package mock_coordinatorclient is a generated GoMock package.
|
||||
package mock_coordinatorclient
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination=mock/mock_nameserviceclient.go -package=mock_nameserviceclient github.com/anyproto/any-sync/nameservice/nameserviceclient AnyNsClientService
|
||||
//
|
||||
|
||||
// Package mock_nameserviceclient is a generated GoMock package.
|
||||
package mock_nameserviceclient
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_peer/mock_peer.go github.com/anyproto/any-sync/net/peer Peer
|
||||
//
|
||||
|
||||
// Package mock_peer is a generated GoMock package.
|
||||
package mock_peer
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_pool/mock_pool.go github.com/anyproto/any-sync/net/pool Pool,Service
|
||||
//
|
||||
|
||||
// Package mock_pool is a generated GoMock package.
|
||||
package mock_pool
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_limiter/mock_limiter.go github.com/anyproto/any-sync/net/rpc/limiter RpcLimiter
|
||||
//
|
||||
|
||||
// Package mock_limiter is a generated GoMock package.
|
||||
package mock_limiter
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_transport/mock_transport.go github.com/anyproto/any-sync/net/transport Transport,MultiConn
|
||||
//
|
||||
|
||||
// Package mock_transport is a generated GoMock package.
|
||||
package mock_transport
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_nodeclient/mock_nodeclient.go github.com/anyproto/any-sync/node/nodeclient NodeClient
|
||||
//
|
||||
|
||||
// Package mock_nodeclient is a generated GoMock package.
|
||||
package mock_nodeclient
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anyproto/any-sync/nodeconf Service
|
||||
//
|
||||
|
||||
// Package mock_nodeconf is a generated GoMock package.
|
||||
package mock_nodeconf
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination=mock/mock_paymentserviceclient.go -package=mock_paymentserviceclient github.com/anyproto/any-sync/paymentservice/paymentserviceclient AnyPpClientService
|
||||
//
|
||||
|
||||
// Package mock_paymentserviceclient is a generated GoMock package.
|
||||
package mock_paymentserviceclient
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
//
|
||||
// mockgen -destination mock_periodicsync/mock_periodicsync.go github.com/anyproto/any-sync/util/periodicsync PeriodicSync
|
||||
//
|
||||
|
||||
// Package mock_periodicsync is a generated GoMock package.
|
||||
package mock_periodicsync
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue