Browse Source

p2p: retry failed connections slightly more aggressively (backport #8010) (#8012)

pull/8036/head
mergify[bot] 2 years ago
committed by GitHub
parent
commit
a281c0bbf1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 12 deletions
  1. +6
    -4
      internal/p2p/peermanager.go
  2. +6
    -5
      internal/p2p/peermanager_test.go
  3. +3
    -3
      node/setup.go

+ 6
- 4
internal/p2p/peermanager.go View File

@ -1038,13 +1038,15 @@ func (m *PeerManager) retryDelay(failures uint32, persistent bool) time.Duration
maxDelay = m.options.MaxRetryTimePersistent
}
delay := m.options.MinRetryTime * time.Duration(math.Pow(2, float64(failures-1)))
if maxDelay > 0 && delay > maxDelay {
delay = maxDelay
}
delay := m.options.MinRetryTime * time.Duration(failures)
if m.options.RetryTimeJitter > 0 {
delay += time.Duration(m.rand.Int63n(int64(m.options.RetryTimeJitter)))
}
if maxDelay > 0 && delay > maxDelay {
delay = maxDelay
}
return delay
}


+ 6
- 5
internal/p2p/peermanager_test.go View File

@ -3,6 +3,7 @@ package p2p_test
import (
"context"
"errors"
"fmt"
"strings"
"testing"
"time"
@ -314,13 +315,14 @@ func TestPeerManager_DialNext_Retry(t *testing.T) {
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
for i := 0; i <= 5; i++ {
for i := 0; i <= 6; i++ {
start := time.Now()
dial, err := peerManager.DialNext(ctx)
require.NoError(t, err)
require.Equal(t, a, dial)
elapsed := time.Since(start).Round(time.Millisecond)
fmt.Println(elapsed, options.MinRetryTime)
switch i {
case 0:
require.LessOrEqual(t, elapsed, options.MinRetryTime)
@ -329,12 +331,11 @@ func TestPeerManager_DialNext_Retry(t *testing.T) {
case 2:
require.GreaterOrEqual(t, elapsed, 2*options.MinRetryTime)
case 3:
require.GreaterOrEqual(t, elapsed, 3*options.MinRetryTime)
case 4, 5, 6:
require.GreaterOrEqual(t, elapsed, 4*options.MinRetryTime)
case 4, 5:
require.GreaterOrEqual(t, elapsed, options.MaxRetryTime)
require.LessOrEqual(t, elapsed, 8*options.MinRetryTime)
default:
require.Fail(t, "unexpected retry")
t.Fatal("unexpected retry")
}
require.NoError(t, peerManager.DialFailed(a))


+ 3
- 3
node/setup.go View File

@ -461,10 +461,10 @@ func createPeerManager(
MaxConnected: maxConns,
MaxConnectedUpgrade: 4,
MaxPeers: 1000,
MinRetryTime: 100 * time.Millisecond,
MaxRetryTime: 8 * time.Hour,
MinRetryTime: 250 * time.Millisecond,
MaxRetryTime: 30 * time.Minute,
MaxRetryTimePersistent: 5 * time.Minute,
RetryTimeJitter: 3 * time.Second,
RetryTimeJitter: 5 * time.Second,
PrivatePeers: privatePeerIDs,
}


Loading…
Cancel
Save