From 086b99ede2c2fab3fe3f947fef3d9dc7eb1f38d3 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 3 Feb 2023 14:49:05 +0100 Subject: [PATCH] Switch peers when getting tree --- commonspace/object/tree/synctree/synctree.go | 31 ++++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/commonspace/object/tree/synctree/synctree.go b/commonspace/object/tree/synctree/synctree.go index 0ac3e2a8..12fb0dc1 100644 --- a/commonspace/object/tree/synctree/synctree.go +++ b/commonspace/object/tree/synctree/synctree.go @@ -74,9 +74,10 @@ type BuildDeps struct { } func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t SyncTree, err error) { - getPeer := func(ctx context.Context) (peerId string, err error) { - peerId, err = peer.CtxPeerId(ctx) + getPeers := func(ctx context.Context) (peerIds []string, err error) { + peerId, err := peer.CtxPeerId(ctx) if err == nil { + peerIds = []string{peerId} return } err = nil @@ -89,17 +90,13 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t err = fmt.Errorf("no responsible peers") return } - // TODO: maybe we can check different peers here - peerId = respPeers[0].Id() + for _, p := range respPeers { + peerIds = append(peerIds, p.Id()) + } return } - getTreeRemote := func() (msg *treechangeproto.TreeSyncMessage, err error) { - peerId, err := getPeer(ctx) - if err != nil { - return - } - + getTreeRemote := func(peerId string) (msg *treechangeproto.TreeSyncMessage, err error) { newTreeRequest := GetRequestFactory().CreateNewTreeRequest() objMsg, err := marshallTreeMessage(newTreeRequest, deps.SpaceId, id, "") if err != nil { @@ -117,14 +114,22 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t } waitTree := func(wait bool) (msg *treechangeproto.TreeSyncMessage, err error) { - if !wait { - return getTreeRemote() + availablePeers, err := getPeers(ctx) + if err != nil { + return } + + if !wait { + return getTreeRemote(availablePeers[0]) + } + peerIdx := 0 for { - msg, err = getTreeRemote() + peerIdx = peerIdx % len(availablePeers) + msg, err = getTreeRemote(availablePeers[peerIdx]) if err == nil { return } + peerIdx++ select { case <-ctx.Done(): err = fmt.Errorf("waiting for object %s interrupted, context closed", id)