}
}
-func reducedDialTimeout(max time.Duration, halfOpenLimit int, pendingPeers int) time.Duration {
- return max / time.Duration((pendingPeers+halfOpenLimit)/halfOpenLimit)
+func reducedDialTimeout(max time.Duration, halfOpenLimit int, pendingPeers int) (ret time.Duration) {
+ ret = max / time.Duration((pendingPeers+halfOpenLimit)/halfOpenLimit)
+ if ret < minDialTimeout {
+ ret = minDialTimeout
+ }
+ return
}
// Start the process of connecting to the given peer for the given torrent if
duplicateConnsAvoided.Add(1)
return
}
- dialTimeout := reducedDialTimeout(dialTimeout, me.halfOpenLimit, len(t.Peers))
+ dialTimeout := reducedDialTimeout(nominalDialTimeout, me.halfOpenLimit, len(t.Peers))
t.HalfOpen[addr] = struct{}{}
go func() {
// Binding to the listen address and dialing via net.Dialer gives
PendingPeers int
ExpectedReduced time.Duration
}{
- {dialTimeout, 40, 0, dialTimeout},
- {dialTimeout, 40, 1, dialTimeout},
- {dialTimeout, 40, 39, dialTimeout},
- {dialTimeout, 40, 40, dialTimeout / 2},
- {dialTimeout, 40, 80, dialTimeout / 3},
- {dialTimeout, 40, 4000, dialTimeout / 101},
+ {nominalDialTimeout, 40, 0, nominalDialTimeout},
+ {nominalDialTimeout, 40, 1, nominalDialTimeout},
+ {nominalDialTimeout, 40, 39, nominalDialTimeout},
+ {nominalDialTimeout, 40, 40, nominalDialTimeout / 2},
+ {nominalDialTimeout, 40, 80, nominalDialTimeout / 3},
+ {nominalDialTimeout, 40, 4000, nominalDialTimeout / 101},
} {
reduced := reducedDialTimeout(_case.Max, _case.HalfOpenLimit, _case.PendingPeers)
- if reduced != _case.ExpectedReduced {
+ expected := _case.ExpectedReduced
+ if expected < minDialTimeout {
+ expected = minDialTimeout
+ }
+ if reduced != expected {
t.Fatalf("expected %s, got %s", _case.ExpectedReduced, reduced)
}
}
)
const (
- pieceHash = crypto.SHA1
- maxRequests = 250 // Maximum pending requests we allow peers to send us.
- chunkSize = 0x4000 // 16KiB
- BEP20 = "-GT0000-" // Peer ID client identifier prefix
- dialTimeout = time.Second * 30
+ pieceHash = crypto.SHA1
+ maxRequests = 250 // Maximum pending requests we allow peers to send us.
+ chunkSize = 0x4000 // 16KiB
+ BEP20 = "-GT0000-" // Peer ID client identifier prefix
+ nominalDialTimeout = time.Second * 30
+ minDialTimeout = 5 * time.Second
)
type (
return
}
+// The size in bytes of a metadata extension piece.
func metadataPieceSize(totalSize int, piece int) int {
ret := totalSize - piece*(1<<14)
if ret > 1<<14 {