From 3cbecca696b17183fd33505afd16c0a72bc4574a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 13 Jan 2023 11:42:44 +0100 Subject: [PATCH] Update any-sync to wait sync for docs --- .../mock_objecttree/mock_objecttree.go | 8 ++-- .../synctree/mock_synctree/mock_synctree.go | 8 ++-- commonspace/object/tree/synctree/synctree.go | 42 ++++++++++++++----- commonspace/space.go | 33 +++++++++------ 4 files changed, 60 insertions(+), 31 deletions(-) diff --git a/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go b/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go index 0af84819..6e743ba5 100644 --- a/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go +++ b/commonspace/object/tree/objecttree/mock_objecttree/mock_objecttree.go @@ -97,18 +97,18 @@ func (mr *MockObjectTreeMockRecorder) Close() *gomock.Call { } // DebugDump mocks base method. -func (m *MockObjectTree) DebugDump() (string, error) { +func (m *MockObjectTree) DebugDump(arg0 objecttree.DescriptionParser) (string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DebugDump") + ret := m.ctrl.Call(m, "DebugDump", arg0) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } // DebugDump indicates an expected call of DebugDump. -func (mr *MockObjectTreeMockRecorder) DebugDump() *gomock.Call { +func (mr *MockObjectTreeMockRecorder) DebugDump(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugDump", reflect.TypeOf((*MockObjectTree)(nil).DebugDump)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugDump", reflect.TypeOf((*MockObjectTree)(nil).DebugDump), arg0) } // Delete mocks base method. diff --git a/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go b/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go index 61c3cfb7..1ca1e659 100644 --- a/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go +++ b/commonspace/object/tree/synctree/mock_synctree/mock_synctree.go @@ -221,18 +221,18 @@ func (mr *MockSyncTreeMockRecorder) Close() *gomock.Call { } // DebugDump mocks base method. -func (m *MockSyncTree) DebugDump() (string, error) { +func (m *MockSyncTree) DebugDump(arg0 objecttree.DescriptionParser) (string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DebugDump") + ret := m.ctrl.Call(m, "DebugDump", arg0) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } // DebugDump indicates an expected call of DebugDump. -func (mr *MockSyncTreeMockRecorder) DebugDump() *gomock.Call { +func (mr *MockSyncTreeMockRecorder) DebugDump(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugDump", reflect.TypeOf((*MockSyncTree)(nil).DebugDump)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugDump", reflect.TypeOf((*MockSyncTree)(nil).DebugDump), arg0) } // Delete mocks base method. diff --git a/commonspace/object/tree/synctree/synctree.go b/commonspace/object/tree/synctree/synctree.go index 8279cb93..4aae1bf7 100644 --- a/commonspace/object/tree/synctree/synctree.go +++ b/commonspace/object/tree/synctree/synctree.go @@ -55,16 +55,17 @@ var buildObjectTree = objecttree.BuildObjectTree var createSyncClient = newWrappedSyncClient type BuildDeps struct { - SpaceId string - ObjectSync objectsync.ObjectSync - Configuration nodeconf.Configuration - HeadNotifiable HeadNotifiable - Listener updatelistener.UpdateListener - AclList list.AclList - SpaceStorage spacestorage.SpaceStorage - TreeStorage treestorage.TreeStorage - TreeUsage *atomic.Int32 - SyncStatus syncstatus.StatusUpdater + SpaceId string + ObjectSync objectsync.ObjectSync + Configuration nodeconf.Configuration + HeadNotifiable HeadNotifiable + Listener updatelistener.UpdateListener + AclList list.AclList + SpaceStorage spacestorage.SpaceStorage + TreeStorage treestorage.TreeStorage + TreeUsage *atomic.Int32 + SyncStatus syncstatus.StatusUpdater + WaitTreeRemoteSync bool } func newWrappedSyncClient( @@ -104,6 +105,25 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t return } + waitTree := func(wait bool) (msg *treechangeproto.TreeSyncMessage, err error) { + if !wait { + return getTreeRemote() + } + for { + msg, err = getTreeRemote() + if err == nil { + return + } + select { + case <-ctx.Done(): + err = fmt.Errorf("waiting for object %s interrupted, context closed", id) + return + default: + break + } + } + } + deps.TreeStorage, err = deps.SpaceStorage.TreeStorage(id) if err == nil { return buildSyncTree(ctx, false, deps) @@ -122,7 +142,7 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t return } - resp, err := getTreeRemote() + resp, err := waitTree(deps.WaitTreeRemoteSync) if err != nil { return } diff --git a/commonspace/space.go b/commonspace/space.go index fa33a9ea..a52f4d82 100644 --- a/commonspace/space.go +++ b/commonspace/space.go @@ -84,7 +84,7 @@ type Space interface { DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) - BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error) + BuildTree(ctx context.Context, id string, opts BuildTreeOpts) (t objecttree.ObjectTree, err error) DeleteTree(ctx context.Context, id string) (err error) SyncStatus() syncstatus.StatusUpdater @@ -176,7 +176,10 @@ func (s *space) Init(ctx context.Context) (err error) { deletionState := deletionstate.NewDeletionState(s.storage) deps := settings.Deps{ BuildFunc: func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) { - res, err := s.BuildTree(ctx, id, listener) + res, err := s.BuildTree(ctx, id, BuildTreeOpts{ + Listener: listener, + WaitTreeRemoteSync: false, + }) if err != nil { return } @@ -289,22 +292,28 @@ func (s *space) PutTree(ctx context.Context, payload treestorage.TreeStorageCrea return } -func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) { +type BuildTreeOpts struct { + Listener updatelistener.UpdateListener + WaitTreeRemoteSync bool +} + +func (s *space) BuildTree(ctx context.Context, id string, opts BuildTreeOpts) (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, + SpaceId: s.id, + ObjectSync: s.objectSync, + Configuration: s.configuration, + HeadNotifiable: s.headSync, + Listener: opts.Listener, + AclList: s.aclList, + SpaceStorage: s.storage, + TreeUsage: &s.treesUsed, + SyncStatus: s.syncStatus, + WaitTreeRemoteSync: opts.WaitTreeRemoteSync, } return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps) }