From 060c6d12316e63060f73179218ca1ecca860a614 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Jun 2023 18:14:13 +0200 Subject: [PATCH] Retry fail on treechangeproto.ErrGetTree --- .../object/tree/synctree/treeremotegetter.go | 15 +++++---------- .../object/tree/synctree/treeremotegetter_test.go | 12 ++++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/commonspace/object/tree/synctree/treeremotegetter.go b/commonspace/object/tree/synctree/treeremotegetter.go index cbc2b0ad..2c1476ae 100644 --- a/commonspace/object/tree/synctree/treeremotegetter.go +++ b/commonspace/object/tree/synctree/treeremotegetter.go @@ -78,7 +78,9 @@ func (t treeRemoteGetter) treeRequestLoop(ctx context.Context, retryTimeout time } else { peerIdx = peerIdx % len(availablePeers) msg, err = t.treeRequest(ctx, availablePeers[peerIdx]) - if err == nil || retryTimeout == 0 { + // if no error or it doesn't make sense to retry + err = rpcerr.Unwrap(err) + if err == nil || err == treechangeproto.ErrGetTree || retryTimeout == 0 { return msg, err } peerIdx++ @@ -115,18 +117,11 @@ func (t treeRemoteGetter) getTree(ctx context.Context) (treeStorage treestorage. if err != nil { return } - switch { - case resp.GetContent().GetErrorResponse() != nil: - errResp := resp.GetContent().GetErrorResponse() - err = rpcerr.Err(errResp.ErrCode) - return - case resp.GetContent().GetFullSyncResponse() == nil: + fullSyncResp := resp.GetContent().GetFullSyncResponse() + if fullSyncResp == nil { err = treechangeproto.ErrUnexpected return - default: - break } - fullSyncResp := resp.GetContent().GetFullSyncResponse() payload := treestorage.TreeStorageCreatePayload{ RootRawChange: resp.RootChange, diff --git a/commonspace/object/tree/synctree/treeremotegetter_test.go b/commonspace/object/tree/synctree/treeremotegetter_test.go index 1594f491..6b719e93 100644 --- a/commonspace/object/tree/synctree/treeremotegetter_test.go +++ b/commonspace/object/tree/synctree/treeremotegetter_test.go @@ -113,6 +113,18 @@ func TestTreeRemoteGetter(t *testing.T) { require.Equal(t, "id", resp.RootChange.Id) }) + t.Run("no retry request if error get tree", func(t *testing.T) { + fx := newTreeRemoteGetterFixture(t) + defer fx.stop() + mockPeer := mock_peer.NewMockPeer(fx.ctrl) + mockPeer.EXPECT().Id().AnyTimes().Return(peerId) + fx.peerGetterMock.EXPECT().GetResponsiblePeers(ctx).AnyTimes().Return([]peer.Peer{mockPeer}, nil) + fx.syncClientMock.EXPECT().CreateNewTreeRequest().AnyTimes().Return(treeRequest) + fx.syncClientMock.EXPECT().SendRequest(ctx, peerId, fx.treeGetter.treeId, treeRequest).Times(1).Return(nil, treechangeproto.ErrGetTree) + _, err := fx.treeGetter.treeRequestLoop(ctx, retryTimeout) + require.Equal(t, treechangeproto.ErrGetTree, err) + }) + t.Run("retry get peers success", func(t *testing.T) { fx := newTreeRemoteGetterFixture(t) defer fx.stop()