From 0cac23037cf2ff2906d1c20849d8a6faebda053a Mon Sep 17 00:00:00 2001 From: Mikhail Rakhmanov Date: Tue, 11 Mar 2025 16:20:44 +0100 Subject: [PATCH] Fix snapshot path, update mocks, ignore heads mismatch error --- .../mock_accountservice.go | 1 - acl/mock_acl/mock_acl.go | 1 - .../mock_debugstat/mock_debugstat.go | 1 - app/ldiff/mock_ldiff/mock_ldiff.go | 1 - .../mock_aclclient/mock_aclclient.go | 1 - .../mock_credentialprovider.go | 1 - .../mock_deletionmanager.go | 1 - .../mock_deletionstate/mock_deletionstate.go | 1 - .../mock_headstorage/mock_headstorage.go | 1 - .../headsync/mock_headsync/mock_headsync.go | 1 - .../mock_statestorage/mock_statestorage.go | 1 - .../mock_commonspace/mock_commonspace.go | 1 - .../object/acl/list/mock_list/mock_list.go | 1 - .../acl/syncacl/mock_syncacl/mock_syncacl.go | 1 - .../mock_objecttree/mock_objecttree.go | 6 ++-- .../object/tree/objecttree/objecttree.go | 29 +++++++++++-------- .../object/tree/objecttree/objecttree_test.go | 7 +++-- .../object/tree/objecttree/objecttreedebug.go | 2 +- .../object/tree/objecttree/treemigrator.go | 23 ++------------- .../synctree/mock_synctree/mock_synctree.go | 16 +++++----- .../object/tree/synctree/requestfactory.go | 16 +++++++--- .../response/mock_response/mock_response.go | 6 ++-- .../synctree/response/responseproducer.go | 12 +++++--- .../object/tree/synctree/synchandler.go | 21 ++++++++++---- .../object/tree/synctree/synchandler_test.go | 14 ++++----- commonspace/object/tree/synctree/synctree.go | 5 +++- .../mock_updatelistener.go | 1 - .../mock_treemanager/mock_treemanager.go | 1 - .../mock_treesyncer/mock_treesyncer.go | 1 - .../mock_objectmanager/mock_objectmanager.go | 1 - .../mock_objecttreebuilder.go | 1 - .../mock_peermanager/mock_peermanager.go | 1 - .../mock_settingsstate/mock_settingsstate.go | 1 - .../mock_spacestorage/mock_spacestorage.go | 1 - .../mock_spacesyncproto.go | 1 - .../syncdeps/mock_syncdeps/mock_syncdeps.go | 1 - .../mock_syncstatus/mock_syncstatus.go | 1 - .../mock_consensusclient.go | 1 - .../mock_coordinatorclient.go | 1 - .../mock/mock_nameserviceclient.go | 1 - net/peer/mock_peer/mock_peer.go | 1 - net/pool/mock_pool/mock_pool.go | 1 - net/rpc/limiter/mock_limiter/mock_limiter.go | 1 - .../mock_transport/mock_transport.go | 1 - .../mock_nodeclient/mock_nodeclient.go | 1 - nodeconf/mock_nodeconf/mock_nodeconf.go | 1 - .../mock/mock_paymentserviceclient.go | 1 - .../mock_periodicsync/mock_periodicsync.go | 1 - 48 files changed, 87 insertions(+), 106 deletions(-) diff --git a/accountservice/mock_accountservice/mock_accountservice.go b/accountservice/mock_accountservice/mock_accountservice.go index f3a0e72f..632a9cb7 100644 --- a/accountservice/mock_accountservice/mock_accountservice.go +++ b/accountservice/mock_accountservice/mock_accountservice.go @@ -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 diff --git a/acl/mock_acl/mock_acl.go b/acl/mock_acl/mock_acl.go index 14db24ca..807e66d0 100644 --- a/acl/mock_acl/mock_acl.go +++ b/acl/mock_acl/mock_acl.go @@ -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 diff --git a/app/debugstat/mock_debugstat/mock_debugstat.go b/app/debugstat/mock_debugstat/mock_debugstat.go index f89757ae..12c7701c 100644 --- a/app/debugstat/mock_debugstat/mock_debugstat.go +++ b/app/debugstat/mock_debugstat/mock_debugstat.go @@ -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 diff --git a/app/ldiff/mock_ldiff/mock_ldiff.go b/app/ldiff/mock_ldiff/mock_ldiff.go index a5d2c786..f26cba47 100644 --- a/app/ldiff/mock_ldiff/mock_ldiff.go +++ b/app/ldiff/mock_ldiff/mock_ldiff.go @@ -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 diff --git a/commonspace/acl/aclclient/mock_aclclient/mock_aclclient.go b/commonspace/acl/aclclient/mock_aclclient/mock_aclclient.go index 3994a66d..6cd1b279 100644 --- a/commonspace/acl/aclclient/mock_aclclient/mock_aclclient.go +++ b/commonspace/acl/aclclient/mock_aclclient/mock_aclclient.go @@ -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 diff --git a/commonspace/credentialprovider/mock_credentialprovider/mock_credentialprovider.go b/commonspace/credentialprovider/mock_credentialprovider/mock_credentialprovider.go index 18d2417b..00c3f139 100644 --- a/commonspace/credentialprovider/mock_credentialprovider/mock_credentialprovider.go +++ b/commonspace/credentialprovider/mock_credentialprovider/mock_credentialprovider.go @@ -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 diff --git a/commonspace/deletionmanager/mock_deletionmanager/mock_deletionmanager.go b/commonspace/deletionmanager/mock_deletionmanager/mock_deletionmanager.go index 5033bfd6..a5a4c57e 100644 --- a/commonspace/deletionmanager/mock_deletionmanager/mock_deletionmanager.go +++ b/commonspace/deletionmanager/mock_deletionmanager/mock_deletionmanager.go @@ -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 diff --git a/commonspace/deletionstate/mock_deletionstate/mock_deletionstate.go b/commonspace/deletionstate/mock_deletionstate/mock_deletionstate.go index 38eb81a0..1faf94a7 100644 --- a/commonspace/deletionstate/mock_deletionstate/mock_deletionstate.go +++ b/commonspace/deletionstate/mock_deletionstate/mock_deletionstate.go @@ -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 diff --git a/commonspace/headsync/headstorage/mock_headstorage/mock_headstorage.go b/commonspace/headsync/headstorage/mock_headstorage/mock_headstorage.go index ab1d1b82..71cdec39 100644 --- a/commonspace/headsync/headstorage/mock_headstorage/mock_headstorage.go +++ b/commonspace/headsync/headstorage/mock_headstorage/mock_headstorage.go @@ -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 diff --git a/commonspace/headsync/mock_headsync/mock_headsync.go b/commonspace/headsync/mock_headsync/mock_headsync.go index 5b1d8c81..83d5c812 100644 --- a/commonspace/headsync/mock_headsync/mock_headsync.go +++ b/commonspace/headsync/mock_headsync/mock_headsync.go @@ -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 diff --git a/commonspace/headsync/statestorage/mock_statestorage/mock_statestorage.go b/commonspace/headsync/statestorage/mock_statestorage/mock_statestorage.go index 02d32758..e60dc805 100644 --- a/commonspace/headsync/statestorage/mock_statestorage/mock_statestorage.go +++ b/commonspace/headsync/statestorage/mock_statestorage/mock_statestorage.go @@ -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 diff --git a/commonspace/mock_commonspace/mock_commonspace.go b/commonspace/mock_commonspace/mock_commonspace.go index ba446d9f..4d414ddf 100644 --- a/commonspace/mock_commonspace/mock_commonspace.go +++ b/commonspace/mock_commonspace/mock_commonspace.go @@ -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 diff --git a/commonspace/object/acl/list/mock_list/mock_list.go b/commonspace/object/acl/list/mock_list/mock_list.go index f5c7785d..91365261 100644 --- a/commonspace/object/acl/list/mock_list/mock_list.go +++ b/commonspace/object/acl/list/mock_list/mock_list.go @@ -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 diff --git a/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go b/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go index 9f7a5f24..3a301180 100644 --- a/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go +++ b/commonspace/object/acl/syncacl/mock_syncacl/mock_syncacl.go @@ -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 diff --git a/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go b/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go index e3154e2a..084db88b 100644 --- a/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go +++ b/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go @@ -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. diff --git a/commonspace/object/tree/objecttree/objecttree.go b/commonspace/object/tree/objecttree/objecttree.go index 4eccceef..909cbd0a 100644 --- a/commonspace/object/tree/objecttree/objecttree.go +++ b/commonspace/object/tree/objecttree/objecttree.go @@ -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) diff --git a/commonspace/object/tree/objecttree/objecttree_test.go b/commonspace/object/tree/objecttree/objecttree_test.go index 6fb4f7d8..0357c0d4 100644 --- a/commonspace/object/tree/objecttree/objecttree_test.go +++ b/commonspace/object/tree/objecttree/objecttree_test.go @@ -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) diff --git a/commonspace/object/tree/objecttree/objecttreedebug.go b/commonspace/object/tree/objecttree/objecttreedebug.go index ea59c2e8..117b00f5 100644 --- a/commonspace/object/tree/objecttree/objecttreedebug.go +++ b/commonspace/object/tree/objecttree/objecttreedebug.go @@ -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 } diff --git a/commonspace/object/tree/objecttree/treemigrator.go b/commonspace/object/tree/objecttree/treemigrator.go index ac66532f..d38aef43 100644 --- a/commonspace/object/tree/objecttree/treemigrator.go +++ b/commonspace/object/tree/objecttree/treemigrator.go @@ -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 } diff --git a/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go b/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go index ef132cda..324dc869 100644 --- a/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go +++ b/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go @@ -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. diff --git a/commonspace/object/tree/synctree/requestfactory.go b/commonspace/object/tree/synctree/requestfactory.go index e570c2ab..fa4f3827 100644 --- a/commonspace/object/tree/synctree/requestfactory.go +++ b/commonspace/object/tree/synctree/requestfactory.go @@ -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) { diff --git a/commonspace/object/tree/synctree/response/mock_response/mock_response.go b/commonspace/object/tree/synctree/response/mock_response/mock_response.go index 480e0c25..b5d239a4 100644 --- a/commonspace/object/tree/synctree/response/mock_response/mock_response.go +++ b/commonspace/object/tree/synctree/response/mock_response/mock_response.go @@ -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. diff --git a/commonspace/object/tree/synctree/response/responseproducer.go b/commonspace/object/tree/synctree/response/responseproducer.go index 2e9f6eb1..b3dca714 100644 --- a/commonspace/object/tree/synctree/response/responseproducer.go +++ b/commonspace/object/tree/synctree/response/responseproducer.go @@ -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 } diff --git a/commonspace/object/tree/synctree/synchandler.go b/commonspace/object/tree/synctree/synchandler.go index 5a6a22a2..c33818cc 100644 --- a/commonspace/object/tree/synctree/synchandler.go +++ b/commonspace/object/tree/synctree/synchandler.go @@ -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) + returnReq, err = s.syncClient.CreateFullSyncRequest(rq.PeerId(), s.tree) + if err != nil { + s.tree.Unlock() + return nil, err + } } - resp := producer.EmptyResponse() + 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() } diff --git a/commonspace/object/tree/synctree/synchandler_test.go b/commonspace/object/tree/synctree/synchandler_test.go index 9bdb9606..2c3b7331 100644 --- a/commonspace/object/tree/synctree/synchandler_test.go +++ b/commonspace/object/tree/synctree/synchandler_test.go @@ -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 { diff --git a/commonspace/object/tree/synctree/synctree.go b/commonspace/object/tree/synctree/synctree.go index b8d6dddb..78415eb6 100644 --- a/commonspace/object/tree/synctree/synctree.go +++ b/commonspace/object/tree/synctree/synctree.go @@ -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) } diff --git a/commonspace/object/tree/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go b/commonspace/object/tree/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go index 5e135802..ed385b79 100644 --- a/commonspace/object/tree/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go +++ b/commonspace/object/tree/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go @@ -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 diff --git a/commonspace/object/treemanager/mock_treemanager/mock_treemanager.go b/commonspace/object/treemanager/mock_treemanager/mock_treemanager.go index 7ccf9927..1cfa568c 100644 --- a/commonspace/object/treemanager/mock_treemanager/mock_treemanager.go +++ b/commonspace/object/treemanager/mock_treemanager/mock_treemanager.go @@ -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 diff --git a/commonspace/object/treesyncer/mock_treesyncer/mock_treesyncer.go b/commonspace/object/treesyncer/mock_treesyncer/mock_treesyncer.go index 0f688efd..bdc3bcd1 100644 --- a/commonspace/object/treesyncer/mock_treesyncer/mock_treesyncer.go +++ b/commonspace/object/treesyncer/mock_treesyncer/mock_treesyncer.go @@ -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 diff --git a/commonspace/objectmanager/mock_objectmanager/mock_objectmanager.go b/commonspace/objectmanager/mock_objectmanager/mock_objectmanager.go index 61029d67..5e9dd567 100644 --- a/commonspace/objectmanager/mock_objectmanager/mock_objectmanager.go +++ b/commonspace/objectmanager/mock_objectmanager/mock_objectmanager.go @@ -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 diff --git a/commonspace/objecttreebuilder/mock_objecttreebuilder/mock_objecttreebuilder.go b/commonspace/objecttreebuilder/mock_objecttreebuilder/mock_objecttreebuilder.go index 56bfdd19..7aca0fc9 100644 --- a/commonspace/objecttreebuilder/mock_objecttreebuilder/mock_objecttreebuilder.go +++ b/commonspace/objecttreebuilder/mock_objecttreebuilder/mock_objecttreebuilder.go @@ -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 diff --git a/commonspace/peermanager/mock_peermanager/mock_peermanager.go b/commonspace/peermanager/mock_peermanager/mock_peermanager.go index 23a82698..d924bbab 100644 --- a/commonspace/peermanager/mock_peermanager/mock_peermanager.go +++ b/commonspace/peermanager/mock_peermanager/mock_peermanager.go @@ -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 diff --git a/commonspace/settings/settingsstate/mock_settingsstate/mock_settingsstate.go b/commonspace/settings/settingsstate/mock_settingsstate/mock_settingsstate.go index 925fd320..8f64e354 100644 --- a/commonspace/settings/settingsstate/mock_settingsstate/mock_settingsstate.go +++ b/commonspace/settings/settingsstate/mock_settingsstate/mock_settingsstate.go @@ -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 diff --git a/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go b/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go index b0c9167d..045059c4 100644 --- a/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go +++ b/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go @@ -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 diff --git a/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go b/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go index a65c8c68..edd75aff 100644 --- a/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go +++ b/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go @@ -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 diff --git a/commonspace/sync/syncdeps/mock_syncdeps/mock_syncdeps.go b/commonspace/sync/syncdeps/mock_syncdeps/mock_syncdeps.go index 8bc15c81..50d1cfd9 100644 --- a/commonspace/sync/syncdeps/mock_syncdeps/mock_syncdeps.go +++ b/commonspace/sync/syncdeps/mock_syncdeps/mock_syncdeps.go @@ -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 diff --git a/commonspace/syncstatus/mock_syncstatus/mock_syncstatus.go b/commonspace/syncstatus/mock_syncstatus/mock_syncstatus.go index 622ac41e..ba3b328f 100644 --- a/commonspace/syncstatus/mock_syncstatus/mock_syncstatus.go +++ b/commonspace/syncstatus/mock_syncstatus/mock_syncstatus.go @@ -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 diff --git a/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go b/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go index ff132095..c3bf7a3c 100644 --- a/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go +++ b/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go @@ -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 diff --git a/coordinator/coordinatorclient/mock_coordinatorclient/mock_coordinatorclient.go b/coordinator/coordinatorclient/mock_coordinatorclient/mock_coordinatorclient.go index 83fd8ed8..92166721 100644 --- a/coordinator/coordinatorclient/mock_coordinatorclient/mock_coordinatorclient.go +++ b/coordinator/coordinatorclient/mock_coordinatorclient/mock_coordinatorclient.go @@ -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 diff --git a/nameservice/nameserviceclient/mock/mock_nameserviceclient.go b/nameservice/nameserviceclient/mock/mock_nameserviceclient.go index 82990e01..00f41f3a 100644 --- a/nameservice/nameserviceclient/mock/mock_nameserviceclient.go +++ b/nameservice/nameserviceclient/mock/mock_nameserviceclient.go @@ -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 diff --git a/net/peer/mock_peer/mock_peer.go b/net/peer/mock_peer/mock_peer.go index 96b1aaba..4ace14a8 100644 --- a/net/peer/mock_peer/mock_peer.go +++ b/net/peer/mock_peer/mock_peer.go @@ -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 diff --git a/net/pool/mock_pool/mock_pool.go b/net/pool/mock_pool/mock_pool.go index 6490a959..2a1b8f99 100644 --- a/net/pool/mock_pool/mock_pool.go +++ b/net/pool/mock_pool/mock_pool.go @@ -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 diff --git a/net/rpc/limiter/mock_limiter/mock_limiter.go b/net/rpc/limiter/mock_limiter/mock_limiter.go index 99e2ff8c..78b9cc52 100644 --- a/net/rpc/limiter/mock_limiter/mock_limiter.go +++ b/net/rpc/limiter/mock_limiter/mock_limiter.go @@ -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 diff --git a/net/transport/mock_transport/mock_transport.go b/net/transport/mock_transport/mock_transport.go index d263cd3e..f416394f 100644 --- a/net/transport/mock_transport/mock_transport.go +++ b/net/transport/mock_transport/mock_transport.go @@ -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 diff --git a/node/nodeclient/mock_nodeclient/mock_nodeclient.go b/node/nodeclient/mock_nodeclient/mock_nodeclient.go index dc8dea45..b908059f 100644 --- a/node/nodeclient/mock_nodeclient/mock_nodeclient.go +++ b/node/nodeclient/mock_nodeclient/mock_nodeclient.go @@ -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 diff --git a/nodeconf/mock_nodeconf/mock_nodeconf.go b/nodeconf/mock_nodeconf/mock_nodeconf.go index 6bfdfaa8..2f6b26a4 100644 --- a/nodeconf/mock_nodeconf/mock_nodeconf.go +++ b/nodeconf/mock_nodeconf/mock_nodeconf.go @@ -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 diff --git a/paymentservice/paymentserviceclient/mock/mock_paymentserviceclient.go b/paymentservice/paymentserviceclient/mock/mock_paymentserviceclient.go index 9e97e1f4..2716f81b 100644 --- a/paymentservice/paymentserviceclient/mock/mock_paymentserviceclient.go +++ b/paymentservice/paymentserviceclient/mock/mock_paymentserviceclient.go @@ -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 diff --git a/util/periodicsync/mock_periodicsync/mock_periodicsync.go b/util/periodicsync/mock_periodicsync/mock_periodicsync.go index 78d858b5..4039cda8 100644 --- a/util/periodicsync/mock_periodicsync/mock_periodicsync.go +++ b/util/periodicsync/mock_periodicsync/mock_periodicsync.go @@ -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